log4j向邮件发布日志

一、向邮件发送日志基本实现

  1. 配置文件

 1 ### 1.根日志配置 日志级别:DEBUG
 2 log4j.rootLogger=DEBUG,mailLog
 3 ### 输出目的地为邮件
 4 log4j.appender.mailLog=org.apache.log4j.net.SMTPAppender
 5 ### 收件人名称,多个人以逗号隔开
 6 log4j.appender.mailLog.To=xsm_1024@163.com
 7 ### 发件人
 8 log4j.appender.mailLog.From=123456@126.com
 9 ### SMTP发送认证的帐号名, 如果邮箱账号[email protected],则账号名为123456
10 log4j.appender.mailLog.SMTPUsername=123456
11 ### SMTP发送认证帐号的密码
12 log4j.appender.mailLog.SMTPPassword=*******
13 ### 是否打印调试信息,如果选true,则会输出和SMTP之间的握手等详细信息
14 log4j.appender.mailLog.SMTPDebug=false
15 ### 邮件主题
16 log4j.appender.mailLog.Subject=XXX系统产生错误日志
17 ### SMTP邮件发送服务器地址,网易为smtp.126.com或者smtp.163.com
18 log4j.appender.mailLog.SMTPHost=smtp.126.com
19 ### 邮件日志级别
20 log4j.appender.mailLog.Threshold=ERROR
21 log4j.appender.mailLog.layout=org.apache.log4j.PatternLayout
22 log4j.appender.mailLog.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n

  2. Java文件:需要jar包:发邮件:activation.jar,mail.jar以及正常打日志:commons-logging-1.1.3.jar,log4j-1.2.15.jar

 1 import org.apache.commons.logging.Log;
 2 import org.apache.commons.logging.LogFactory;
 3 
 4 public class BlogTest {
 5 
 6     /**
 7      * 得到log记录器的三种方式:
 8      *      1. 通过Log工厂:LogFactory。导包:commons-logging-1.1.3.jar, Log也是该包下的对应的类。
 9      *      2. 通过Logger的静态方法,有两种方式:导包:log4j-1.2.15.jar。
10      *          1)参数为配置的输出目的地名称appenderName(见后面配置中)
11      *          2)参数类对应为当前类的Class对象。
12      */
13     private static final Log logger = LogFactory.getLog(BlogTest.class);
14 //    private static Logger logger = Logger.getLogger("Console");
15 //    private static Logger logger = Logger.getLogger(BlogTest.class);
16 
17     public static void main(String[] args) {
18 
19         int sum = 0;
20         try {
21             for(int i = 1; i < 11; i++){
22                 sum += i;
23             }
24             logger.info("计算得出了从1加到10的和成功,计算的结果为:" + sum);
25             int dev = 1 / 0;
26         } catch (Exception e) {
27             logger.error("此处发生错误",new ArithmeticException("除0异常"));
28         }
29     }
30 }

  3)运行结果:乱码。

    

二、log4j发送邮件日志乱码解决:

  1. 标题乱码:标题在配置文件中通过 log4j.appender.mailLog.Subject=XXX系统产生错误日志 配置。

  • 如果使用eclipse开发

eclipse中开发时, java读取配置文件默认采用iso8859-1的编码去读取。而工作空间的默认编码是GBK, 或者我们可以设置成UTF-8。也就相当于是以iso8859-1的方式去读取GBK或者是UTF-8编码的文件。肯定是乱码的。因此可以借助jdk开发工具下的native2ascii.exe应用程序对配置文件重新编码。命令为:native2ascii -encoding GBK log4j.properties new.properties。再将new.properties文件中的内容复制到log4j.properties文件中即可。这里需要注意的是, 命令不是唯一的。这跟本地配置文件的编码有关。如果本地配置文件的编码格式是UTF-8, 则转换命令为:native2ascii -encoding UTF-8 log4j.properties new.properties无论什么命令,得到的结果是一样的, 都是ISO8859-1编码的文件。从网上查资料, 大多数都是native2ascii log4j.properties new.properties命令,是因为他们的配置文件是GBK格式的。本地系统也是GBK编码, 所以命令中不加编码参数默认按照本地编码格式转换。如何查看配置文件编码格式,可以通过System.out.println(System.getProperty("file.encoding"));或者是System.out.println(Charset.defaultCharset());查看如何查看本地系统默认编码呢,命令行输入chcp,可以得到活动代码页。936对应的是GBK。最终得到的iso8859-1编码的文件为: 

 1 ### 1.\u6839\u65e5\u5fd7\u914d\u7f6e \u65e5\u5fd7\u7ea7\u522b\uff1aDEBUG
 2 log4j.rootLogger=DEBUG,mailLog
 3 
 4 log4j.appender.mailLog=org.apache.log4j.net.SMTPAppender
 5 #\u6536\u4ef6\u4eba\u540d\u79f0\uff0c\u591a\u4e2a\u4eba\u4ee5\u9017\u53f7\u9694\u5f00
 6 log4j.appender.mailLog.To=xsm_1024@163.com
 7 #\u53d1\u4ef6\u4eba
 8 log4j.appender.mailLog.From=ms_1024@126.com
 9 #SMTP\u53d1\u9001\u8ba4\u8bc1\u7684\u5e10\u53f7\u540d, \u5982\u679c\u90ae\u7bb1\u8d26\[email protected],\u5219\u8d26\u53f7\u540d\u4e3a123456
10 log4j.appender.mailLog.SMTPUsername=ms_1024
11 #SMTP\u53d1\u9001\u8ba4\u8bc1\u5e10\u53f7\u7684\u5bc6\u7801
12 log4j.appender.mailLog.SMTPPassword=ms1024
13 #\u662f\u5426\u6253\u5370\u8c03\u8bd5\u4fe1\u606f\uff0c\u5982\u679c\u9009true\uff0c\u5219\u4f1a\u8f93\u51fa\u548cSMTP\u4e4b\u95f4\u7684\u63e1\u624b\u7b49\u8be6\u7ec6\u4fe1\u606f
14 log4j.appender.mailLog.SMTPDebug=false
15 #\u90ae\u4ef6\u4e3b\u9898
16 log4j.appender.mailLog.Subject=XXX\u7CFB\u7EDF\u9519\u8BEF\u65E5\u5FD7
17 #SMTP\u90ae\u4ef6\u53d1\u9001\u670d\u52a1\u5668\u5730\u5740\uff0c\u7f51\u6613\u4e3asmtp.126.com\u6216\u8005smtp.163.com
18 log4j.appender.mailLog.SMTPHost=smtp.126.com
19 #\u90ae\u4ef6\u65e5\u5fd7\u7ea7\u522b
20 log4j.appender.mailLog.Threshold=ERROR
21 log4j.appender.mailLog.layout=org.apache.log4j.PatternLayout
22 log4j.appender.mailLog.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n

再次运行程序得到结果:(标题乱码已经解决)

  • 如果是使用idea开发, 那问题就简单多了:

    在setting --》 Editor --》File Encodings 最下面有个Default encoding for properties files, 后面还有个Transparent native-to-ascii conversion,只要后面这个框勾选了的话idea会自动的帮助去转换成iso8859-1格式的文件。

    可以尝试下, 在这个框勾选了的前提下,无论前面Default encoding for properties files设置什么编码。当编写好配置文件后, 如果取消勾选这个框点击apply, 那么显示的配置文件就是iso8859-1格式的配置文件了。

    当然, 如果最开始没有勾选, 就编写了配置文件, 那这时候的情况始跟eclipse是一样的, 可以使用jdk工具转换成iso8859-1格式的配置文件。 也可以剪切出来, 勾选上Transparent native-to-ascii conversion这个框再复制回去。

  2. 日志内容乱码:日志内容就是通过java文件打出的日志,如果是汉语, 则发送到邮件中是乱码。  

  • 造成源码原因:

配置文件中设置输出目的地为邮件,对应的处理类为(org.apache.log4j.net.SMTPAppender), 查看SMTPAppender.class源码可以发现, 在设置内容时(part.setContent(sbuf.toString(), super.layout.getContentType());)从layout中获取了ContenType,这个ContentType默认为"text/plain",而我本地系统使用的时GBK,因此需要重新定义Layout布局, 重写getContentType方法。再在配置文件中给出输出布局为自定义的这个Layout。

  • 解决:指定返回字符集为GBK, 我见网上都是这么说的, 也是没有明白具体的原因, 我猜应该时本地系统使用GBK编码,所以返回字符集为GBK, 如果不是这个原因, 希望能给出纠正。

新增布局类, 继承PatternLayout,重写getContentType方法。

1 package com.mylog4j.blog;
2 import org.apache.log4j.PatternLayout;
3 public class MyLayout extends PatternLayout {
4     @Override
5     public String getContentType() {
6         return "text/html;charset=GBK";
7     }
8 }

修改配置文件:输出目的地布局:log4j.appender.mailLog.layout=com.mylog4j.blog.MyLayout

  • 效果:

    

猜你喜欢

转载自www.cnblogs.com/xuesm/p/9398239.html