Log4j
0:导入jar包及log4j.properties配置文件
1:log4j 格式详解
1.1:日志级别
log4j.rootLogger=,
日志级别:ALL<DEBUG<INFO<WARN<ERROR<FATAL<OFF,不区分大小写
CONSOLE:控制台
注意,需在控制台输入,只需将其中一个appender定义为stdout即可
注意,rootLogger默认是对整个工程生效
注意,如果只想对某些包操作,那么:log4j.logger.com.hutu=info, stdout,表示该日志对package com.hutu生效
注意,这样做可以区分dev/线上,也可以减小性能影响:if(log.isDebugEnabled()){log.debug();}
注意,如果末尾为R,则以、隔开。如log4j.rootLogger=ERROR、WARN、INFO、DEBUG,R
注意,如果没有为R,则以,隔开。如log4j.rootLogger=ERROR,WARN,INFO,stdout
1.2:日志输出类型
log4j.appender.appender1 = org.apache.log4j.[控制台|文件|每天日志文件|按文件大小创建|...]
1.2.1:ConsoleAppender(控制台)
? Threshold=WARN:指定日志消息的输出最低层次。
? ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
? Target=System.err:默认情况下是:System.out,指定输出控制台
1.2.2:FileAppender(文件)
? Threshold=WARN:指定日志消息的输出最低层次。
? ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
? File=mylog.txt:指定消息输出到mylog.txt文件。
? Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
1.2.3:DailyRollingFileAppender(每天产生一个日志文件)
? Threshold=WARN:指定日志消息的输出最低层次。
? ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
? File=mylog.txt:指定消息输出到mylog.txt文件。
? Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
? DatePattern=’.‘yyyy-ww:每周滚动一次文件,即每周产生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下:
1)’.‘yyyy-MM: 每月
2)’.‘yyyy-ww: 每周
3)’.‘yyyy-MM-dd: 每天
4)’.‘yyyy-MM-dd-a: 每天两次
5)’.‘yyyy-MM-dd-HH: 每小时
6)’.‘yyyy-MM-dd-HH-mm: 每分钟
1.2.4:RollingFileAppender(文件大小到达指定尺寸时产生一个新的文件)
? Threshold=WARN:指定日志消息的输出最低层次。
? ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
? File=mylog.txt:指定消息输出到mylog.txt文件。
? Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
? MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。
? MaxBackupIndex=2:指定可以产生的滚动文件的最大数。
1.2.5:WriteAppender(将日志信息以流格式发送到任意指定的地方)
1.2.6:JDBCAppender(将日志信息保存到数据库中)
配置参数详见<使用场景 2.4>
1.2.7:JDBCAppender(将日志发送到邮箱)
配置参数详见<使用场景 2.3>
1.3:日志输出路径
log4j.appender.appender1.File=[下列参考]
#0:绝对路径:f:/logs/backup.log
#1:相对路径${user.home}/logs/backup.log
#2:相对路径:/logs/backup.log
#3:发布到Tomcat下后的相对路径:${catalina.home}/webapps/项目名称/logs/backup.log,
#4:直接在tomcat/bin/startup.bat启动,根路径开始为tomcat/bin目录)
1.4:日志布局格式
log4j.appender.appender1.layout=org.apache.log4j.[HTMLLayout | SimpleLayout | TTCCLayout]
? HTMLLayout(以HTML表格形式布局)
? SimpleLayout(包含日志信息的级别和信息字符串)
? TTCCLayout(包含日志产生的时间,执行绪,类别等信息)
? PatternLayout(可以灵活的指定布局格式,常用)
1.5:日志输出格式
log4j.appender.appender1.layout.ConversionPattern=[下列参考]
例如,%d - %m%n或%d{yyyy-MM-dd HH:mm:ss} %p [%c] %m%n
%c 输出日志信息所属的类的全名
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy-M-dd HH:mm:ss },输出类似:2002-10-18- 22:10:28
%f 输出日志信息所属的类的类名
%l 输出日志事件的发生位置,即输出日志信息的语句处于它所在的类的第几行
%m 输出代码中指定的信息,如log(message)中的message
%n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL。如果是调用debug()输出的,则为DEBUG,依此类推
%r 输出自应用启动到输出该日志信息所耗费的毫秒数
%t 输出产生该日志事件的线程名
可参考:http://blog.sina.com.cn/s/blog_4e4dd5570100qowy.html
1.6:其他配置
log4j.logger.org.springframework=OFF
log4j.logger.org.apache.struts2=OFF
log4j.logger.com.opensymphony.xwork2=OFF
log4j.rootLogger=INFO,Error,stdout #将c3p0的日志信息关闭,但要求将所有R改为stdout!
可参考
http://blog.csdn.net/projava/article/details/7344839
1.7:总结一下:
Logger类:完成日志记录,设置日志信息级别
Appender类:决定日志去向,终端、DB、硬盘
Layout类:决定日志输出的样式,例如包含当前线程、行号、时间
2:使用场景
2.1:按日期产生日志文件
#设置日志的级别 ,多个以、分开(没有给出的,则不会被输出) log4j.rootLogger=ERROR、WARN、INFO、DEBUG,R #DailyRollingFileAppender每天产生一个日志文件 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender #设置日志文件保存路径 log4j.appender.R.File=log/backup.log #日志输出格式 log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH\:mm\:ss} [%c]-[%p] %m%n #设置日志文件后缀名,决定着多长时间创建一个新的文件!yyyyMMdd每天一个,yyyyMMddHH第小时一个,... log4j.appender.R.DatePattern=‘.‘yyyy-MM-dd #日志布局格式 log4j.appender.R.layout=org.apache.log4j.PatternLayout |
2.2:按文件大小产生日志文件
#设置日志的级别 ,多个以、分开(没有给出的,则不会被输出) log4j.rootLogger=ERROR、WARN、INFO、DEBUG,R #RollingFileAppender:文件大小到达指定尺寸时产生一个新的文件 log4j.appender.R=org.apache.log4j.RollingFileAppender #设置日志文件保存路径 log4j.appender.R.File=log/backup.log #超出设置的大小,则将其以[文件名称+序号]备份后,再写入。 log4j.appender.R.MaxFileSize=3KB #设置日志文件备份的最大序号 log4j.appender.R.MaxBackupIndex=10 #日志输出格式 log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n #日志布局格式 log4j.appender.R.layout=org.apache.log4j.PatternLayout |
2.3:日志发到邮箱
2.3.1:依赖包3个包
? log4j-1.2.15.jar(版本低于log4j-1.2.14.jar不支持SMTP认证)
? mail.jar
? activation.jar
2.3.2:测试环境是否能发送邮件
import org.apache.log4j.Logger; import org.apache.log4j.PatternLayout; import org.apache.log4j.net.SMTPAppender; public class TestLog4jSendMail { static Logger logger = Logger.getLogger(TestLog4jSendMail.class); SMTPAppender appender = new SMTPAppender(); public TestLog4jSendMail() { try { appender.setSMTPUsername("username"); appender.setSMTPPassword("password"); appender.setTo("[email protected]"); appender.setFrom("[email protected]"); // SMTP服务器 smtp.163.com appender.setSMTPHost("smtp.163.com"); appender.setLocationInfo(true); appender.setSubject("Test Mail From Log4J"); appender.setLayout(new PatternLayout()); appender.activateOptions(); logger.addAppender(appender); logger.error("Hello World"); } catch (Exception e) { e.printStackTrace(); logger.error("Printing ERROR Statements", e); } } public static void main(String args[]) { new TestLog4jSendMail(); } } |
2.3.3:配置文件
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender # 日志的错误级别 log4j.appender.MAIL.Threshold=ERROR,INFO,DEBUG # 缓存文件大小,日志达到512K时发送Email #log4j.appender.MAIL.BufferSize=10 # 发送邮件的服务器(smtp.163.com) log4j.appender.MAIL.SMTPHost=smtp.163.com #邮件主题 log4j.appender.MAIL.Subject=ErrorMessage #发送邮件箱的用户 [email protected] #发送邮件箱的密码 log4j.appender.MAIL.SMTPPassword=xxx #发送邮件箱 [email protected] #接受邮件箱 [email protected] log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout #在com.study.logMail包下面的ERROR级别以上的log都是采用邮件发送 log4j.logger.com.study.logMail = ERROR,MAIL |
2.3.4:反馈如下
2.4:日志保存到数据库
2.4.1:创建数据库或表
CREATE DATABASE log4jdb |
CREATE TABLE RESLOG ( createTime VARCHAR(20), #日志记录时间 threadVARCHAR(200),#线程名称 levelText VARCHAR(100),#日志级别(INFO、DEBUG、ERROR等) logclass VARCHAR(1000),#发生事件的类全路径 message VARCHAR(4000),#日志消息 username VARCHAR(4000) #用户 )# |
2.4.2配置参数
#设置捕获的级别 log4j.rootLogger=ERROR、WARN、INFO、DEBUG,DATABASE #设置为日志保存到数据库 log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender #这个配置是告诉LOG4J,有多少条日志信息后才存入数 #数据库连接字符串据库,我这里是1,就是说有一条就查一条,显然这样在生产环境下是很影响系统性能的。 log4j.appender.db.BufferSize=10 #数据库连接字符串 log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/log4jdb #数据库驱动,要求导入jar!!! log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver #数据库用户名 log4j.appender.DATABASE.user=root #数据库密码 log4j.appender.DATABASE.password=123456 #这个配置是告诉当LOG4J吧日志存储数据库时用的SQL语句。SQ_RESLOG_LOGID.Nextval是我建的一个SEQUENCE;‘%C’是日志中的CLASS;‘%M’是打印日志是执行到类里的方法;‘%d’是打印的时间,它支持格式化;‘%P’是日志级别,包括INFO、DEBUG、ERROR等;‘%m’是MSG,日志内容。注意这里的参数区分大小写。 log4j.appender.DATABASE.sql=INSERT INTO RESLOG (createTime,thread,levelText,logclass,message,username) values (‘%d{yyyy-MM-dd HH:mm:ss}‘, ‘%t‘, ‘%p‘, ‘%l‘, ‘%m‘,‘%X{user}‘) log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout |
2.4.3:结果
2.5:日志应用于socket
log4j.rootLogger=DEBUG,CONSOLE,A1,im log4j.addivity.org.apache=true log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender #设置服务端的ip log4j.appender.SOCKET.RemoteHost=localhost #设置端口号 log4j.appender.SOCKET.Port=5001 log4j.appender.SOCKET.LocationInfo=true # Set up for Log Facter 5 log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[thread]%n%c[CATEGORY]%n%m[MESSAGE]%n%n # Log Factor 5 Appender log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000 |
2.6:应用于控制台
log4j.rootLogger=DEBUG,CONSOLE,A1,im log4j.addivity.org.apache=true log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.Threshold=DEBUG log4j.appender.CONSOLE.Target=System.out log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n #log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[thread] n%c[CATEGORY]%n%m[MESSAGE]%n%n |
2.7:应用于文件回滚
log4j.rootLogger=DEBUG,CONSOLE,A1,im log4j.addivity.org.apache=true log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender log4j.appender.ROLLING_FILE.Threshold=ERROR log4j.appender.ROLLING_FILE.File=rolling.log //文件位置,也可以用变量${java.home}、rolling.log log4j.appender.ROLLING_FILE.Append=true //true:添加 false:覆盖 log4j.appender.ROLLING_FILE.MaxFileSize=10KB //文件最大尺寸 log4j.appender.ROLLING_FILE.MaxBackupIndex=1 //备份数 log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n |