当你决定了方向,勇气可以带你走得更远。

Log4j 发送 EMail 的配置

  项目上线后,运行时往往也还会有异常发生,在异常抛出时,希望即时的得到反馈。所以需要配置LOG4J的发送EMAIL功能。

      项目中原来使用的的Log4j版本为1.2.9 ,但此版本并不支持邮件服务的认证功能 ,遂重新下载了最新的版本1.2.14 ,查看源代码
此版本支持认证功能 ,下面是 log4j.properties 的具体配置 :

 ## ROOT
log4j.rootLogger=INFO,CONSOLE,A_default,MAIL

## CONSOLE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=INFO
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
#log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
log4j.appender.CONSOLE.layout.ConversionPattern=[调试信息]%-5p %c %x - %m%n

## A_default
log4j.appender.A_default=org.apache.log4j.RollingFileAppender
log4j.appender.A_default.Threshold=INFO
log4j.appender.A_default.File=${webframe.root}/WEB-INF/logs/railstone.log
log4j.appender.A_default.MaxFileSize=4000KB
log4j.appender.A_default.MaxBackupIndex=10
log4j.appender.A_default.layout=org.apache.log4j.PatternLayout
log4j.appender.A_default.layout.ConversionPattern=[调试信息]%-5p %c %x - %m%n

## MAIL
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
# 日志的错误级别
log4j.appender.MAIL.Threshold=ERROR 
# 缓存文件大小,日志达到512K时发送Email
log4j.appender.MAIL.BufferSize=512
# 发送邮件的服务器
log4j.appender.MAIL.SMTPHost=smtp.163.com
# 邮件的标题
log4j.appender.MAIL.Subject=Log4J ErrorMessage
# 用户名
log4j.appender.MAIL.SMTPUsername=邮箱用户名
# 密码
log4j.appender.MAIL.SMTPPassword=邮箱密码
# 发件人地址
log4j.appender.MAIL.From=test@163.com 
# 日志邮件的接收者
log4j.appender.MAIL.To=test@163.com 
# 日志PatternLayout
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
# 日志的格式
log4j.appender.MAIL.layout.ConversionPattern=[ErrorMessage ] %d - %c -%-4r [%t] %-5p %c %x - %m%n

在配置完毕后,发现 即使是将 log4j.appender.MAIL.Threshold=ERROR 修改为 INFO 级别 ,也只有在日志输出级别为 ERROR (即代码中调用logger.error("message")方法)时才会发送邮件,不知道是什么原因,

 

Log4J发日志邮件给多个接收者及标题、正文乱码问题

 

利用javamail发送邮件,你需要导入包mail.jar和activation.jar这两个包 ,否则是没法发邮件的 ,下边配置文件里绿色行显示的就是发给两个接收者ac和ae。

       这里会出现中文乱码问题,主要有两方面的乱码,一是标题乱码;二是正文乱码。下边具体说明这两种乱码的解决方案。 
一、 标题乱码 
Log4J日志邮件的标题在配置文件log4j.properties里设定,如下 
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender 
log4j.appender.MAIL.Threshold=FATAL 
log4j.appender.MAIL.BufferSize=10 
log4j.appender.MAIL.From=ab@163.com 
log4j.appender.MAIL.SMTPHost=smtp@163.com 
log4j.appender.MAIL.Subject= Log4J提醒您:系统发生了严重错误 
log4j.appender.MAIL.To=ac @163.com,ae@163.com 
log4j.appender.MAIL.layout=com.sun.DefineLayOut 
log4j.appender.MAIL.layout.LocationInfo=true


       灰色的行就是标题,log4J配置文件默认的读取方式是ISO-88591,遇到中文会出现乱码,我们可以把这个配置文件log4j.properties用jdk的工具native2asii转换一下编码方式。 
命令:native2asii log4j.properties log4jxx.properties 
把这个log4jxx.properties改名为log4j.properties取代原来的log4j.properties就ok了。 
灰色行重新编码后是: 
log4j.appender.MAIL.Subject=Log4J\u63d0\u9192\u60a8\uff1a\u7cfb\u7edf\u53d1\u751f\u4e86\u4e25\u91cd\u9519\u8bef

二、 正文乱码 
        正文乱码,解决也比较简单。阅读Log4J的源码类SMTPAppender,我们可以发现sendBuffer()方法中有这样一句: 
part.setContent(sbuf.toString(), layout.getContentType()); 
我们继续追踪发现layout就是配置文件里的layout属性对应的布局模式。但是这些布局模式都是继承自Layout,而contentType是只 可通过getContentType方法取得,不能修改。所有的布局模式getContentType方法返回的都是”text/plain”; 
为处理中文乱码,我们可以写一个布局模式。如果你要使用HTMLLayout,我们就写一个HTMLLayout的子类,覆盖HTMLLayout的 getContentType方法即可。假如我要用org.apache.log4j.HTMLLayout。我们就可以写一个DefineLayOut 类,代码如下: 
package com.sun; 

import org.apache.log4j.HTMLLayout; 
public class DefineLayOut extends HTMLLayout{ 
public String getContentType() { 
return "text/html;charset=GBK"; 


对应的配置文件设置如黄色行所示。

来源:http://jlk.iteye.com/blog/354216

 

 

 

 

 

 

 

 

配置方式2:  

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
#发送邮件的邮箱帐号
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.xxx
log4j.appender.MAIL.To=xxx@xxx.com
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类,覆盖里面的一个方法: 

1 @Override   
2 public  boolean isTriggeringEvent(LoggingEvent arg0) {    
3         return arg0.getLevel().isGreaterOrEqual(Level.INFO);    
4     }

SMTPAppender 实现是,每当isTriggeringEvent()这个方法返回true的时候,它都会发送邮件。这样的话,一个程序执行下来,每个有能力触发的事件都会形成一封邮件。 
事件的个数达到bufferSize的一半的时候就会发一封邮件: 
继承了SMTPAppender类,重写了append方法 ;

 1 @Override   
 2     public void append(LoggingEvent event) {      
 3         if (!checkEntryConditions()) {    
 4             return;    
 5         }       
 6         event.getThreadName();    
 7         event.getNDC();    
 8         event.getMDCCopy();    
 9         if (this.getLocationInfo()) {    
10             event.getLocationInformation();    
11         }    
12         cb.add(event);    
13         if (evaluator.isTriggeringEvent(event)) {    
14             if (cb.length() > this.getBufferSize() / 2) {    
15                 sendBuffer();    
16             }      
17         }    
18     }  

另外一个问题也随之产生了,当程序结束时,还在缓冲里面的事件是不会被发送出来的。因为事件数往往没有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";     
    }

 

posted @ 2014-12-26 13:16  froom  阅读(1252)  评论(0编辑  收藏  举报