Java 中比较常用的日志工具类, 有 Log4j,SLF4j,Commons-logging(简称 jcl),Logback,Log4j2(Log4j 升级版),Jdk Logging.
Spring Boot 默认使用 Logback, 但相比较而言, Log4j2 在性能上面会更好.
Spring Boot(版本 1.5.10.RELEASE)中使用 Log4j2 非常简单, 添加如下依赖:
- <!-- Exclude Spring Boot's Default Logging -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter</artifactId>
- <exclusions>
- <exclusion>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-logging</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <!-- Add Log4j2 Dependency -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-log4j2</artifactId>
- </dependency>
- <!-- Needed for Async Logging with Log4j 2 -->
- <dependency>
- <groupId>com.lmax</groupId>
- <artifactId>disruptor</artifactId>
- <version>3.3.6</version>
- </dependency>
- <!-- 使用 jsonLayout 必须依赖 jackson -->
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-core</artifactId>
- <version>2.7.4</version>
- </dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-databind</artifactId>
- <version>2.7.4</version>
- </dependency>
然后在 src/main/resources 中添加 log4j2.xml 配置文件(Spring Boot 还会识别 log4j2.json 和 log4j2.yaml):
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- status 表示 log4j2 本身的日志信息打印级别, 和下面的 level, 不是一个概念 -->
- <!--TRACE <DEBUG < INFO < WARN < ERROR < FATAL < OFF-->
- <Configuration status="OFF" monitorInterval="30">
- <Properties>
- <Property name="LOG_PATTERN">
- %d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${hostName} --- [%15.15t] %-40.40c{1.} : %m%n%ex
- </Property>
- <Property name="LOG_FILE_PATH">/var/log/spring-boot-log4j2</Property>
- </Properties>
- <Appenders>
- <Console name="ConsoleAppender" target="SYSTEM_OUT" follow="true">
- <PatternLayout pattern="${LOG_PATTERN}"/>
- </Console>
- <!-- Rolling File Appender -->
- <RollingFile name="FileAppender" fileName="${LOG_FILE_PATH}/spring-boot-log4j2-demo.log"
- filePattern="${LOG_FILE_PATH}/spring-boot-log4j2-demo-%d{yyyy-MM-dd}-%i.log">
- <PatternLayout>
- <Pattern>${LOG_PATTERN}</Pattern>
- </PatternLayout>
- <!--<JsonLayout complete="false" compact="true">
- <KeyValuePair key="timestamp" value="$${date:yyyy-MM-dd'T'HH:mm:ss.SSSZ}" />
- </JsonLayout>-->
- <Filters>
- <!-- 只记录 ERROR 级别日志信息, 程序打印的其他信息不会被记录 -->
- <!-- 此 level 设置的日志级别, 是过滤日志文件中打印出的日志信息, 和 Root 的 level 有所区别 -->
- <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY" />
- </Filters>
- <Policies>
- <SizeBasedTriggeringPolicy size="10MB" />
- <!-- 每天创建一个日志文件 -->
- <TimeBasedTriggeringPolicy interval="1" />
- </Policies>
- <DefaultRolloverStrategy max="10"/>
- </RollingFile>
- </Appenders>
- <Loggers>
- <!-- 用来单独指定日志的形式, 比如要为指定包下的 class 指定不同的日志级别等. -->
- <!--<Logger name="com.easyjijin.demo.springbootlog4j2" level="debug" additivity="false">
- <AppenderRef ref="ConsoleAppender" />
- <AppenderRef ref="FileAppender"/>
- </Logger>-->
- <!-- AsyncRoot - 异步记录日志 - 需要 LMAXDisruptor 的支持 -->
- <!-- <AsyncRootlevel="info" additivity="false">
- <AppenderRef ref="Console"/>
- <AppenderRef ref="FileAppender"/>
- </AsyncRoot> -->
- <!-- All <Trace < Debug < Info < Warn < Error < Fatal < OFF. -->
- <!-- 程序会打印高于或等于所设置级别的日志, 设置的日志等级越高, 打印出来的日志就越少.-->
- <!-- 此 level 设置的日志级别, 是过滤项目中输出的日志信息, 和 ThresholdFilter 的 level 有所区别 -->
- <Root level="ERROR">
- <AppenderRef ref="ConsoleAppender" />
- <AppenderRef ref="FileAppender"/>
- </Root>
- </Loggers>
- </Configuration>
这边需要注意几个日志的级别:
Configuration status="OFF"
: 这个 status 配置的是, Log4j2 组件本身日志级别, 指的是如果 Log4j2 本身出错, 打印出的日志级别配置.
Root level="ERROR": 这个 level 配置的是, 程序输入的日志级别, 对应
log.error("this is a error")
, 程序会打印高于或等于所设置级别的日志.
ThresholdFilter level="ERROR"
: 这个 level 配置的是, 输出到日志文件 (或是其他) 的日志日志级别, 也就是在日志文件只输出 ERROR 级别的日志, 其他无关信息不输出.
在程序中使用 Log4j2 打印日志信息:
- @SpringBootApplication
- public class Log4j2DemoApplication implements ApplicationRunner {
- private static final Logger logger = LogManager.getLogger(Log4j2DemoApplication.class);
- public static void main(String[] args) {
- SpringApplication.run(Log4j2DemoApplication.class, args);
- }
- @Override
- public void run(ApplicationArguments applicationArguments) throws Exception {
- logger.debug("Debugging log");
- logger.info("Info log");
- logger.warn("Hey, This is a warning!");
- logger.error("Oops! We have an Error. OK");
- logger.fatal("Damn! Fatal error. Please fix me.");
- }
- }
或者使用 Lombok, 可以更方便的使用 Log4j2, 需要添加依赖:
- <dependency>
- <groupId>org.projectlombok</groupId>
- <artifactId>lombok</artifactId>
- </dependency>
使用代码:
- import lombok.extern.log4j.Log4j2;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RestController;
- @Log4j2
- @RestController
- public class HelloController {
- @RequestMapping("/home")
- public String home() {
- log.error("Hi ! We have an Error. Hello World");
- return "Hello World ----spring-boot-log4j2";
- }
- }
注意: 如果 IDEA 报错(找不到 log),IDEA 设置中添加 Lombok 插件, 即可.
参考资料:
日志工具现状调研 http://tech.lede.com/2017/02/06/rd/server/log4jSearch/
logback log4j log4j2 性能实测 https://blog.souche.com/logback-log4j-log4j2shi-ce/
How to use Log4j 2 with Spring Boot https://www.callicoder.com/spring-boot-log4j-2-example/ (推荐)
Spring Boot + Log4j2 日志框架配置 (Maven) http://blog.51cto.com/11931236/2058708
聊一聊 log4j2 配置文件 log4j2.xml(配置详情)
spring-boot 日志 log4j2 配置 https://my.oschina.net/tongjh/blog/1602240
来源: https://www.cnblogs.com/xishuai/p/spring-boot-log4j2.html