springboot2.0日志详解-logback,log4j2,log4j

优先级从高到低分别是 ERROR、WARN、INFO、DEBUG

在说springboot默认的日志框架之前,先说下目前市面上的一些日志框架

市面上的日志框架:JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j...

JCL(Jakarta Commons Logging) :spring 底层所使用的日志框架

JUL(java.util.logging) :java提供的日志框架

Jboss-logging :就是jboss提供的日志框架(hibernate)

logback :springboot默认使用的框架

log4j :跟logback 同一个人写的日志框架

log4j2:是谷歌的一个日志框架

slf4j(Simple Logging Facade for Java ):简单的日志框架,也是logback ,log4j 的作者写的,主要是目前日志的抽象层

面对抽象层编程,我们主要使用的slf4j,对应的实现有logback,log4j,log4j2

在slf4j的官网中,有张图,告诉我们,如何引用日志框架

图上,可以看到,我们使用不同的日志框架,都可以使用slf4j作为日志的抽象层,来做日志的收集,而不需要具体关注日志的实现,slf4j也都做了很好的适配,其中标红的一部分,就是slf4j做的一些适配;

具体做日志适配的过程,官网上,也给了另外一个图

我们以标注的部分为例(JCL(Jakarta Commons Logging) :spring 底层所使用的日志框架)

spring的底层使用的JCL日志框架,springboot使用的logback,这两个日志框架,要做兼容

1:首先要排除掉JCL的日志框架,

 <dependency>
      <groupId>org.springframework.ws</groupId>
      <artifactId>spring-ws-core</artifactId>
      <version>3.0.6.RELEASE</version>
      <scope>compile</scope>
      <exclusions>
        <exclusion>
          <artifactId>commons-logging</artifactId>
          <groupId>commons-logging</groupId>
        </exclusion>
      </exclusions>
      <optional>true</optional>
    </dependency>

2:然后引入logback的日志实现,也就是springboot日志中,引入的jar

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

3:然后引入中间替换包,来替换掉spring的底层的日志框架,上图所示的jul-to-slf4j.jar

至此,日志就替换完成了,后面就是日志文件的一些具体配置了,详细参考springboot的官网26章

https://docs.spring.io/spring-boot/docs/2.1.5.RELEASE/reference/htmlsingle/#boot-features-logging

日志输出格式:
        %d表示日期时间,
        %thread表示线程名,
        %-5level:级别从左显示5个字符宽度
        %logger{50} 表示logger名字最长50个字符,否则按照句点分割。 
        %msg:日志消息,
        %n是换行符

例如: %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n

logging.level.com.badger=debug
#logging.path=
# 不指定路径在当前项目下生成springboot.log日志
# 可以指定完整的路径;
#logging.file=G:/springboot.log

# 在当前磁盘的根路径下创建spring文件夹和里面的log文件夹;使用 spring.log 作为默认文件
logging.path=/spring/log

#  在控制台输出的日志的格式
logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
# 指定文件中日志输出的格式
logging.pattern.file=%d{yyyy-MM-dd} === [%thread] === %-5level === %logger{50} ==== %msg%n
logging.file logging.path Example Description
(none) (none)   只在控制台输出
指定文件名 (none) my.log 输出日志到my.log文件
(none) 指定目录 /var/log 输出到指定目录的 spring.log 文件中

也可以在xml文件中,指定日志文件,不同的日志框架,有对应的不同的日志文件的名称

Logging System Customization
Logback logback-spring.xml, logback-spring.groovy, logback.xml or logback.groovy
Log4j2 log4j2-spring.xml or log4j2.xml
JUL (Java Util Logging) logging.properties

我们使用springboot默认的Logback日志,我直接给一个我经常使用的,供大家参考

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="10 seconds">
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <Pattern>[%d %level]%logger{50}>>> %msg%n</Pattern>
        </encoder>
    </appender>
    <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <File>logs/debug.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/debug-%d{yyyyMMdd}.log.%i</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>50MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>10</maxHistory>
        </rollingPolicy>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>[%d %level]%logger{36}>>> %msg%n</Pattern>
        </layout>
    </appender>
    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>logs/info.log</File>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/info-%d{yyyyMMdd}.log.%i</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>20MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>10</maxHistory>
        </rollingPolicy>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>[%d %level]%logger{50}>>> %msg%n</Pattern>
        </layout>
    </appender>
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>WARN</level>
        </filter>
        <File>logs/error.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/error-%d{yyyyMMdd}.log.%i</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>20MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>10</maxHistory>
        </rollingPolicy>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>[%d %level]%logger{50}>>> %msg%n</Pattern>
        </layout>
    </appender>

    <logger name="com.badger" level="DEBUG" />
    <logger name="com.alibaba.druid" level="INFO" />
    <logger name="org.apache.ibatis" level="INFO" />
    <logger name="org.mybatis.spring" level="INFO" />
    <logger name="org.hibernate.validator" level="INFO" />
    <logger name="org.springframework" level="INFO"></logger>

    <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="DEBUG_FILE" />
        <appender-ref ref="INFO_FILE" />
        <appender-ref ref="ERROR_FILE" />
    </root>
</configuration>

需要说明下:

1:如果日志文件的名字logback-spring.xml ,那么可以使用这个<springProfile name="dev">,表示当前环境下生效

<springProfile name="dev">
    <!-- configuration to be enabled when the "staging" profile is active -->
  	可以指定某段配置只在某个环境下生效
</springProfile>

2:日志的过滤器

<filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>

有两种:ch.qos.logback.classic.filter.LevelFilter和ch.qos.logback.classic.filter.ThresholdFilter

LevelFilter:是级别过滤器,表示只要当前的级别的

ThresholdFilter:是阈值过滤器,表示只要xxx级别一下的,例如配置了info级别,那么拦截的日志就会是

ERROR、WARN、INFO、DEBUG 中的 ERROR、WARN、INFO

onMatch:拿到对应级别的处理机制

onMismatch:不是这个级别的日志的处理机制

对应的就是这个枚举类ch.qos.logback.core.spi.FilterReply

public enum FilterReply {
    DENY, NEUTRAL, ACCEPT;
}

log4j,log4j2的使用

通过上面的说明,大家也都该熟悉怎么使用了,步骤就简单很多了,直接排除springboot的日志,切换到对应的日志框架就可以了,如下:

   <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <artifactId>spring-boot-starter-logging</artifactId>
                    <groupId>org.springframework.boot</groupId>
                </exclusion>
            </exclusions>
        </dependency>

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

原创文章 83 获赞 155 访问量 36万+

猜你喜欢

转载自blog.csdn.net/qq_28410283/article/details/91356708