log4j的简单使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38409944/article/details/83152225

前言:

为啥需要log4j或者log4j的作用我在这里就不累赘了,网上资料很多。
在这里我就简单说一下配置log4j中我遇到的一些小坑,还有一些我的简单理解吧。

首先看一个简单的栗子:

#配置了根的权限INFO,还有一个输出对象infox
log4j.rootLogger=INFO,infox
#输出日志到控制台的方式
log4j.appender.infox=org.apache.log4j.ConsoleAppender
#输出日志到控制台的方式 默认为System.out  System.err会当作错误输出,全是红色的
log4j.appender.infox.Target=System.err
#日志级别,WARN。写成DEBUG也行  本来是继承根的INFO,这里用WARN限制了最低的等级
log4j.appender.infox.Threshold=WARN
#设置使用灵活布局
log4j.appender.infox.layout=org.apache.log4j.PatternLayout
#灵活定义输出格式
log4j.appender.infox.layout.ConversionPattern=[%d{HH\:mm\:ss}] %c{1} - %m%n

如何输出日志呢?

Logger logger = Logger.getLogger(AdminUserControler.class);
logger.info("内容");

这里需要考虑的是如何将需要输出日志的类和日志配置文件对应起来呢?
就比如这里我的类是AdminUserControler.class
分两种情况:
1. log4j中没有指定了类的对应输出配置
2. log4j中指定了类的对应输出配置


log4j中没有指定了类的对应输出配置

这个时候AdminUserControler.class类进入到log4j中寻找对应输出配置,没有找到就默认对应根输出配置,而这个根输出配置就是log4j.rootLogger=INFO,infox。具体的日志输出情况根据infox的配置而定。

那就有另一个问题了,如果根输出配置有两个呢?
如log4j.rootLogger=INFO,infox,newinfox
这个时候对应哪一个呢? 其实AdminUserControler.class两个都匹配,意思就是该类的日志输出有两个日志输出,分别对应infox,newinfox的配置而异。


log4j中指定了类的对应输出配置

#配置了根的权限INFO,还有一个输出对象infox
log4j.rootLogger=INFO,infox
#输出日志到控制台的方式
log4j.appender.infox=org.apache.log4j.ConsoleAppender
#输出日志到控制台的方式 默认为System.out  System.err会当作错误输出,全是红色的
log4j.appender.infox.Target=System.err
#日志级别,WARN。写成DEBUG也行  本来是继承根的INFO,这里用WARN限制了最低的等级
log4j.appender.infox.Threshold=WARN
#设置使用灵活布局
log4j.appender.infox.layout=org.apache.log4j.PatternLayout
#灵活定义输出格式
log4j.appender.infox.layout.ConversionPattern=[%d{HH\:mm\:ss}] %c{1} - %m%n
#com.ssm.demo.utils包下的所有类对应DEBUG,xx输出配置
log4j.logger.com.ssm.demo.utils=DEBUG,xx
log4j.appender.xx=org.apache.log4j.DailyRollingFileAppender
log4j.appender.xx.layout=org.apache.log4j.PatternLayout
log4j.appender.xx.layout.ConversionPattern=[%d{HH\:mm\:ss}] %c{1} - %m%n
log4j.appender.xx.datePattern='.'yyyy-MM-dd
log4j.appender.xx.Threshold=DEBUG
log4j.appender.xx.append=true
log4j.appender.xx.File=./logs/ssm-demo/log4j4.log

那想输出com.ssm.demo.util包下的类的日志情况呢?
这里其实该类会对应infox和xx两个输出配置,意思就是会分别根据这两个输出配置来输出日志。这里可以理解为是xx继承于infox,所以子类配置的时候也会调用父类配置。如果根配置有多个,也都会执行。

那如何做到执行自己对应的输出配置,而不用输出根输出配置呢?
设置该输出配置为debug 根为info 而打印的时候debug即可
这样子可以只输出log4j4 而不用输出根输出配置,因为打印日志的时候是debug,根的最低是info所以根输出配置不捕获debug的日志输出。


