一、向邮件发送日志基本实现
1. 配置文件
1 ### 1.根日志配置 日志级别:DEBUG2 log4j.rootLogger=DEBUG,mailLog3 ### 输出目的地为邮件
4log4j.appender.mailLog=org.apache.log4j.net.SMTPAppender5 ### 收件人名称,多个人以逗号隔开6 log4j.appender.mailLog.To=xsm_1024@163.com7### 发件人
8log4j.appender.mailLog.From=123456@126.com9 ### SMTP发送认证的帐号名, 如果邮箱账号123455@125.com,则账号名为12345610 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.com18 log4j.appender.mailLog.SMTPHost=smtp.126.com19 ### 邮件日志级别20 log4j.appender.mailLog.Threshold=ERROR21 log4j.appender.mailLog.layout=org.apache.log4j.PatternLayout22 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 importorg.apache.commons.logging.Log;2 importorg.apache.commons.logging.LogFactory;3
4 public classBlogTest {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 voidmain(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.propertiesnew.properties。再将new.properties文件中的内容复制到log4j.properties文件中即可。这里需要注意的是, 命令不是唯一的。这跟本地配置文件的编码有关。如果本地配置文件的编码格式是UTF-8, 则转换命令为:native2ascii -encoding UTF-8 log4j.propertiesnew.properties。无论什么命令,得到的结果是一样的, 都是ISO8859-1编码的文件。从网上查资料, 大多数都是native2ascii log4j.propertiesnew.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\uff1aDEBUG2 log4j.rootLogger=DEBUG,mailLog3
4 log4j.appender.mailLog=org.apache.log4j.net.SMTPAppender5#\u6536\u4ef6\u4eba\u540d\u79f0\uff0c\u591a\u4e2a\u4eba\u4ee5\u9017\u53f7\u9694\u5f006 log4j.appender.mailLog.To=xsm_1024@163.com7 #\u53d1\u4ef6\u4eba8 log4j.appender.mailLog.From=ms_1024@126.com9 #SMTP\u53d1\u9001\u8ba4\u8bc1\u7684\u5e10\u53f7\u540d, \u5982\u679c\u90ae\u7bb1\u8d26\u53f7123455@125.com,\u5219\u8d26\u53f7\u540d\u4e3a12345610 log4j.appender.mailLog.SMTPUsername=ms_102411 #SMTP\u53d1\u9001\u8ba4\u8bc1\u5e10\u53f7\u7684\u5bc6\u780112 log4j.appender.mailLog.SMTPPassword=ms102413 #\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\u606f14 log4j.appender.mailLog.SMTPDebug=false
15 #\u90ae\u4ef6\u4e3b\u989816 log4j.appender.mailLog.Subject=XXX\u7CFB\u7EDF\u9519\u8BEF\u65E5\u5FD717 #SMTP\u90ae\u4ef6\u53d1\u9001\u670d\u52a1\u5668\u5730\u5740\uff0c\u7f51\u6613\u4e3asmtp.126.com\u6216\u8005smtp.163.com18 log4j.appender.mailLog.SMTPHost=smtp.126.com19 #\u90ae\u4ef6\u65e5\u5fd7\u7ea7\u522b20log4j.appender.mailLog.Threshold=ERROR21 log4j.appender.mailLog.layout=org.apache.log4j.PatternLayout22 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 packagecom.mylog4j.blog;2 importorg.apache.log4j.PatternLayout;3 public class MyLayout extendsPatternLayout {4 @Override5 publicString getContentType() {6 return "text/html;charset=GBK";7 }8 }
修改配置文件:输出目的地布局:log4j.appender.mailLog.layout=com.mylog4j.blog.MyLayout
效果: