首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Log4j发送日记邮件功能

2012-11-19 
Log4j发送日志邮件功能Log4j发送日志邮件的作用:项目错误信息能及时(实时)反映给项目维护人员以及相关负责

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,如果有必要你可以写自己的appenderlog4j.appender.MAIL=org.apache.log4j.net.SMTPAppender#发送邮件的门槛,仅当等于或高于ERROR(比如FATAL)时,邮件才被发送log4j.appender.MAIL.Threshold=ERROR#缓存文件大小,日志达到10k时发送Emaillog4j.appender.MAIL.BufferSize=10#发送邮件的邮箱帐号log4j.appender.MAIL.From=xxx@163.com#SMTP邮件发送服务器地址log4j.appender.MAIL.SMTPHost=smtp.163.com#SMTP发送认证的帐号名log4j.appender.MAIL.SMTPUsername=xxx@163.com#SMTP发送认证帐号的密码log4j.appender.MAIL.SMTPPassword=xxx#是否打印调试信息,如果选true,则会输出和SMTP之间的握手等详细信息log4j.appender.MAIL.SMTPDebug=false#邮件主题log4j.appender.MAIL.Subject=Log4JErrorMessage#发送到什么邮箱,如果要发送给多个邮箱,则用逗号分隔;#如果需要发副本给某人,则加入下列行#log4j.appender.MAIL.Bcc=xxx@xxx.xxxlog4j.appender.MAIL.To=xxx@xxx.comlog4j.appender.MAIL.layout=org.apache.log4j.PatternLayoutlog4j.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";         }


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

热点排行