引入log4j.jar包,这里解释一下三个包的关系:
slf4j-api 本质就是一个接口定义
slf4j-log4j12 是链接slf4j-api和log4j中间的适配器。它实现了slf4j-api中StaticLoggerBinder接口,从而使得在编译时绑定的是slf4j-log4j12的getSingleton()方法
log4j 是具体的日志系统。通过slf4j-log4j12初始化Log4j,达到最终日志的输出。
slf4j和log4j经常存在冲突的现在,需要在网上下载对应的版本,以下为无冲突的版本实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.16</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.5</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.5</version> </dependency>
|
log4j.properties文件配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| log4j.rootLogger=INFO,stdout,R #输出到控制台 log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %5p [%F:%L] : %m%n #输出到日志文件 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender #日志文件只输出WARN级别以上的日志 log4j.appender.R.Threshold=ERROR #日志文件输出路径 log4j.appender.R.File=/usr/local/tomcat7/logs/web/xxx.log #日志输出格式 log4j.appender.R.DatePattern='.'yyyy-MM-dd log4j.appender.R.Append=true log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=[%-5p][%d{yyyyMMdd HH:mm:ss,SSS}][%C{1}:%L] %m%n
|
如果需要利用日志发送邮件,添加activation.jar、mail.jar两个包
1 2 3 4 5 6 7 8 9 10 11
| <dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version> </dependency> <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.1</version> </dependency>
|
然后配置文件中加入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| #log4j的邮件发送appender log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender #发送邮件的门槛,仅当等于或高于ERROR(比如FATAL)时,邮件才被发送 log4j.appender.MAIL.Threshold=ERROR #缓存文件大小,日志达到1000k时发送Email,但如果是ERROR或FATAL则立即发送 log4j.appender.MAIL.BufferSize=1024KB #此处发送邮件的邮箱帐号 log4j.appender.MAIL.From=发送者的邮箱地址,比如xxxemail@163.com #SMTP邮件发送服务器地址(这里以网易邮箱举例,比如谷歌就会是smtp.gmail.com) log4j.appender.MAIL.SMTPHost=smtp.163.com #SMTP发送认证的帐号名,邮箱的名称(不包含@163.com后面的信息) log4j.appender.MAIL.SMTPUsername=xxxemail #SMTP发送认证帐号的密码,邮箱的密码 log4j.appender.MAIL.SMTPPassword=发送者的邮箱密码,比如123456789 #是否打印调试信息,如果选true,则会输出和SMTP之间的握手等详细信息 log4j.appender.MAIL.SMTPDebug=true #邮件主题 log4j.appender.MAIL.Subject=xxx项目错误日志 #发送到什么邮箱,如果要发送给多个邮箱,则用逗号分隔; log4j.appender.MAIL.To=xxx1@qq.com,xxx2@163.com,xxx3@gmail.com #日志格式 log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout log4j.appender.MAIL.layout.ConversionPattern=[framework]%d - %c -%-4r[%t]%-5p %c %x -%m%n
|
如果顺利的话可以正常的发送,但可能会有特殊情况,比如标题乱码(也可能是版本低了),则可以重写 SMTPAppender
看到配置中log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender这一句,这里就是 log4j 输出的控制类,如果有其它个性化的定制,比如认证信息的处理等,都是通过重写SMTPAppender来实现。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| import java.io.UnsupportedEncodingException; import org.apache.log4j.net.SMTPAppender; public class EncodingSMTPAppender extends SMTPAppender { @Override public void setSubject(String subject) { try { subject = new String(subject.getBytes("iso8859-1"), "utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } super.setSubject(subject); } }
|
还有一个最常见的错误,配置完后发现若发送邮件失败 log4j: ERROR Error occured while sending e-mail notification.则是发送的邮箱没有开启stmp服务
像网易邮箱默认是没有开启smtp服务的,进入 邮箱-设置-POP3/SMTP/IMAP 中,把POP3/SMTP服务和IMAP/SMTP服务都勾选上