log4j在项目中应该是使用的最多的日志框架了,一直没有好好去深入总结下,这篇文章记录下一些常规的用法;
1.集成
引入依赖,如下所示:
<dependency> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId> <exclusions> <!--
排除自带的logback依赖 --> <exclusion> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions>
</dependency> <dependency> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
<version>1.3.8.RELEASE</version> </dependency>
之后引入log4j的配置文件,log4j的配置有两种格式,一种是property这种方式,还有一种是yml的方式,这里以property配置方式,在resources目录中创建一个log4j.properties:
#定义根节点 log4j.rootLogger=info,error,CONSOLE,info #设置控制台打印
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender #设置为格式化打印 PatternLayout
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c]
[%p] - %m%n #设置info级别的日志 #log4j.logger.info=info #输出到日志文件
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender
log4j.appender.info.layout=org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c]
[%p] - %m%n #日期文件名格式化 log4j.appender.info.datePattern='.'yyyy-MM-dd
log4j.appender.info.Threshold = info #是否追加 log4j.appender.info.append=true
#文件存放位置 log4j.appender.info.File=E:/dance/demo/log/info.log
#log4j.logger.error=error
log4j.appender.error=org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.layout=org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c]
[%p] - %m%n log4j.appender.error.datePattern='.'yyyy-MM-dd
log4j.appender.error.Threshold = error log4j.appender.error.append=true
log4j.appender.error.File=E:/dance/demo/log/error.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} [%t] [%c]
[%p] - %m%n log4j.appender.DEBUG.datePattern='.'yyyy-MM-dd
log4j.appender.DEBUG.Threshold = DEBUG log4j.appender.DEBUG.append=true
log4j.appender.DEBUG.File=E:/dance/demo/log/dubug.log
接着需要在resouce的application.properties中设置log4j的路径如下:
logging.config= classpath:log4j.properties
项目的目录结构如下所示:
之后我们来测试一下打印日志,我们在启动类中添加一个日志
@SpringBootApplication public class DemoApplication { private static final
Logger logger = Logger.getLogger(DemoApplication.class); public static void
main(String[] args) { SpringApplication.run(DemoApplication.class, args);
logger.info("DemoApplication start!!!"); } }
运行项目,执行之后,在控制台上会有一些日志
同时在项目目录中有两个文件,error.log和info.log,其中info.log中有跟上面一样的内容;
error.log是空的,是因为我们上面打印的日志级别是info,如果改成error就可以输出了;
2.说明
通过上面的步骤,我们可以在我们的Springboot项目中集成log4j了;下面针对log4j的配置做一点说明:
1>log4j的配置整体有几部分组成:日志的名称,级别以及该日志的appender(可以理解为日志输出到哪里);
2>比如这个配置log4j.rootLogger=info,error,CONSOLE,info
,rootLogger是跟日志名称,这个是默认的,info是跟日志级别,某个类没有明确指定的话,小于这个级别的日志都不会输出;后面的几个参数是指的日志输出的appender的名称,这个appender的配置是在下面指定的;所以这一行的意思:项目的跟日志级别是info,小于这个级别的日志不会输出;大于等于这个级别的日志输入的位置根据error,console,info这几个appender来配置;
3>appender的配置,常用的有ConsoleAppender:输出到控制台,DailyRollingFileAppender:每天输出一个日志文件等;上面的日志和appender名称可能会有混淆,error,info等,比如你也可以自己定义一个日志名字,aaa,也可以自己定义一个appender:aaa;配置如下所示,所以,appender后面的这个就是appender的名称;
log4j.logger.aaa=error,aaa
log4j.appender.aaa=org.apache.log4j.DailyRollingFileAppender
log4j.appender.aaa.layout=org.apache.log4j.PatternLayout
log4j.appender.aaa.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p]
- %m%n log4j.appender.aaa.datePattern='.'yyyy-MM-dd
log4j.appender.aaa.Threshold = info log4j.appender.aaa.append=true
log4j.additivity.aaa= false log4j.appender.aaa.File=E:/dance/demo/log/aaa.log
配置之后,我们可以在rootLogger中添加一个appender,log4j.rootLogger=info,error,CONSOLE,info,aaa
这样info级别的日志也是会输出到aaa中的;
我们打印日志的时候,
private static final Logger logger = Logger.getLogger(DemoApplication.class);
这句话getLogger的参数是日志的名称,这里换成aaa的话,这句日志就会只输出到aaa的日志配置中去;
log4j.appender.aaa.Threshold =
info,这句话是说,aaa这个日志,最低的日志等级是info,如果设置成log4j.appender.aaa.Threshold = debug,那么当你
private static final Logger logger = Logger.getLogger("aaa");
logger.debug("DemoApplication start!!!");
来打印日志的话,这个日志是会覆盖跟日志级别的,因为明确指定了aaa,所以依然会打印的;
4>日志的名称和日志的appender之间是没有关联的,我们可以把aaa的日志也输出到error这个appender里面,我们也可以再定义一个bbb的appender,把日志名称为aaa的日志,统一输出到bbb的appender里面;下面这句的意思是,日志名称为aaa的日志,级别是error,输出到aaa和bbb这两个appender里面;注意这里的日志级别和Threshold取交集;
log4j.logger.aaa=error,aaa,bbb
3.MDC
MDC(Mapped Diagnostic
Context,映射调试上下文),主要是为了方便在多线程下打印日志使用的,我们的web都是多线程的,那么在高并发下接受用户请求的时候,可能在入口处同时打印多个用户的请求参数,我们无法确认后续的请求是哪个用户的,这种时候,可以在MDC中放入用户的标示,在日志中设置好格式打印出来,还有一种情况,子线程会继承父线程的MDC中的信息;