总结:
输出日志的类对应配置文件log4j中的所有输出配置包括根配置和自己对应的输出配置,即使根配置有多个,也都会执行。
简而言之,日志会匹配log4j中配置的所有输出配置。
不过可以通过限定输出配置的范围来指定输出的文件

题外话:
${catalina.home}代表输出到tomcat文件

再来看一个复杂的log4j配置:

log4j.rootLogger=DEBUG,debug,stdout

log4j.logger.com.ssm.demo.controller=INFO,controller
log4j.logger.com.ssm.demo.service=INFO,service

log4j.logger.org.springframework=OFF
log4j.logger.org.mybatis.spring=ON
log4j.logger.org.springframework.context.annotation=OFF

### 输出到控制台 ###
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.controller=org.apache.log4j.DailyRollingFileAppender
log4j.appender.controller.layout=org.apache.log4j.PatternLayout
log4j.appender.controller.layout.ConversionPattern= [%d{yyyy-MM-dd HH\:mm\:ss}] %c{1} - %m%n
log4j.appender.controller.datePattern='.'yyyy-MM-dd
log4j.appender.controller.Threshold = INFO
log4j.appender.controller.append=true
#controller包下的日志输出到controller.log文件中
log4j.appender.controller.File=${catalina.home}/logs/ssm-demo/controller.log

log4j.appender.service=org.apache.log4j.DailyRollingFileAppender
log4j.appender.service.layout=org.apache.log4j.PatternLayout
log4j.appender.service.layout.ConversionPattern= [%d{yyyy-MM-dd HH\:mm\:ss}] %c{1} - %m%n
log4j.appender.service.datePattern='.'yyyy-MM-dd
log4j.appender.service.Threshold = INFO
log4j.appender.service.append=true
#service包下的日志输出到service.log文件中
log4j.appender.service.File=${catalina.home}/logs/ssm-demo/service.log

log4j.logger.debug=debug
log4j.appender.debug=org.apache.log4j.DailyRollingFileAppender
log4j.appender.debug.layout=org.apache.log4j.PatternLayout
log4j.appender.debug.layout.ConversionPattern= [%d{yyyy-MM-dd HH\:mm\:ss}] %c{1} - %m%n
log4j.appender.debug.datePattern='.'yyyy-MM-dd
log4j.appender.debug.Threshold = DEBUG
log4j.appender.debug.append=true
log4j.appender.debug.File=${catalina.home}/logs/ssm-demo/debug.log

log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

在此配置文件中,设置了多个日志 Appender,补充了控制台打印日志 stdout.
此外,还设置了日志级别和日志文件的存储策略,所有的日志信息都会存储在 debug.log 日志文件中,存储策略为 org.apache.log4j.DailyRollingFileAppender,即每天产生一个日志文件。如果日志文件过大也可以考虑 org.apache.log4j.RollingFileAppender,在日志文件大小到达指定尺寸的时候产生一个新的文件,这种策略也是一个不错的选择.

需要特别注意的是,如果日志信息过多,在生成的日志文件中依然无法很好的查询,这里还设置了分包输出策略:

log4j.logger.com.ssm.demo.controller=INFO,controller
log4j.logger.com.ssm.demo.service=INFO,service

#service 包下的日志输出到 service.log 文件中
log4j.appender.service.File=${catalina.home}/logs/ssm-demo/service.log
#controller 包下的日志输出到 controller.log 文件中
log4j.appender.controller.File=${catalina.home}/logs/ssm-demo/controller.log

日志信息可输出到控制台以及 debug.log 日志文件中,考虑到上线后控制台日志会被关闭,同时要避免 debug.log 日志文件过大而导致查询效率低的问题,所以增加了上面两种设置,对 Service 层和 Controller 层的日志进行单独输出。根据日志场景的不同,日志被灵活地输出到对应的文件中,同时按照模块将日志分成不同文件,可使日志记录清晰明了同时也避免了查询效率低的问题。

猜你喜欢

转载自blog.csdn.net/qq_38409944/article/details/83152225