springbootlogback自定义日志配置

编程

1、在SpringBoot新建 logback-spring.xml 配置文件

logback 配置文件的组成

  根节点<configuration>有 5 个子节点,下面来进行一一介绍。

<root>节点

  root 节点是必选节点,用来指定最基础的日志输出级别,只有一个 level 属性,用于设置打印级别,可选如下:TRACE,DEBUG,INFO,WARN,ERROR,ALL,OFF

  root 节点可以包含 0 个或多个元素,将appender添加进来。如下:

<root level="debug">

<appender-ref ref="console" />

<appender-ref ref="file" />

</root>

appender 也是子节点之一,将会在后面说明。

<contextName>节点

  设置上下文名称,默认为default,可通过%contextName来打印上下文名称,一般不使用此属性。

<property>节点

  用于定义变量,方便使用。有两个属性:name,value。定义变量后,可以使用${}来使用变量。如下:

<property name="path" value="./log"/>

<property name="appname" value="app"/>

<appender>节点

  appender 用来格式化日志输出的节点,这个最重要。有两个属性:

  • name:该本 appender 命名
  • class:指定输出策略,通常有两种:控制台输出,文件输出

下面通过例子来说明这个怎么用:

  1. 输出到控制台/按时间输出日志

<?xml version="1.0" encoding="UTF-8"?>

<configuration debug="false">

<!--设置存储路径变量-->

<property name="LOG_HOME" value="./log"/>

<!--控制台输出appender-->

<appender name="console" class="ch.qos.logback.core.ConsoleAppender">

<!--设置输出格式-->

<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">

<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->

<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>

<!--设置编码-->

<charset>UTF-8</charset>

</encoder>

</appender>

<!--文件输出,时间窗口滚动-->

<appender name="timeFileOutput" class="ch.qos.logback.core.rolling.RollingFileAppender">

<!--日志名,指定最新的文件名,其他文件名使用FileNamePattern -->

<File>${LOG_HOME}/timeFile/out.log</File>

<!--文件滚动模式-->

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

<!--日志文件输出的文件名,可设置文件类型为gz,开启文件压缩-->

<FileNamePattern>${LOG_HOME}/timeFile/info.%d{yyyy-MM-dd}.%i.log.gz</FileNamePattern>

<!--日志文件保留天数-->

<MaxHistory>30</MaxHistory>

<!--按大小分割同一天的-->

<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">

<maxFileSize>10MB</maxFileSize>

</timeBasedFileNamingAndTriggeringPolicy>

</rollingPolicy>

<!--输出格式-->

<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">

<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->

<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>

<!--设置编码-->

<charset>UTF-8</charset>

</encoder>

</appender>

<!--指定基础的日志输出级别-->

<root level="INFO">

<!--appender将会添加到这个loger-->

<appender-ref ref="console"/>

<appender-ref ref="timeFileOutput"/>

</root>

</configuration>

  1. 设置只输出单个级别

  在 appender 中设置,filter 子节点,在默认级别上再此过滤,配置 onMatch,onMismatch 可实现只输出单个级别

<appender ...>

<filter class="ch.qos.logback.classic.filter.LevelFilter">

<level>INFO</level>

<!--接受匹配-->

<onMatch>ACCEPT</onMatch>

<!--拒绝不匹配的-->

<onMismatch>DENY</onMismatch>

</filter>

</appender>

<logger>节点

构成

  此节点用来设置一个包或具体的某一个类的日志打印级别、以及指定<appender>,有以下三个属性:

  • name: 必须。用来指定受此 loger 约束的某个包或者某个具体的类
  • level:可选。设置打印级别。默认为 root 的级别。
  • addtivity: 可选。是否向上级 loger(也就是 root 节点)传递打印信息。默认为 true。

使用示例如下:

  1. 不指定级别,不指定 appender

<!-- 控制com.example.service下类的打印,使用root的level和appender -->

<logger name="com.example.service"/>

2.指定级别,不指定 appender

<!-- 控制com.example.service下类的打印,使用root的appender打印warn级别日志 -->

<logger name="com.example.service" level="WARN"/>

3.指定级别,指定 appender

<!-- 控制com.example.service下类的打印,使用console打印warn级别日志 -->

<!-- 设置addtivity是因为这里已经指定了appender,如果再向上传递就会被root下的appender再次打印 -->

<logger name="com.example.service" level="WARN" addtivity="false">

<appender-ref ref="console">

</logger>

通过指定 appender 就能将指定的包下的日志打印到指定的文件中。

