一、向邮件发送日志基本实现
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
- 效果: