当前位置 : 首页 » 文章分类 :  开发  »  Spring-Log

Spring-Log

spring log 笔记

spring boot使用log4j2

spring boot支持的日志框架有,logback,Log4j2,Log4j和Java Util Logging

Spring Boot 默认使用 Logback 日志框架

添加maven依赖

编辑pom.xml文件,排除logback的依赖包,添加log4j2的依赖包,如果要使用异步日志还需要添加 disruptor 依赖

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
      <!-- 排除logback -->
      <exclusion>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-logging</artifactId>
      </exclusion>
    </exclusions>
  </dependency>

  <!-- log4j2 -->
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
  </dependency>

  <!-- log4j2 异步支持 -->
  <dependency>
    <groupId>com.lmax</groupId>
    <artifactId>disruptor</artifactId>
  </dependency>
</dependencies>

注意要从 spring-boot-starter 依赖中排除 spring-boot-starter-logging, 只从 spring-boot-starter-web 中排除是不行的。

日志配置log4j2.xml

在资源文件夹 src/main/resources 下添加 log4j2.xml 或者 log4j2-spring.xml,启动后spring boot会自动识别并加载,此外,Spring Boot 还会识别 log4j2.jsonlog4j2.yaml

<?xml version="1.0" encoding="UTF-8"?>
<!-- configuration
  status用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出。可以设置成OFF(关闭) 或 Error(只输出错误信息)。
  TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
  monitorInterval, 30s刷新此配置
-->
<configuration status="WARN" monitorInterval="30">

  <properties>
    <property name="PATTERN">%d{yyyy-MM-dd HH:mm:ss,SSS} [%-5level] [%thread] %c [%L]: %msg%n</property>
    <Property name="LOG_DIR">/data/log/blog</Property>
  </properties>

  <appenders>
    <Console name="Console" target="system_out">
      <PatternLayout pattern="${PATTERN}"/>
    </Console>

    <RollingRandomAccessFile name="RollingRandomAccessFile"
      fileName="${LOG_DIR}/blog.log"
      filePattern="${LOG_DIR}/blog-%d{yyyy-MM-dd}.log">
      <PatternLayout pattern="${PATTERN}"/>
      <Policies>
        <TimeBasedTriggeringPolicy interval="1"/>
      </Policies>
      <DefaultRolloverStrategy>
        <Delete basePath="${LOG_DIR}" maxDepth="1">
          <IfFileName glob="blog-*.log"/>
          <IfLastModified age="3d"/>
        </Delete>
      </DefaultRolloverStrategy>
    </RollingRandomAccessFile>

  </appenders>

  <loggers>
    <AsyncRoot level="info" includeLocation="true">
      <appenderref ref="Console"/>
      <appenderref ref="RollingRandomAccessFile"/>
    </AsyncRoot>
  </loggers>

</configuration>

log4j2不产生日志文件

sprig boot 配置 log4j2 后不产生日志文件,一开始以为是没有配置异步日志的依赖 disruptor 后来配上发现还是不行,折腾了好几天,最后仔细看了下sprig启动时报的 slf4j 警告,发现启动时有两个 slf4j StaticLoggerBinder 的实现类

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/Users/si.ma/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/Users/si.ma/.m2/repository/org/apache/logging/log4j/log4j-slf4j-impl/2.10.0/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]

如上我项目 classpath 中同时有 logback 和 log4j 的 StaticLoggerBinder.class 类实现,slf4j最终自动选择了logback日志实现,感觉可能是这个原因导致log4j日志文件没有创建。

配置maven依赖时已经从 spring-boot-starter-web 中排除了 spring-boot-starter-logging ,但通过查看 maven 依赖树,发现还是有 logback-classic 依赖
通过 mvn dependency:tree 命令查看依赖树,发现确实还有 logback 依赖存在,如下:

[INFO] com.masikkk:blog:jar:0.0.1-SNAPSHOT
[INFO] +- org.springframework.boot:spring-boot-starter:jar:2.0.4.RELEASE:compile
[INFO] |  +- org.springframework.boot:spring-boot:jar:2.0.4.RELEASE:compile
[INFO] |  |  \- org.springframework:spring-context:jar:5.0.8.RELEASE:compile
[INFO] |  +- org.springframework.boot:spring-boot-autoconfigure:jar:2.0.4.RELEASE:compile
[INFO] |  +- org.springframework.boot:spring-boot-starter-logging:jar:2.0.4.RELEASE:compile
[INFO] |  |  +- ch.qos.logback:logback-classic:jar:1.2.3:compile
[INFO] |  |  |  \- ch.qos.logback:logback-core:jar:1.2.3:compile

原来 spring-boot-starter 依赖了 spring-boot-starter-logging 依赖了 logback-classic ,将其从依赖中排除,再次启动spring,成功生成log文件,日志所在的目录都会自动创建的。

<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>

SLF4J: Class path contains multiple SLF4J bindings
https://stackoverflow.com/questions/14024756/slf4j-class-path-contains-multiple-slf4j-bindings

上一篇 Spring-Cloud

下一篇 2019年运动记录

阅读
评论
876
阅读预计4分钟
创建日期 2019-02-25
修改日期 2019-02-28
类别

页面信息

location:
protocol:
host:
hostname:
origin:
pathname:
href:
document:
referrer:
navigator:
platform:
userAgent:

评论