多环境日志输出

  通过设置文件名为-spring 结尾,可分环境配置 logger,示例如下:

<configuration>

<!-- 测试环境+开发环境. 多个使用逗号隔开. -->

<springProfile name="test,dev">

<logger name="com.example.demo.controller" level="DEBUG" additivity="false">

<appender-ref ref="console"/>

</logger>

</springProfile>

<!-- 生产环境. -->

<springProfile name="prod">

<logger name="com.example.demo" level="INFO" additivity="false">

<appender-ref ref="timeFileOutput"/>

</logger>

</springProfile>

</configuration>

通过配置spring.profiles.active也能做到切换上面的 logger 打印设置

完整的logback文件

<?xml version="1.0" encoding="UTF-8"?>

<!--

scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。

scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒;当scan为true时,此属性生效。默认的时间间隔为1分钟。

debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。

-->

<configuration scan="false" scanPeriod="60 seconds" debug="false">

<!-- 定义日志的根目录 -->

<property name="LOG_HOME" value="logs"/>

<!-- 定义日志文件名称 -->

<property name="appName" value="docker"/>

<!-- ch.qos.logback.core.ConsoleAppender 表示控制台输出 -->

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">

<!--

日志输出格式:

%d表示日期时间,

%thread表示线程名,

%-5level:级别从左显示5个字符宽度

%logger{50} 表示logger名字最长50个字符,否则按照句点分割。

%msg:日志消息,

%n是换行符

-->

<layout class="ch.qos.logback.classic.PatternLayout">

<!-- 当指定application.properties 里面 spring.profiles.active=dev 时,采用第一种格式

<springProfileb 标签的包含的范围可大可小,自己确定即可否则采用第二种格式-->

<springProfile name="dev">

<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ----> [%thread] ---> %-5level %logger{50} - %msg%n</pattern>

</springProfile>

<!--默认配置-->

<springProfile name="!dev">

<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ==== [%thread] ==== %-5level %logger{50} - %msg%n</pattern>

</springProfile>

</layout>

</appender>

<!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">

<!-- 指定日志文件的名称 -->

<file>${LOG_HOME}/${appName}.log</file>

<!--

当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名

TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。

-->

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

<!--

滚动时产生的文件的存放位置及文件名称 %d{yyyy-MM-dd}:按天进行日志滚动

%i:当文件大小超过maxFileSize时,按照i进行文件滚动

-->

<fileNamePattern>${LOG_HOME}/${appName}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>

<!--

可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每天滚动,

且maxHistory是365,则只保存最近365天的文件,删除之前的旧文件。注意,删除旧文件是,

那些为了归档而创建的目录也会被删除。

-->

<MaxHistory>365</MaxHistory>

<!--

当日志文件超过maxFileSize指定的大小时,根据上面提到的%i进行日志文件滚动

注意此处配置SizeBasedTriggeringPolicy是无法实现按文件大小进行滚动的,必须配置timeBasedFileNamingAndTriggeringPolicy

-->

<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">

<maxFileSize>100MB</maxFileSize>

</timeBasedFileNamingAndTriggeringPolicy>

</rollingPolicy>

<!-- 日志输出格式: -->

<layout class="ch.qos.logback.classic.PatternLayout">

<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n</pattern>

</layout>

</appender>

<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">

<file>${LOG_HOME}/debug.log</file>

<append>true</append>

<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">

<fileNamePattern>${LOG_HOME}/debug/%d{yyyy-MM-dd}/debug.%i.log.zip</fileNamePattern>

<maxFileSize>10MB</maxFileSize>

<maxHistory>7</maxHistory>

<totalSizeCap>20GB</totalSizeCap>

</rollingPolicy>

<encoder>

<pattern>[lf-1][${SERVER_NAME}][%d{yyyy-MM-dd HH:mm:ss.SSS}][%-5level][%thread][%file:%line] - %msg%n

</pattern>

</encoder>

<filter class="ch.qos.logback.classic.filter.LevelFilter">

<level>DEBUG</level>

<onMatch>ACCEPT</onMatch>

<onMismatch>DENY</onMismatch>

</filter>

</appender>

<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">

<file>${LOG_HOME}/warn.log</file>

<append>true</append>

<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">

<fileNamePattern>${LOG_HOME}/warn/%d{yyyy-MM-dd}/warn.%i.log.zip</fileNamePattern>

<maxFileSize>10MB</maxFileSize>

<maxHistory>7</maxHistory>

