log4j和p6spy日志管理

时间:2021-11-17 00:05:22

以下信息来自:网络和自己的理解


 大家做项目都知道,日志对开发人员的重要性,但是日志的打印和记录是很耗资源的。以前开发一个项目,做压力测试的时候,发现性能总是提不上去,偶然因素发现,开发人员在写代码的时候,为了方便调试,有很多debug和info信息,项目上线后,没有做日志级别处理,然后将生产环境的日志级别调整到ERROR,性能一下就上去了。所有开发开发环境和生产环境需要不同的日志级别,而且需要输出到不同路径下。log4j可以满足这些需求;有时候错误不是在业务方面,是出在了数据库sql级别的,这时候对数据库sql的记录信息就相当重要:p6spy日志框架就是专注于数据库级别的。



  1、log4j的配置:

         log4j的配置有xml和property两种配置,主要说property配置:

           创建一个   log4j.properties文件,配置是基于:key=value形式的。

            Log4J配置文件的基本格式如下: 

log4j和p6spy日志管理 #配置根Logger
log4j和p6spy日志管理log4j.rootLogger 
=  [ level ]   , appenderName1, appenderName2,
 …===》第一个value值是配置基本日志级别,后面可以有多个appenderName,多个appenderName的目的是想对不同appenderName做不同的配置:比如日志记录的级别,日志记录的方式,输出格式,布局等等
log4j和p6spy日志管理
log4j和p6spy日志管理#配置日志信息输出目的地Appender
log4j和p6spy日志管理log4j.appender.appenderName 
=
 fully.qualified.name.of.appender.class 
log4j和p6spy日志管理  log4j.appender.appenderName.option1 
=
 value1 
log4j和p6spy日志管理  … 
log4j和p6spy日志管理  log4j.appender.appenderName.optionN 
=
 valueN 
log4j和p6spy日志管理
log4j和p6spy日志管理#配置日志信息的格式(布局)
log4j和p6spy日志管理log4j.appender.appenderName.layout 
=
 fully.qualified.name.of.layout.class 
log4j和p6spy日志管理  log4j.appender.appenderName.layout.option1 
=
 value1 
log4j和p6spy日志管理  … 
log4j和p6spy日志管理  log4j.appender.appenderName.layout.optionN 
= valueN 

为不同的 Appender 设置日志输出级别:
当调试系统时,我们往往注意的只是异常级别的日志输出,但是通常所有级别的输出都是放在一个文件里的,如果日志输出的级别是BUG!?那就慢慢去找吧。
这时我们也许会想要是能把异常信息单独输出到一个文件里该多好啊。当然可以,Log4j已经提供了这样的功能,我们只需要在配置中修改AppenderThreshold
就能实现,比如下面的例子:

[配置文件]

log4j和p6spy日志管理 ### set log levels ###
log4j和p6spy日志管理log4j.rootLogger
=debug ,  stdout , D,
 E
log4j和p6spy日志管理
log4j和p6spy日志管理### 输出到控制台 ###
log4j和p6spy日志管理log4j.appender.stdout
=
org.apache.log4j.ConsoleAppender
log4j和p6spy日志管理log4j.appender.stdout.Target
=
System.out
log4j和p6spy日志管理log4j.appender.stdout.layout
=
org.apache.log4j.PatternLayout
log4j和p6spy日志管理log4j.appender.stdout.layout.ConversionPattern
= %d{ABSOLUTE} %5p %c{1
}:%L - %m%n
log4j和p6spy日志管理
log4j和p6spy日志管理### 输出到日志文件 ###
log4j和p6spy日志管理log4j.appender.D
=
org.apache.log4j.DailyRollingFileAppender
log4j和p6spy日志管理log4j.appender.D.File
=
logs/log.log
log4j和p6spy日志管理log4j.appender.D.Append
=
true
log4j和p6spy日志管理log4j.appender.D.Threshold
=
DEBUG ## 输出DEBUG级别以上的日志
log4j和p6spy日志管理log4j.appender.D.layout
=
org.apache.log4j.PatternLayout
log4j和p6spy日志管理log4j.appender.D.layout.ConversionPattern
=%-d{yyyy-MM-dd HH:mm:ss} [%t:%r ] - [ %p ]
 %m%n
log4j和p6spy日志管理
log4j和p6spy日志管理### 保存异常信息到单独文件 ###
log4j和p6spy日志管理log4j.appender.D
=
org.apache.log4j.DailyRollingFileAppender
log4j和p6spy日志管理log4j.appender.D.File
=
logs/error.log ## 异常日志文件名
log4j和p6spy日志管理log4j.appender.D.Append
=
true
log4j和p6spy日志管理log4j.appender.D.Threshold
=
ERROR ## 只输出ERROR级别以上的日志!!!
log4j和p6spy日志管理log4j.appender.D.layout
=
org.apache.log4j.PatternLayout
log4j和p6spy日志管理log4j.appender.D.layout.ConversionPattern
=%-d{yyyy-MM-dd HH:mm:ss} [%t:%r ] - [ %p ]  %m%n



其中 [level] 是日志输出级别,共有5级:
log4j和p6spy日志管理FATAL      0 
log4j和p6spy日志管理ERROR     
3
 
log4j和p6spy日志管理WARN      
4
 
log4j和p6spy日志管理INFO      
  6
 
log4j和p6spy日志管理DEBUG     
7

log4j和p6spy日志管理

Appender
为日志输出目的地,Log4j提供的appender有以下几种:
log4j和p6spy日志管理 org.apache.log4j.ConsoleAppender(控制台),
log4j和p6spy日志管理org.apache.log4j.FileAppender(文件),
log4j和p6spy日志管理org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
log4j和p6spy日志管理org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
log4j和p6spy日志管理org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

Layout:日志输出格式,Log4j提供的layout有以下几种:
log4j和p6spy日志管理 org.apache.log4j.HTMLLayout(以HTML表格形式布局),
log4j和p6spy日志管理org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
log4j和p6spy日志管理org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
log4j和p6spy日志管理org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)


打印参数: Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,如下:

log4j和p6spy日志管理   %m   输出代码中指定的消息
log4j和p6spy日志管理  %p   输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL 
log4j和p6spy日志管理  %r   输出自应用启动到输出该log信息耗费的毫秒数 
log4j和p6spy日志管理  %c   输出所属的类目,通常就是所在类的全名 
log4j和p6spy日志管理  %t   输出产生该日志事件的线程名 
log4j和p6spy日志管理  %n   输出一个回车换行符,Windows平台为“/r/n”,Unix平台为“/n” 
log4j和p6spy日志管理  %d   输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss
,SSS},输出类似:2002年10月18日 22 10 28921
 
log4j和p6spy日志管理  %l   输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:
10log4j和p6spy日志管理


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