以下信息来自:网络和自己的理解
大家做项目都知道,日志对开发人员的重要性,但是日志的打印和记录是很耗资源的。以前开发一个项目,做压力测试的时候,发现性能总是提不上去,偶然因素发现,开发人员在写代码的时候,为了方便调试,有很多debug和info信息,项目上线后,没有做日志级别处理,然后将生产环境的日志级别调整到ERROR,性能一下就上去了。所有开发开发环境和生产环境需要不同的日志级别,而且需要输出到不同路径下。log4j可以满足这些需求;有时候错误不是在业务方面,是出在了数据库sql级别的,这时候对数据库sql的记录信息就相当重要:p6spy日志框架就是专注于数据库级别的。
1、log4j的配置:
log4j的配置有xml和property两种配置,主要说property配置:
创建一个 log4j.properties文件,配置是基于:key=value形式的。
Log4J配置文件的基本格式如下:
log4j.rootLogger = [ level ] , appenderName1, appenderName2, …===》第一个value值是配置基本日志级别,后面可以有多个appenderName,多个appenderName的目的是想对不同appenderName做不同的配置:比如日志记录的级别,日志记录的方式,输出格式,布局等等
#配置日志信息输出目的地Appender
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.optionN = valueN
#配置日志信息的格式(布局)
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
…
log4j.appender.appenderName.layout.optionN = valueN
为不同的 Appender 设置日志输出级别:
当调试系统时,我们往往注意的只是异常级别的日志输出,但是通常所有级别的输出都是放在一个文件里的,如果日志输出的级别是BUG!?那就慢慢去找吧。
这时我们也许会想要是能把异常信息单独输出到一个文件里该多好啊。当然可以,Log4j已经提供了这样的功能,我们只需要在配置中修改Appender的Threshold就能实现,比如下面的例子:
[配置文件]
log4j.rootLogger=debug , stdout , D, E
### 输出到控制台 ###
log4j.appender.stdout= org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target= System.out
log4j.appender.stdout.layout= org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern= %d{ABSOLUTE} %5p %c{1 }:%L - %m%n
### 输出到日志文件 ###
log4j.appender.D= org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File= logs/log.log
log4j.appender.D.Append= true
log4j.appender.D.Threshold= DEBUG ## 输出DEBUG级别以上的日志
log4j.appender.D.layout= org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%t:%r ] - [ %p ] %m%n
### 保存异常信息到单独文件 ###
log4j.appender.D= org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File= logs/error.log ## 异常日志文件名
log4j.appender.D.Append= true
log4j.appender.D.Threshold= ERROR ## 只输出ERROR级别以上的日志!!!
log4j.appender.D.layout= org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%t:%r ] - [ %p ] %m%n
ERROR 3
WARN 4
INFO 6
DEBUG 7
Appender 为日志输出目的地,Log4j提供的appender有以下几种:
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
Layout:日志输出格式,Log4j提供的layout有以下几种:
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
打印参数: Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,如下:
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符,Windows平台为“/r/n”,Unix平台为“/n”
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22: 10 : 28,921
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
java代码里使用log4j,增加jar包,编辑log4j.properties文件,在class类中
private static final Logger log = Logger.getLogger(MoreService.class);
2、p6spy
使用:编写spy.properties文件,添加jar包,在spring的配置文件中增加:
<bean id="dataSource" class="com.p6spy.engine.spy.P6DataSource">
<constructor-arg ref="dataSourceTarget"/>
</bean>
spy.properties:
重要的属性配置:
realdriver=org.gjt.mm.mysql.Driver ##根据自己的数据库选择数据库驱动
注意一个和log4j类似的配置即可:
log4j.logger.p6spy=debug,spy6p ####第一个参数:也是日志级别,后面的参数也是appendName,可以有多个,参照log4j
log4j.appender.spy6p=org.apache.log4j.DailyRollingFileAppender ##每天一个文件
log4j.appender.spy6p.File=${catalina.home}/logs/spy6p.log###日志保存文件的路径
log4j.appender.spy6p.DatePattern='.'yyyy-MM-dd-HH ###
log4j.appender.spy6p.Threshold=debug #级别
log4j.appender.spy6p.Append=true
log4j.appender.spy6p.Encoding=UTF-8
#log4j.appender.spy6p.MaxFileSize=500KB
#log4j.appender.spy6p.MaxBackupIndex=10
log4j.appender.spy6p.layout=org.apache.log4j.PatternLayout
log4j.appender.spy6p.layout.ConversionPattern=%d [%5p] [%F:%L] %M: %m%n