<totalSizeCap>20GB</totalSizeCap>

</rollingPolicy>

<encoder>

<pattern>[lf-1][${SERVER_NAME}][%d{yyyy-MM-dd HH:mm:ss.SSS}][%-5level][%thread][%file:%line] - %msg%n

</pattern>

</encoder>

<filter class="ch.qos.logback.classic.filter.LevelFilter">

<level>WARN</level>

<onMatch>ACCEPT</onMatch>

<onMismatch>DENY</onMismatch>

</filter>

</appender>

<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">

<file>${LOG_HOME}/error.log</file>

<append>true</append>

<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">

<fileNamePattern>${LOG_HOME}/error/%d{yyyy-MM-dd}/error.%i.log.zip</fileNamePattern>

<maxFileSize>10MB</maxFileSize>

<maxHistory>7</maxHistory>

<totalSizeCap>20GB</totalSizeCap>

</rollingPolicy>

<encoder>

<pattern>[lf-1][${SERVER_NAME}][%d{yyyy-MM-dd HH:mm:ss.SSS}][%-5level][%thread][%file:%line] - %msg%n

</pattern>

</encoder>

<filter class="ch.qos.logback.classic.filter.LevelFilter">

<level>ERROR</level>

<onMatch>ACCEPT</onMatch>

<onMismatch>DENY</onMismatch>

</filter>

</appender>

<appender name="TRACE_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">

<file>${LOG_HOME}/trace.log</file>

<append>true</append>

<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">

<fileNamePattern>${LOG_HOME}/trace/%d{yyyy-MM-dd}/trace.%i.log.zip</fileNamePattern>

<maxFileSize>10MB</maxFileSize>

<maxHistory>7</maxHistory>

<totalSizeCap>20GB</totalSizeCap>

</rollingPolicy>

<encoder>

<pattern>[lf-1][${SERVER_NAME}][%d{yyyy-MM-dd HH:mm:ss.SSS}][%-5level][%thread][%file:%line] - %msg%n

</pattern>

</encoder>

<filter class="ch.qos.logback.classic.filter.LevelFilter">

<level>TRACE</level>

<onMatch>ACCEPT</onMatch>

<onMismatch>DENY</onMismatch>

</filter>

</appender>

<!--

logger主要用于存放日志对象,也可以定义日志类型、级别

name:表示匹配的logger类型前缀,也就是包的前半部分

level:要记录的日志级别,包括 TRACE < DEBUG < INFO < WARN < ERROR

additivity:作用在于children-logger是否使用 rootLogger配置的appender进行输出,

false:表示只用当前logger的appender-ref,true:

表示当前logger的appender-ref和rootLogger的appender-ref都有效

-->

<!-- Spring framework logger -->

<logger name="org.springframework" level="debug" additivity="false"/>

<!--

root与logger是父子关系,没有特别定义则默认为root,任何一个类只会和一个logger对应,

要么是定义的logger,要么是root,判断的关键在于找到这个logger,然后判断这个logger的appender和level。

-->

<root level="info">

<appender-ref ref="CONSOLE"/>

<appender-ref ref="FILE"/>

<appender-ref ref="WARN_FILE"/>

<appender-ref ref="ERROR_FILE"/>

</root>

<!--debug 日志级别-->

<logger name="com.wjx" level="debug">

<appender-ref ref="DEBUG_FILE"/>

</logger>

<!-- 4.2 生产环境:输出到文档 -->

<springProfile name="pro">

<root level="info">

<appender-ref ref="DEBUG_FILE" />

<appender-ref ref="INFO_FILE" />

<appender-ref ref="ERROR_FILE" />

<appender-ref ref="WARN_FILE" />

</root>

</springProfile>

<!-- 另一个配置生产和开发的方法 -->

<!-- 测试环境+开发环境. 多个使用逗号隔开. -->

<springProfile name="test,dev">

<logger name="com.example.demo.controller" level="DEBUG" additivity="false">

<appender-ref ref="console"/>

</logger>

</springProfile>

<!-- 生产环境. -->

<springProfile name="prod">

<logger name="com.example.demo" level="INFO" additivity="false">

<appender-ref ref="timeFileOutput"/>

</logger>

</springProfile>

</configuration>

2、将logback-spring.xml放在resources目录下

3、在application.properties属性文件中加入 #日志相关 logging.config=classpath:logback-spring.xml

以上是 springbootlogback自定义日志配置 的全部内容, 来源链接: utcz.com/z/511287.html

回到顶部