天天看点

总结一下springboot项目整合log4j2框架过程中遇到的问题

首先纪念一个自己的第一个CSDN博客

开发工具用的STS4(eclipse),springboot版本是2.1.9.RELEASE

log4j2的配置文件

网上关于log4j2.xml的配置介绍有很多,基本稍微改下就能用,这里我就不再赘述了。有两个问题要说下:

第一,application.yml(或application.properties)下要不要配置log4j2.xml的路径?如果配置文件名为log4j2.xml(log4j2-test.xml等log4j2能识别的配置名),且文件在src.main.resources下,则不用再配置log4j2.xml的文件路径,如果要个性化,则需要在application.yml文件中进行配置,比如

logging:
  config: classpath:log4j2/myLog4j2.xml
           

第二,log4j2.xml配置文件中的KaTeX parse error: Undefined control sequence: \Users at position 43: …用户的home路径,也就是C:\̲U̲s̲e̲r̲s̲\用户帐户,在此目录下可看到打…{webApp.root},我以为也是取的一个特殊路径,结果是在项目中src同级目录下建了一个名为${webApp.root}的目录,日志文件就在该目录下。个人觉得比较好的方式是下面这种

总结一下springboot项目整合log4j2框架过程中遇到的问题

日志文件的根目录也可以用相对路径或者绝对路径(生产环境肯定要这么配的)。

添加log4j2的依赖

<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-core</artifactId>
		</dependency>
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-api</artifactId>
		</dependency>
           

网上都说要引入这两个依赖,那我就添加这两个依赖。版本的话可以去maven仓库去查,选择适合自己项目的版本

总结一下springboot项目整合log4j2框架过程中遇到的问题

我自己的配置中没指定版本是因为我用2.12.1版本出现冲突,springboot2.1.9默认log4j的版本号是2.11.2,我就把引入log4j的版本号删了,这样就默认用2.11.2版本。这里再说下怎么看当前springboot默认log4j的版本号,在eclipse中,打开pom.xml文件,找到标签,按住Ctrl再点击,就可以打开父级引用

总结一下springboot项目整合log4j2框架过程中遇到的问题

打开父级引用如下

总结一下springboot项目整合log4j2框架过程中遇到的问题

再按住Ctrl点击标签,继续打开父级引用

总结一下springboot项目整合log4j2框架过程中遇到的问题

查找log4j,可以看到当前springboot默认的log4j版本号。

测试log4j2的日志打印

/**
 * 测试log4j打印日志的定时任务
 * 
 * @author WBT
 * @since 2019/10/22
 */
@Component // 注册
@EnableScheduling // 开启定时任务
// @EnableAsync // 开启多线程
public class Log4jScheduleTask {
	
	Logger logger = LogManager.getLogger(Log4jScheduleTask.class);

	/**
	 * 测试定时器1
	 */
	// @Async // 异步处理
	@Scheduled(cron = "*/3 * * * * ?")
	public void scheduleTask1() {
		logger.debug("scheduleTask1: " + System.currentTimeMillis());
		logger.info("scheduleTask1: " + System.currentTimeMillis());
		logger.error("scheduleTask1: " + System.currentTimeMillis());
		logger.error(Thread.currentThread().getName());
	}

	/**
	 * 测试定时器1
	 */
	// @Async // 异步处理
	@Scheduled(cron = "*/5 * * * * ?")
	public void scheduleTask2() {
		logger.debug("scheduleTask2: " + System.currentTimeMillis());
		logger.info("scheduleTask2: " + System.currentTimeMillis());
		logger.error("scheduleTask2: " + System.currentTimeMillis());
		logger.error(Thread.currentThread().getName());
	}

}
           

我写了一个定时任务对log4j进行测试,启动项目,发现控制台有格式化的日志输出,但是在我指定的路径下没有生成日志文件,如下图

总结一下springboot项目整合log4j2框架过程中遇到的问题

这是因为虽然引入了log4j2的包,但是项目中同样有logback的包,而且项目默认用的是logback进行日志打印,现在要解决的就是排除项目中logback的包。

用eclipse打开pom.xml文件,点击Dependency Hierarchy,搜索logback

总结一下springboot项目整合log4j2框架过程中遇到的问题

可以看到security包引入了logback,然后从security包中排除logback包就可以了,如果还有别的jar包也引入logback,同样需要排除,直到查不到logback的包。

<!-- springSecurity安全框架 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-security</artifactId>
			<exclusions>
				<!-- 该项目要用log4j2进行日志打印,由于security默认用logback日志,所以这里要排除 -->
				<exclusion>
					<groupId>org.springframework.boot</groupId>
					<artifactId>spring-boot-starter-logging</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
           

然后再启动项目,发现控制台打印日志的格式改变了,而且指定目录下也生成了日志文件

总结一下springboot项目整合log4j2框架过程中遇到的问题
总结一下springboot项目整合log4j2框架过程中遇到的问题

这就说明引入的log4j2成功了,然后改一下自己喜欢的日志样式就行了,改日志格式这里就不说了,网上可以搜到好多。

虽然成功了,但是控制台报了一个错Failed to load class “org.slf4j.impl.StaticLoggerBinder”,这是因为缺少一个jar包,网上可以查到很多解决办法,很简单,这里我就不说了。

最后再说下用哪种方法打印日志

import org.apache.logging.log4j.LogManager;
			import org.apache.logging.log4j.Logger;
			Logger logger = LogManager.getLogger(类名.class);
           
import org.slf4j.Logger;
			import org.slf4j.LoggerFactory;
			Logger logger = LoggerFactory.getLogger(类名.class);
           

测试发现上面的可以正常打印日志,下面这个没有日志打印,好像下面这种方式是log4j打印日志的方式,而log4j2推荐上面的方式

继续阅读