zoukankan      html  css  js  c++  java
  • 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=Log4Ju63d0u9192u60a8uff1au7cfbu7edfu53d1u751fu4e86u4e25u91cdu9519u8bef

    二、 正文乱码 
            正文乱码,解决也比较简单。阅读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";     
        }
  • 相关阅读:
    docker知识3---镜像
    docker知识2---docker简介
    docker知识1---容器背景
    docker故障排查
    linux故障处理--ssh故障
    sqlalchemy的一行代码更新数据库
    Python内置函数和高阶函数(map,filter,reduce, sorted,enumerate, zip,单行条件语句 )
    Mysql略复杂命令总结
    pip的使用
    Linux的基础命令
  • 原文地址:https://www.cnblogs.com/from/p/4186493.html
Copyright © 2011-2022 走看看