首先纪念一个自己的第一个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}的目录,日志文件就在该目录下。个人觉得比较好的方式是下面这种
日志文件的根目录也可以用相对路径或者绝对路径(生产环境肯定要这么配的)。
添加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仓库去查,选择适合自己项目的版本
我自己的配置中没指定版本是因为我用2.12.1版本出现冲突,springboot2.1.9默认log4j的版本号是2.11.2,我就把引入log4j的版本号删了,这样就默认用2.11.2版本。这里再说下怎么看当前springboot默认log4j的版本号,在eclipse中,打开pom.xml文件,找到标签,按住Ctrl再点击,就可以打开父级引用
打开父级引用如下
再按住Ctrl点击标签,继续打开父级引用
查找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进行测试,启动项目,发现控制台有格式化的日志输出,但是在我指定的路径下没有生成日志文件,如下图
这是因为虽然引入了log4j2的包,但是项目中同样有logback的包,而且项目默认用的是logback进行日志打印,现在要解决的就是排除项目中logback的包。
用eclipse打开pom.xml文件,点击Dependency Hierarchy,搜索logback
可以看到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>
然后再启动项目,发现控制台打印日志的格式改变了,而且指定目录下也生成了日志文件
这就说明引入的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推荐上面的方式