博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
log4j发送邮件乱码
阅读量:6371 次
发布时间:2019-06-23

本文共 11239 字,大约阅读时间需要 37 分钟。

以前开发的系统没有单独的日志管理,所有的日志统一输出到tomcat后台一个文件里,不几天就是好几G,现在要整体增加一个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.Subject= Log4J提醒您:系统发生了严重错误 
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"; 
对应的配置文件设置如黄色行所示。

附自定义html输出格式代码

FormatHTMLLayout类
package com.spike.test;import java.text.SimpleDateFormat;import org.apache.log4j.HTMLLayout;import org.apache.log4j.Layout;     import org.apache.log4j.Level;     import org.apache.log4j.helpers.Transform;     import org.apache.log4j.spi.LocationInfo;     import org.apache.log4j.spi.LoggingEvent;     public class FormatHTMLLayout extends HTMLLayout {    public FormatHTMLLayout() {       }           public String getContentType() {         return "text/html;charset=GBK";         }      protected final int BUF_SIZE = 256;         protected final int MAX_CAPACITY = 1024;         static String TRACE_PREFIX = "
    "; private StringBuffer sbuf = new StringBuffer(BUF_SIZE); String title="AAA"; /** * A string constant used in naming the option for setting the the HTML * document title. Current value of this string constant is Title. */ public static final String TITLE_OPTION = "Title"; // Print no location info by default boolean locationInfo = true; public String format(LoggingEvent event) { if (sbuf.capacity() > MAX_CAPACITY) { sbuf = new StringBuffer(BUF_SIZE); } else { sbuf.setLength(0); } sbuf.append(Layout.LINE_SEP + "" + Layout.LINE_SEP); sbuf.append(""); sbuf.append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS").format(new java.util.Date())); sbuf.append("" + Layout.LINE_SEP); sbuf.append(""); if (event.getLevel().equals(Level.FATAL)) { sbuf.append(""); sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel()))); sbuf.append(""); } else if (event.getLevel().isGreaterOrEqual(Level.WARN)) { sbuf.append(""); sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel()))); sbuf.append(""); } else { sbuf.append(""); sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel()))); sbuf.append(""); } sbuf.append("" + Layout.LINE_SEP); if (locationInfo) { LocationInfo locInfo = event.getLocationInformation(); sbuf.append(""); sbuf.append(locInfo.getClassName()); sbuf.append('.'); sbuf.append(locInfo.getMethodName()); sbuf.append('('); sbuf.append(Transform.escapeTags(locInfo.getFileName())); sbuf.append(':'); sbuf.append(locInfo.getLineNumber()); sbuf.append(')'); sbuf.append("" + Layout.LINE_SEP); } sbuf.append(""); sbuf.append(Transform.escapeTags(event.getRenderedMessage())); sbuf.append("" + Layout.LINE_SEP); sbuf.append("" + Layout.LINE_SEP); if (event.getNDC() != null) { sbuf.append(""); sbuf.append("NDC: " + Transform.escapeTags(event.getNDC())); sbuf.append("" + Layout.LINE_SEP); } String[] s = event.getThrowableStrRep(); if (s != null) { sbuf.append(""); appendThrowableAsHTML(s, sbuf); sbuf.append("" + Layout.LINE_SEP); } return sbuf.toString(); } private void appendThrowableAsHTML(String[] s, StringBuffer sbuf) { if (s != null) { int len = s.length; if (len == 0) return; sbuf.append(Transform.escapeTags(s[0])); sbuf.append(Layout.LINE_SEP); for (int i = 1; i < len; i++) { sbuf.append(TRACE_PREFIX); sbuf.append(Transform.escapeTags(s[i])); sbuf.append(Layout.LINE_SEP); } } } /** * Returns appropriate HTML headers. */ public String getHeader() { StringBuffer sbuf = new StringBuffer(); sbuf.append("" + Layout.LINE_SEP); sbuf.append("" + Layout.LINE_SEP); sbuf.append("" + Layout.LINE_SEP); sbuf.append("" + title + "" + Layout.LINE_SEP); sbuf.append("" + Layout.LINE_SEP); sbuf.append("" + Layout.LINE_SEP); sbuf.append("" + Layout.LINE_SEP); sbuf.append("
" + Layout.LINE_SEP); sbuf.append("
" + Layout.LINE_SEP); sbuf.append("
" + Layout.LINE_SEP); sbuf.append("
" + Layout.LINE_SEP); if (locationInfo) { sbuf.append("
" + Layout.LINE_SEP); } sbuf.append("
" + Layout.LINE_SEP); sbuf.append("
" + Layout.LINE_SEP); sbuf.append("" + Layout.LINE_SEP); return sbuf.toString(); } }
执行时间 级别 所在行 消息
MailEvaluator类:
package com.spike.test;import org.apache.log4j.Layout;import org.apache.log4j.spi.LoggingEvent;public class MailEvaluator extends Layout {    StringBuffer sbuf;      @Override        public String getContentType()       {             return "text/html;charset=GBK";      }      public MailEvaluator() {          sbuf = new StringBuffer(128);      }          @Override    public void activateOptions() {        // TODO Auto-generated method stub    }    @Override    public String format(LoggingEvent event) {        // TODO Auto-generated method stub        sbuf.setLength(0);          sbuf.append("错误等级:"+event.getLevel().toString()+"===");          sbuf.append("错误原因:"+event.getMessage().toString()+"===");          sbuf.append("错误所在类"+event.getLocationInformation().getClassName()+"===");          sbuf.append("错误方法所在:"+event.getLocationInformation().getMethodName()+"===");          sbuf.append("错误行:"+event.getLocationInformation().getLineNumber());          return sbuf.toString();      }    @Override    public boolean ignoresThrowable() {        // TODO Auto-generated method stub        return false;    }}

DefineLayOut类

package com.spike.test;import org.apache.log4j.HTMLLayout;public class DefineLayOut extends HTMLLayout {    public String getContentType() {         return "text/html;charset=GBK";         } }
配置文件:log4j.properties
log4j.rootLogger=DEBUG,MAIL,A1log4j.addivity.org.apache=true# 每天新建日志#(警告的意思是DailyRollingFileAppender这个类不带属性maxBackupIndex,maxFileSize的,它是#按日期来保存日志的,所以不需要设置该2个属性,如果想要设置日志文件的大小,可以使用#RollingFileAppender这个类,平时开发中日志配置文件中需要注意设置。)log4j.appender.A1=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.A1.File=./logs/cebLog.txtlog4j.appender.A1.Encoding=GBKlog4j.appender.A1.Threshold=DEBUGlog4j.appender.A1.DatePattern='.'yyyy-MM-ddlog4j.appender.A1.layout=org.apache.log4j.PatternLayout#log4j.appender.A1.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{
1}:%L : %m%n#log4j.appender.A1.layout.ConversionPattern=/n/n[%-5p] %d{yyyy-MM-dd HH\:mm\:ss,SSS} method\:%l%n%m%nlog4j.appender.A1.layout.ConversionPattern=%d %-5p %c.%M:%L - %m%n # 发送日志给邮件log4j.appender.MAIL=org.apache.log4j.net.SMTPAppenderlog4j.appender.MAIL.Threshold=ERRORlog4j.appender.MAIL.BufferSize=10# 发件人地址log4j.appender.MAIL.From=xxxx@126.com# 发送邮件的服务器log4j.appender.MAIL.SMTPHost=smtp.126.com# 邮件的标题#log4j.appender.MAIL.Subject=Log4J ErrorMessage#log4j.appender.MAIL.Subject= Log4J提醒您:系统发生了严重错误 log4j.appender.MAIL.Subject=Log4J error # 用户名log4j.appender.MAIL.SMTPUsername=xxxx# 密码log4j.appender.MAIL.SMTPPassword=xxxx# 日志邮件的接收者##发送到什么邮箱,如果要发送给多个邮箱,则用逗号分隔;log4j.appender.MAIL.To=xxxx@qq.com##如果需要抄送Cc给某人,则加入下列行:#log4j.appender.MAIL.Cc=xxxx@qq.com#是否打印调试信息,如果选true,则会输出和SMTP之间的握手等详细信息 log4j.appender.MAIL.SMTPDebug=true#log4j.appender.MAIL.SMTPDebug=false#log4j.appender.MAIL.layout=org.apache.log4j.HTMLLayout#log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout#log4j.appender.MAIL.layout.ConversionPattern=%d %-5p [%c] %m%n#日志显示格式 #log4j.appender.MAIL.layout=com.spike.test.MailEvaluator#log4j.appender.MAIL.layout.ConversionPattern==%d{yyyy-MM-dd HH:mm:ss} - %c -%-4r [%t] %-5p %c %x - %m %l%n #log4j.appender.MAIL.layout=com.spike.test.DefineLayOut#HTMLLayout 类重写,根据自身需要输出不同列#参考http://blog.csdn.net/drift_away/article/details/7410038,不过此文有问题log4j.appender.MAIL.layout=com.spike.test.FormatHTMLLayout #log4j.appender.MAIL.layout=org.apache.log4j.HTMLLayout #log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout #log4j.appender.MAIL.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n

 配置文件:log4j.xml

log4j.properties和log4j.xml都存在会优先读取log4j.xml。

你可能感兴趣的文章
加载qml文件时涉及的路径问题
查看>>
借助全新 MATLAB® 适配器代码示例读取英特尔® 实感™ 摄像头数据流
查看>>
developerWorksJava technologyTechnical libraryMerlin brings nonblocking I/O to the Java platform
查看>>
js 前端向服务器端传送文件的常用请求方式
查看>>
不要伤害指针(6)--指针的安全问题
查看>>
修复lsp,360浏览器可以上网其它软件不行
查看>>
【洛谷4016】 负载平衡问题(网络流24题,最小费用最大流)
查看>>
Android高手的六大境界
查看>>
【转】Netty那点事(三)Channel中的Pipeline
查看>>
Invalidate()和UpdateAllViews()
查看>>
js正则表达式:验证邮箱格式、密码复杂度、手机号码、QQ号码
查看>>
hybris 异步另起线程
查看>>
centos7 安装mariadb最新版并配置
查看>>
视频会议管理系统操作步骤(新)
查看>>
64位sql server2005安装
查看>>
CF1003D Coins and Queries 贪心
查看>>
POJ2084 Game of Connections 卡特兰数 关于卡特兰数经典的几个问题
查看>>
ASP.NET Core使用静态文件、目录游览与MIME类型管理
查看>>
Longest Palindromic Substring
查看>>
hive2.3.2安装使用
查看>>