Springboot集成log4j

        log4j在项目中应该是使用的最多的日志框架了,一直没有好好去深入总结下,这篇文章记录下一些常规的用法;

1.集成

引入依赖,如下所示:

    
			org.springframework.boot
			spring-boot-starter-web
			
				
				
					org.springframework.boot
					spring-boot-starter-logging
				
			
		

		
			org.springframework.boot
			spring-boot-starter-log4j
			1.3.8.RELEASE
		

之后引入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

项目的目录结构如下所示:

Springboot集成log4j_第1张图片

之后我们来测试一下打印日志,我们在启动类中添加一个日志

@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!!!");
	}
}

 运行项目,执行之后,在控制台上会有一些日志

Springboot集成log4j_第2张图片

 同时在项目目录中有两个文件,error.log和info.log,其中info.log中有跟上面一样的内容;

Springboot集成log4j_第3张图片

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中的信息;

你可能感兴趣的:(spring,boot,java,spring,log4j)