Log4j发送日志邮件功能

阅读更多
Log4j发送日志邮件的作用:
      项目错误信息能及时(实时)反映给项目维护人员以及相关负责人。

优点:
      1.快速响应;
      2.共同监督;
      3.邮件正文直接显示了错误信息,拷贝信息比登陆服务器再查找要方便;
      4.在日志信息继续写入文件的前提下,多了另外一种获取信息的渠道。

补充:Log4j可以实现输出到控制台,文件,回滚文件,发送日志邮件,数据库,自定义标签。
发送邮件的一个重要的类是SMTPAppender,之前用的是 log4j-1.2.8,在1.2.8的版本中,SMTPAppender没有SMTPPassword 和SMTPUsername 属性。这两个属性分别是登录SMTP服务器发送认证的用户名和密码。

依赖的jar包:
log4j-1.2.15.jar(版本低于log4j-1.2.14.jar不支持SMTP认证)
mail.jar
activation.jar


在log4j.properties文件中配置:
### send error through email.
#log4j的邮件发送appender,如果有必要你可以写自己的appender
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
#发送邮件的门槛,仅当等于或高于ERROR(比如FATAL)时,邮件才被发送
log4j.appender.MAIL.Threshold=ERROR
#缓存文件大小,日志达到10k时发送Email
log4j.appender.MAIL.BufferSize=10
#发送邮件的邮箱帐号
[email protected]
#SMTP邮件发送服务器地址
log4j.appender.MAIL.SMTPHost=smtp.163.com
#SMTP发送认证的帐号名
[email protected]
#SMTP发送认证帐号的密码
log4j.appender.MAIL.SMTPPassword=xxx
#是否打印调试信息,如果选true,则会输出和SMTP之间的握手等详细信息
log4j.appender.MAIL.SMTPDebug=false
#邮件主题
log4j.appender.MAIL.Subject=Log4JErrorMessage
#发送到什么邮箱,如果要发送给多个邮箱,则用逗号分隔;
#如果需要发副本给某人,则加入下列行
#[email protected]
[email protected]
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=[framework]%d - %c -%-4r[%t]%-5p %c %x -%m%n


Log4j的SMTP的级别默认是ERROR级别
默认是ERROR级别,那就是说,只有程序出错了,才可以收到邮件。不过可以自定义的级别,继承TriggeringEventEvaluator类,覆盖里面的一个方法:
@Override   
public  boolean isTriggeringEvent(LoggingEvent arg0) {    
        return arg0.getLevel().isGreaterOrEqual(Level.INFO);    
    }


SMTPAppender 实现是,每当isTriggeringEvent()这个方法返回true的时候,它都会发送邮件。这样的话,一个程序执行下来,每个有能力触发的事件都会形成一封邮件。
事件的个数达到bufferSize的一半的时候就会发一封邮件:
继承了SMTPAppender类,重写了append方法
@Override   
    public void append(LoggingEvent event) {      
        if (!checkEntryConditions()) {    
            return;    
        }       
        event.getThreadName();    
        event.getNDC();    
        event.getMDCCopy();    
        if (this.getLocationInfo()) {    
            event.getLocationInformation();    
        }    
        cb.add(event);    
        if (evaluator.isTriggeringEvent(event)) {    
            if (cb.length() > this.getBufferSize() / 2) {    
                sendBuffer();    
            }      
        }    
    }  


另外一个问题也随之产生了,当程序结束时,还在缓冲里面的事件是不会被发送出来的。因为事件数往往没有bufferSize的一半。
public   *****SMTPAppender() {    
        Runtime.getRuntime().addShutdownHook(new Thread() {      
            @Override   
            public void run() {    
                if (cb.length() > 0) {    
                    sendBuffer();    
                }      
            }      
        });    
    }  



log4j有网页格式的输出:
log4j.appender.MAIL.layout=org.apache.log4j.HTMLLayout  

解决邮件中的中文乱码问题,继承HTMLLayout,覆盖getContentType方法
@Override   
    public String getContentType() {    
        return "text/html;charset=GBK";     
    }


此文为网络摘自,有任何问题大家都可以批评指正。

你可能感兴趣的:(log4j,Apache,XML,C,C++)