1. logback-spring配置
1. 根节点:configuration
标签是根节点,包含以下属性:
- scan: 当此属性为true时,配置文件发生改变,将会被重新加载,默认值true
- scanPeriod:检测配置文件是否有修改时间间隔,如果没有自定时间单位,默认是毫秒(ms)。当scan为true,此scan为true,此时生效,默认时间间隔1分钟。
- debug:此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态,默认值false
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 其他配置 -->
</configuration>
2. property 和 springProperty
: 可以直接设置 设置名为logFile的变量,后续则可以直接使用${logFile} 方式引用到该值 “logs/mutest”
:配置成yml文件中的内容 同样使用${logFile},但是,值是采用source文件指定的。 log: file: logs/mutest
3. root
root节点,为必选节点。用来指定最基础的日志输出级别,并指定
… …
4. appender
节点是非常关键的节点,负责格式化一个日志输出节点(也就是描述日志存储类型、位置、滚动规则等属性)。感觉: appender类似是一个日志模板,而logger则是日志的输出者,使用某个appender模板来写日志。 appender有三种类型: ConsoleAppender(控制台日志)、FileAppender(文件日志)、RollingFileAppender(滚动文件日志)。
4.1 ConsoleAppender
ConsoleAppender作用是将日志输出到控制台,一般在本地调试的时候使用,配置非常简单。一个典型的ConsoleAppender,有两大属性:
a. name: appender节点的名称,后文中被logger节点引用。在一个logback配置文件中不能重复。
b. class:使用何种日志输出策略,分别是ConsoleAppender(控制台日志)、FileAppender(文件日志)、RollingFilAppender
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d [%thread] %-5level %logger{50} -[%file:%line]- %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
4.2 FileAppender
FileAppender用来把日志添加到文件。例如:
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>testFile.log</file>
<append>true</append>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
跟ConsoleAppender对比,多了一些子节点:
:被写入文件名,可相当目录,也可是绝对目录,如果上级目录不存在就会自动创建,没有默认值 :如果为true,日志被追加到文件结尾;如果是false,清空现存文件。默认为true :对记录时间进行格式化。 :如果是true,日志会被安全写入文件,即使其他的FileAppender也在向此文件写入操作,效率低。所以默认是false :日志的输出格式
<!-- lOGGER PATTERN 根据个人喜好选择匹配 -->
<property name="logPattern"
value="[ %-5level] [%date{yyyy-MM-dd HH:mm:ss.SSS}] %logger{15} [%line]- %msg%n"/>
- %date:表示日期
- %thread:表示线程名
- %-5level:表示级别从左显示5个字符宽度
- %logger{15}:表示logger名字最长是15个字符
- %file-%line: 表示 文件及行数
- %msg:表示日志消息
- %n: 换行符
4.3 RollingFileAppender
RollingFileAppender 用于滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。一个典型的RollingFileAppender节点:
<configuration>
<!--直接定义属性-->
<property name="logFile" value="logs/mutest"/>
<property name="maxFileSize" value="30MB"/>
<appender name="fileLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日志文件存储路径,来自property设置-->
<file>${logFile}.log</file>
<encoder>
<pattern>%d [%thread] %-5level -[%file:%line]- %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--每天生成一个新的活动日志文件,旧的日志归档,后缀名为2019.08.12这种格式-->
<fileNamePattern>${logFile}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!--活动日志文件最大值,超过这个值将产生新日志文件-->
<maxFileSize>${maxFileSize}</maxFileSize>
<!--只保留最近30天的日志-->
<maxHistory>30</maxHistory>
<!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>error</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
</configuration>
常用的子节点:
:当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名。
:日志输出拦截器,可自定义拦截也可用系统定义好的拦截器。
:当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名。属性class定义具体的滚动策略类。
SizeAndTimeBaseRollingPolicy:根据日志文件大小和时间周期作为切割条件,满足任意一个就进行切分。maxFileSize,设置决定当天日志文件大小上限,超过设置上限,同一天将有多个日志文件,
${logFile}.%d{yyyy-MM-dd}.%i imeBasedRollingPolicy:只以时间周期为切分条件,在这种策略下,存档日志名称格式设置为
${logFile}.%d{yyyy-MM-dd}.log 即可。SizeBasedTriggeringPolicy:只以文件大小为切分条件,在这种策略下,
日志滚动的唯一触发条件。 - 滚动策略:
:这是活动文件的大小,SizeAndTimeBasedRollingPolicy策略和SizeBasedTriggeringPolicy策略下必须有。默认值是10MB。超过这个大小,就要生成新的活动文件了。 :可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每个月滚动,且 是6,则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删。 :可选节点,表示日志文件总大小超过1GB将删除存档日志文件。
<appender name="appLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<!--日期 日志等级 线程名 类路径 方法名 行号 打印信息 换行-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{20}.%M\(%F:%L\): %msg%n</pattern>
</encoder>
<file>${BASE_PATH}/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${BASE_PATH}/%d{yyyy-MM-dd}/app.%i.log</fileNamePattern>
<maxFileSize>500MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
</appender>
<!-- 错误日志的配置 -->
<appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<Append>true</Append>
<file>${BASE_PATH}/app-error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${BASE_PATH}/%d{yyyy-MM-dd}/app-error.%i.log</fileNamePattern>
<maxFileSize>500MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>
<![CDATA[[%d{yyyy-MM-dd HH:mm:ss.SSSZ} ] - %X{method} %X{requestURIWithQueryString} [ip=%X{remoteAddr}, ref=%X{referrer}, ua=%X{userAgent}, sid=%X{cookie.JSESSIONID}]%n %-5level %logger{35} - %m%n]]>
</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
4.5 logger节点
logger节点为可选节点,作用是指明具体的包或类的日志输出级别,以及要使用的
<!-- name 属性表示匹配的logger类型前缀 -->
<logger name="com.mutest.demo">
<level value="INFO" />
<!-- 引用的appender,类似于spring的ref -->
<appender-ref ref="fileLog" />
<appender-ref ref="STDOUT" />
</logger>
- name:必写属性,指定具体包或类,被指定的包或类中的日志输出将遵从该logger规定配置。
- level:非必写属性,指定日志输出级别,该级别将覆盖root配置的输出级别。
- addtivity:非必写属性,是否向上级loger传递打印信息。默认是true。
additivity的作用在于当前logger是否使用上级logeer(一般是root logger)配置的appender进行输出。
- false:表示只用当前logger的appender-ref。
- true:表示当前logger的appender-ref和rootLogger的appender-ref都有效。
- appender-ref:引用的appender,引用后将实现appender中定义的行为,例如上面示例中引用了fileLog这个appender,那么com.mutest.demo中打印的日志将按fileLog的配置进行记录。一个logger可以有多个引用,互不影响。
2. logback 跟 logback-spring的说明
logback.xml 和 logback-spring.xml 都可以用来配置logback,但是2者的加载顺序是不一样的(logback.xml 由日志框架加载,而 logback-spring.xml 由SpringBoot来加载)。
①logback.xml—->②application.properties—->③logback-spring.xml
3. DEMO
<?xml version="1.0" encoding="UTF-8"?>
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- logback项目名称 -->
<!-- <property name="appName" value="station"/> -->
<!-- 由于logback-spring的加载顺序在application.properties之后,所以可以将项目名取properties的配置 -->
<springProperty name="appName" source="spring.application.name" />
<!-- 日志路径-->
<!--<property name="logPath" value="/usr/local/dsa5200/filedata/logs"/>-->
<springProperty name="logPath" source="log.filePath" />
<!-- 日志级别 DEBUG INFO WARN ERROR -->
<property name="logLevel" value="INFO"/>
<!-- 是否向上级loger传递打印信息 -->
<property name="additivity" value="false"/>
<!-- 最大保存时间 30天-->
<property name="maxHistory" value="1"/>
<!-- 单文件对大容量 -->
<property name="maxFileSize" value="1KB" />
<!-- 日志文件总大小-->
<property name="totalSizeCap" value="3KB" />
<!-- 异步缓冲队列的深度,该值会影响性能.默认值为256 -->
<property name="queueSize" value="256"/>
<!-- lOGGER PATTERN 根据个人喜好选择匹配 -->
<!--日期 日志等级 线程名 类路径 方法名 行号 打印信息 换行-->
<property name="logPattern" value="[ %-5level] [%date{yyyy-MM-dd HH:mm:ss.SSS}] %logger{16} [%line]- %msg%n"/>
<!-- 动态日志级别 -->
<jmxConfigurator/>
<!-- 控制台的标准输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<charset>UTF-8</charset>
<pattern>${logPattern}</pattern>
</encoder>
</appender>
<!-- DEBUG 日志记录 -->
<appender name="FILE_DEBUG" 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>${logPath}/${appName}_debug.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${logPath}/debug/${appName}_debug.log.%d{yyyy-MM-dd}.%i.log </fileNamePattern>
<!-- 单个日志文件最大量,总日志量不能超过totalSizeCap-->
<maxFileSize>${maxFileSize}</maxFileSize>
<!--日志文件保留天数-->
<maxHistory>${maxHistory}</maxHistory>
<!-- 用来指定日志文件的上限大小,如果到了设置的值,就会删除旧的日志 -->
<totalSizeCap>${totalSizeCap}</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>${logPattern}</pattern>
</encoder>
</appender>
<!-- INFO 级别的日志记录 -->
<appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<file>${logPath}/${appName}_info.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${logPath}/info/${appName}_info.log.%d{yyyy-MM-dd}.%i.log.zip </fileNamePattern>
<!-- 单个日志文件最大量,总日志量不能超过totalSizeCap-->
<maxFileSize>${maxFileSize}</maxFileSize>
<!--日志文件保留天数-->
<maxHistory>${maxHistory}</maxHistory>
<!-- 用来指定日志文件的上限大小,如果到了设置的值,就会删除旧的日志 -->
<totalSizeCap>${totalSizeCap}</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>${logPattern}</pattern>
</encoder>
</appender>
<!-- WARN 级别的日志记录 -->
<appender name="FILE_WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<file>${logPath}/${appName}_warn.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${logPath}/warn/${appName}_warn.log.%d{yyyy-MM-dd}.%i.log </fileNamePattern>
<!-- 单个日志文件最大量,总日志量不能超过totalSizeCap-->
<maxFileSize>${maxFileSize}</maxFileSize>
<!--日志文件保留天数-->
<maxHistory>${maxHistory}</maxHistory>
<!-- 用来指定日志文件的上限大小,如果到了设置的值,就会删除旧的日志 -->
<totalSizeCap>${totalSizeCap}</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>${logPattern}</pattern>
</encoder>
</appender>
<!-- Error 级别的日志记录 -->
<appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--设置过滤级别-->
<level>ERROR</level>
<!--用于配置符合过滤条件的操作-->
<onMatch>ACCEPT</onMatch>
<!--用于配置不符合过滤条件的操作-->
<onMismatch>DENY</onMismatch>
</filter>
<file>${logPath}/${appName}_error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${logPath}/error/${appName}_error.log.%d{yyyy-MM-dd}.%i.log </fileNamePattern>
<!-- 单个日志文件最大量,总日志量不能超过totalSizeCap-->
<maxFileSize>${maxFileSize}</maxFileSize>
<!--日志文件保留天数-->
<maxHistory>${maxHistory}</maxHistory>
<!-- 用来指定日志文件的上限大小,如果到了设置的值,就会删除旧的日志 -->
<totalSizeCap>${totalSizeCap}</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>${logPattern}</pattern>
</encoder>
</appender>
<!-- ASYNC_LOG_DEBUG -->
<appender name="ASYNC_LOG_DEBUG" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<discardingThreshold>20</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>${queueSize}</queueSize>
<!-- 添加附加的appender,最多只能添加一个 -->
<appender-ref ref="FILE_DEBUG"/>
</appender>
<!-- ASYNC_LOG_INFO -->
<appender name="ASYNC_LOG_INFO" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<discardingThreshold>20</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>${queueSize}</queueSize>
<!-- 添加附加的appender,最多只能添加一个 -->
<appender-ref ref="FILE_INFO"/>
</appender>
<!-- ASYNC_LOG_WARN -->
<appender name="ASYNC_LOG_WARN" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<discardingThreshold>20</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>${queueSize}</queueSize>
<appender-ref ref="FILE_WARN"/>
</appender>
<!--ASYNC_LOG_ERROR -->
<appender name="ASYNC_LOG_ERROR" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<discardingThreshold>20</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>${queueSize}</queueSize>
<appender-ref ref="FILE_ERROR"/>
</appender>
<!-- 根据不同功能设置不同的模板 -->
<appender name="WEBSOCKET_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${logPath}/websocket/websocket_log_%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 单个日志文件最大量,总日志量不能超过totalSizeCap-->
<maxFileSize>${maxFileSize}</maxFileSize>
<!--日志文件保留天数-->
<maxHistory>${maxHistory}</maxHistory>
<!-- 用来指定日志文件的上限大小,如果到了设置的值,就会删除旧的日志 -->
<totalSizeCap>${totalSizeCap}</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="ch.qos.logback.classic.PatternLayout">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>${logPattern}</pattern>
</layout>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="MQTT_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${logPath}/mq/mqtt_log_%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 单个日志文件最大量,总日志量不能超过totalSizeCap-->
<maxFileSize>${maxFileSize}</maxFileSize>
<!--日志文件保留天数-->
<maxHistory>${maxHistory}</maxHistory>
<!-- 用来指定日志文件的上限大小,如果到了设置的值,就会删除旧的日志 -->
<totalSizeCap>${totalSizeCap}</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="ch.qos.logback.classic.PatternLayout">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>${logPattern}</pattern>
</layout>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="GRPC_PROVIDER_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${logPath}/grpc/provider/grpc_provider_log_%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 单个日志文件最大量,总日志量不能超过totalSizeCap-->
<maxFileSize>${maxFileSize}</maxFileSize>
<!--日志文件保留天数-->
<maxHistory>${maxHistory}</maxHistory>
<!-- 用来指定日志文件的上限大小,如果到了设置的值,就会删除旧的日志 -->
<totalSizeCap>${totalSizeCap}</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="ch.qos.logback.classic.PatternLayout">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>${logPattern}</pattern>
</layout>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="GRPC_CONSUMER_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- yyyy-MM-dd 时间策略则为一天一个文件 -->
<fileNamePattern>${logPath}/grpc/consumer/grpc_consumer_log_%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 单个日志文件最大量,总日志量不能超过totalSizeCap-->
<maxFileSize>${maxFileSize}</maxFileSize>
<!--日志文件保留天数-->
<maxHistory>${maxHistory}</maxHistory>
<!-- 用来指定日志文件的上限大小,如果到了设置的值,就会删除旧的日志 -->
<totalSizeCap>${totalSizeCap}</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<!-- layout 负责把事件转换成字符串,格式化的日志信息的输出 -->
<layout class="ch.qos.logback.classic.PatternLayout">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>${logPattern}</pattern>
</layout>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="QUARTZ_PATROL_TASK" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${logPath}/quartz/job_run_task_log_%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 单个日志文件最大量,总日志量不能超过totalSizeCap-->
<maxFileSize>${maxFileSize}</maxFileSize>
<!--日志文件保留天数-->
<maxHistory>${maxHistory}</maxHistory>
<!-- 用来指定日志文件的上限大小,如果到了设置的值,就会删除旧的日志 -->
<totalSizeCap>${totalSizeCap}</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="ch.qos.logback.classic.PatternLayout">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>${logPattern}</pattern>
</layout>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="OPERATOR_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${logPath}/operator-log/operator_log_%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 单个日志文件最大量,总日志量不能超过totalSizeCap-->
<maxFileSize>${maxFileSize}</maxFileSize>
<!--日志文件保留天数-->
<maxHistory>${maxHistory}</maxHistory>
<!-- 用来指定日志文件的上限大小,如果到了设置的值,就会删除旧的日志 -->
<totalSizeCap>${totalSizeCap}</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="ch.qos.logback.classic.PatternLayout">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>${logPattern}</pattern>
</layout>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="APP_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${logPath}/app/app_log_%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 单个日志文件最大量,总日志量不能超过totalSizeCap-->
<maxFileSize>${maxFileSize}</maxFileSize>
<!--日志文件保留天数-->
<maxHistory>${maxHistory}</maxHistory>
<!-- 用来指定日志文件的上限大小,如果到了设置的值,就会删除旧的日志 -->
<totalSizeCap>${totalSizeCap}</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="ch.qos.logback.classic.PatternLayout">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>${logPattern}</pattern>
</layout>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--定时启动任务日志-->
<logger name="com.qif.patrolstation.stationapp.task.service.StartTaskQuartzJobBean" level="${logLevel}" additivity="${additivity}">
<appender-ref ref="QUARTZ_PATROL_TASK"/>
</logger>
<logger name="com.qif.patrolstation.stationapp.consumer" level="${logLevel}" additivity="${additivity}">
<appender-ref ref="GRPC_CONSUMER_LOG"/>
</logger>
<logger name="com.qif.patrolstation.stationapp.provider" level="${logLevel}" additivity="${additivity}">
<appender-ref ref="GRPC_PROVIDER_LOG"/>
</logger>
<logger name="com.qif.patrolstation.stationapp.mqtt.handle" level="${logLevel}" additivity="${additivity}">
<appender-ref ref="MQTT_LOG"/>
</logger>
<logger name="com.qif.dsa.log" level="${logLevel}" additivity="false">
<appender-ref ref="OPERATOR_LOG"/>
</logger>
<logger name="com.mhz.base.quartz " level="${logLevel}" additivity="false">
<appender-ref ref="APP_LOG"/>
</logger>
<logger name="com.qif.patrolstation.stationapp.record" level="${logLevel}" additivity="false">
<appender-ref ref="APP_LOG"/>
</logger>
<logger name="com.qif.patrolstation.stationapp.report" level="${logLevel}" additivity="false">
<appender-ref ref="APP_LOG"/>
</logger>
<logger name="com.qif.patrolstation.stationapp.linkage" level="${logLevel}" additivity="false">
<appender-ref ref="APP_LOG"/>
</logger>
<logger name="com.qif.patrolstation.stationapp.task" level="${logLevel}" additivity="false">
<appender-ref ref="APP_LOG"/>
</logger>
<logger name="org.apache.commons.beanutils" level="error" additivity="false"/>
<logger name="org.springframework.scheduling.quartz" level="info" additivity="false"/>
<logger name="org.quartz" level="info" additivity="false" />
<!--
<logger>用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。
<logger>仅有一个name属性,一个可选的level和一个可选的addtivity属性。
name:用来指定受此logger约束的某一个包或者具体的某一个类。
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
还有一个特殊值INHERITED或者同义词NULL,代表强制执行上级的级别。
如果未设置此属性,那么当前logger将会继承上级的级别。
addtivity:是否向上级logger传递打印信息。默认是true。
<logger>可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个logger
-->
<!--<logger name="org.springframework.web" level="info"/>-->
<!--<logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>-->
<!--
使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:
第一种把<root level="INFO">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息
第二种就是单独给dao下目录配置debug模式,代码如下,这样配置sql语句会打印,其他还是正常info级别:
-->
<!--
root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
不能设置为INHERITED或者同义词NULL。默认是DEBUG
可以包含零个或多个元素,标识这个appender将会添加到这个logger。
-->
<!--开发环境:打印控制台-->
<!--<springProfile name="dev">-->
<!-- <logger name="com.banuit.questions" level="debug"/> -->
<!--</springProfile>-->
<!--生产环境:输出到文件-->
<!--<springProfile name="pro">-->
<!--<root level="info">-->
<!--<appender-ref ref="CONSOLE" />-->
<!--<appender-ref ref="DEBUG_FILE" />-->
<!--<appender-ref ref="INFO_FILE" />-->
<!--<appender-ref ref="ERROR_FILE" />-->
<!--<appender-ref ref="WARN_FILE" />-->
<!--</root>-->
<!--</springProfile>-->
<!--docker日志对接的是控制台,所以没必要区分环境,如果是传统的war包外部部署,需要区分环境,配合springProfile使用即可-->
<root level="${logLevel}">
<!-- 控制台 -->
<appender-ref ref="STDOUT"/>
<appender-ref ref="ASYNC_LOG_DEBUG"/>
<appender-ref ref="ASYNC_LOG_INFO"/>
<appender-ref ref="ASYNC_LOG_WARN"/>
<appender-ref ref="ASYNC_LOG_ERROR"/>
</root>
</configuration>
<!-- 配置文件加载顺序: logback.xml > application.yml > logback-spring.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- https://github.com/spring-projects/spring-boot/blob/v1.5.13.RELEASE/spring-boot/src/main/resources/org/springframework/boot/logging/logback/defaults.xml -->
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<!-- logback项目名称 -->
<!-- <property name="appName" value="station"/> -->
<!-- 由于logback-spring的加载顺序在application.properties之后,所以可以将项目名取properties的配置 -->
<springProperty name="APP_NAME" source="spring.application.name" />
<!-- 日志路径-->
<springProperty name="LOG_PATH" source="logging.filePath" />
<!-- 日志级别 DEBUG INFO WARN ERROR -->
<property name="logLevel" value="INFO"/>
<!-- 是否向上级logger传递打印信息 -->
<property name="additivity" value="false"/>
<!-- 最大保存时间 30天-->
<property name="maxHistory" value="1"/>
<!-- 单文件对大容量 -->
<property name="maxFileSize" value="1KB" />
<!-- 日志文件总大小-->
<property name="totalSizeCap" value="3KB" />
<!-- lOGGER PATTERN 根据个人喜好选择匹配 -->
<!--日期 日志等级 线程名 类路径 方法名 行号 打印信息 换行-->
<property name="LOG_PATTERN" value="[%date{yyyy-MM-dd HH:mm:ss.SSS} [ %level] [traceId:%X{EAGLEEYE_TRACE_ID}] [%class:%line] - %m %n]"/>
<!--应用的日志模板-->
<appender name="APPLICATION" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/application_logs.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/app/${APP_NAME}_app.%d{yyyy-MM-dd}.%i.log </fileNamePattern>
<!-- 单个日志文件最大量,总日志量不能超过totalSizeCap-->
<maxFileSize>${maxFileSize}</maxFileSize>
<!--日志文件保留天数-->
<maxHistory>${maxHistory}</maxHistory>
<!-- 用来指定日志文件的上限大小,如果到了设置的值,就会删除旧的日志 -->
<totalSizeCap>${totalSizeCap}</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>${LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 控制台输出格式 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>"[ %-5level] [%date{yyyy-MM-dd HH:mm:ss.SSS}] %logger{16} [%line]- %msg%n"</pattern>
<charset>utf8</charset>
</encoder>
</appender>
<!-- 通用错误日志 -->
<appender name="COMMON_ERROR_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${LOG_PATH}/common_error.log</File>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<FileNamePattern>${LOG_PATH}/saved_error/${APP_NAME}_common_error.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!-- 单个日志文件最大量,总日志量不能超过totalSizeCap-->
<maxFileSize>${maxFileSize}</maxFileSize>
<!--日志文件保留天数-->
<maxHistory>${maxHistory}</maxHistory>
<!-- 用来指定日志文件的上限大小,如果到了设置的值,就会删除旧的日志 -->
<totalSizeCap>${totalSizeCap}</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>${LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 异常日志 -->
<appender name="COMMON_EXCEPTION_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${LOG_PATH}/common_exception.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${LOG_PATH}/common_exception_saved/${APP_NAME}_common_exception.%d{yyyy-MM-dd}.log</FileNamePattern>
<maxHistory>5</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--业务相关日志-->
<appender name="COMMON_BIZ_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/common-biz.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/common_biz_saved/${APP_NAME}_biz.%d{yyyy-MM-dd}.%i.log </fileNamePattern>
<!-- 单个日志文件最大量,总日志量不能超过totalSizeCap-->
<maxFileSize>${maxFileSize}</maxFileSize>
<!--日志文件保留天数-->
<maxHistory>${maxHistory}</maxHistory>
<!-- 用来指定日志文件的上限大小,如果到了设置的值,就会删除旧的日志 -->
<totalSizeCap>${totalSizeCap}</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>${LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- EMQ相关的日志-->
<appender name="MQTT_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${logPath}/mqtt_log.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${logPath}/mq/${APP_NAME}_mqtt_%d{yyyy-MM-dd}.%i.log </fileNamePattern>
<!-- 单个日志文件最大量,总日志量不能超过totalSizeCap-->
<maxFileSize>${maxFileSize}</maxFileSize>
<!--日志文件保留天数-->
<maxHistory>${maxHistory}</maxHistory>
<!-- 用来指定日志文件的上限大小,如果到了设置的值,就会删除旧的日志 -->
<totalSizeCap>${totalSizeCap}</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>${LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- TCP 协议相关-->
<appender name="TCP_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${LOG_PATH}/tcp_biz.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<FileNamePattern>${LOG_PATH}/tcp_saved/${APP_NAME}_tcp_biz.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!-- 单个日志文件最大量,总日志量不能超过totalSizeCap-->
<maxFileSize>${maxFileSize}</maxFileSize>
<!--日志文件保留天数-->
<maxHistory>${maxHistory}</maxHistory>
<!-- 用来指定日志文件的上限大小,如果到了设置的值,就会删除旧的日志 -->
<totalSizeCap>${totalSizeCap}</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>${LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- GRPC生产者 -->
<appender name="GRPC_PROVIDER_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${logPath}/grpc/provider.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${logPath}/grpc/provider/${APP_NAME}_grpc_provider.%d{yyyy-MM-dd}.%i.log </fileNamePattern>
<!-- 单个日志文件最大量,总日志量不能超过totalSizeCap-->
<maxFileSize>${maxFileSize}</maxFileSize>
<!--日志文件保留天数-->
<maxHistory>${maxHistory}</maxHistory>
<!-- 用来指定日志文件的上限大小,如果到了设置的值,就会删除旧的日志 -->
<totalSizeCap>${totalSizeCap}</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>${logPattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- GRPC消费者 -->
<appender name="GRPC_CONSUMER_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${logPath}/grpc/consumer.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- yyyy-MM-dd 时间策略则为一天一个文件 -->
<fileNamePattern>${logPath}/grpc/consumer/${APP_NAME}_grpc_consumer.%d{yyyy-MM-dd}.%i.log </fileNamePattern>
<!-- 单个日志文件最大量,总日志量不能超过totalSizeCap-->
<maxFileSize>${maxFileSize}</maxFileSize>
<!--日志文件保留天数-->
<maxHistory>${maxHistory}</maxHistory>
<!-- 用来指定日志文件的上限大小,如果到了设置的值,就会删除旧的日志 -->
<totalSizeCap>${totalSizeCap}</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>${logPattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 此logger约束,将EXCEPTION的日志输出到COMMON-EXCEPTION-APPENDER,错误日志输出到COMMON-ERROR-APPENDER -->
<logger name="EXCEPTION" level="${logLevel}" additivity="${additivity}">
<appender-ref ref="COMMON_EXCEPTION_APPENDER"/>
<appender-ref ref="COMMON_ERROR_APPENDER"/>
</logger>
<logger name="com.qif.patrolstation.stationapp.mqtt.handle" level="${logLevel}" additivity="${additivity}">
<appender-ref ref="MQTT_APPENDER"/>
</logger>
<logger name="com.qif.patrolstation.stationapp.consumer" level="${logLevel}" additivity="${additivity}">
<appender-ref ref="GRPC_CONSUMER_APPENDER"/>
</logger>
<logger name="com.qif.patrolstation.stationapp.provider" level="${logLevel}" additivity="${additivity}">
<appender-ref ref="GRPC_PROVIDER_APPENDER"/>
</logger>
<logger name="com.mhz.base.quartz " level="info" additivity="true">
<appender-ref ref="COMMON_BIZ_APPENDER"/>
</logger>
<root level="info">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="COMMON_BIZ_APPENDER"/>
<appender-ref ref="COMMON_EXCEPTION_APPENDER"/>
<appender-ref ref="COMMON_ERROR_APPENDER"/>
</root>
</configuration>
参考文档: