一、logback概述
1、系统中的logger是按照包路径建立的一个树状结构,root为根节点,子logger会继承root根logger的配置,子logger也可单独配置,和root不一样的日志策略和级别。
2、日志重要级别按 error => warn =>info => debug =>trace 排序,若日志级别定义为warn,则记录error、warn两级的日志
二、配置步骤
1)添加依赖
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.1.7</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.7</version>
</dependency>
2)创建配置文件
在代码根目录创建名称为logback.xml
的配置文件
3)编写配置文件
1、添加根节点
<configuration scan="true" scanPeriod="60 seconds" debug="true">
-
scan="true" 告诉logback需要扫描配置文件,根据变动更新配置
-
scanPeriod="60 seconds" 与第一个参数配合使用,每60s扫描一次
-
debug="true" 设置为true,logback打印本身框架跟踪信息,如:
debug="true"
1.the configuration file is found 配置文件找到<br /> 2.the configuration file is well-formed XML. 配置文件格式正确
2、添加日志根路径参数
<property name="LOG_HOME" value="${catalina.base}/logs" />
${catalina.base}
会被自动替换成tomcat的根路径。这里创建的LOG_HOME
可在配置文件中以${LOG_HOME}方式使用
3、添加appender
这里针对root根logger配置了info、warn、error配置了3个等级的appender。针对其中一个子logger配置了一个
name=“FILE_INFO_SPECIFY”
的appender。意图展示对项目里不同包、类与项目整体日志的差异化配置。
<appender name="FILE_ERROR"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<file>${LOG_HOME}/error/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/error/error-%d{yyyy-MM-dd}-%i.log.gz
</fileNamePattern>
<maxHistory>3</maxHistory>
<TimeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<MaxFileSize>100MB</MaxFileSize>
</TimeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
</appender>
<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>${LOG_HOME}/warn/warn.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/warn/warn-%d{yyyy-MM-dd}-%i.log
</fileNamePattern>
<maxHistory>180</maxHistory>
<TimeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<MaxFileSize>100MB</MaxFileSize>
</TimeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger -
%msg%n</pattern>
</encoder>
</appender>
<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>${LOG_HOME}/info/info.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/info/info-%d{yyyy-MM-dd}-%i.log
</fileNamePattern>
<maxHistory>180</maxHistory>
<TimeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<MaxFileSize>100MB</MaxFileSize>
</TimeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger -
%msg%n</pattern>
</encoder>
</appender>
<appender name="FILE_INFO_SPECIFY"
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>${LOG_HOME}/info2/info.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/info2/info-%d{yyyy-MM-dd}-%i.log
</fileNamePattern>
<maxHistory>180</maxHistory>
<TimeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<MaxFileSize>100MB</MaxFileSize>
</TimeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger -
%msg%n</pattern>
</encoder>
</appender>
4、配置root
<root level="warn">
<appender-ref ref="FILE_INFO" />
<appender-ref ref="FILE_WARN" />
<appender-ref ref="FILE_ERROR" />
</root>
root的level配置为warn,也就意味着warn、error两个appender会工作,而info这个appender不会工作。
5、配置单个logger(可选)
<logger name="com.xxx.AnotherController"
level="info" additivity="false">
<appender-ref ref="FILE_INFO_2" />
</logger>
针对
com.xxx.AnotherController
这个类配置level和appender,<appender-ref>
节点将name为FILE_INFO_2
的appender关联到这个logger。additivity属性设为false,表示不继承父logger的level和appender配置,默认为true。
####4)配置完毕,在项目中使用
private final Logger logger = LoggerFactory.getLogger(AnotherController.class);
这里的AnotherController.class对应着配置里的com.xxx.AnotherController。没有考察,这里应该是根据AnotherController.class的全路径名去找对应的logger。
logger.info("another info");
${catalina.base}/logs/info2/info.log 文件里输出
2016-11-04 11:05:58.359 [http-bio-8080-exec-1] INFO com.xxx.controller.AnotherController -
another info
三、完整的logback.xml
<!-- 配置文件根节点,scan设为true,响应配置文件的变化;scanPeriod设为60 seconds,
每60s检查一次变化,debug="false"表示logback本身的debug日志不记录
-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 日志文件根路径 -->
<property name="LOG_HOME" value="${catalina.base}/logs" />
<!-- 控制台输出appender配置 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>
<!-- 项目error级日志输出appender配置
ch.qos.logback.core.rolling.RollingFileAppender 为常用appender
当日志大小超过策略后,将文件内容转储到指定文件
-->
<appender name="FILE_ERROR"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!-- 工作文件路径 -->
<file>${LOG_HOME}/error/error.log</file>
<!-- 转储策略 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 转储文件路径,路径后加.gz或.zip,在转储后压缩 -->
<fileNamePattern>${LOG_HOME}/error/error-%d{yyyy-MM-dd}-%i.log.gz
</fileNamePattern>
<!-- 最多保留文件数,系统保留最新的文件,超过该数量的删除 -->
<maxHistory>3</maxHistory>
<!-- 超过100MB或跨天后转储 -->
<TimeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<MaxFileSize>100MB</MaxFileSize>
</TimeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<!-- 日志格式 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
</appender>
<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>${LOG_HOME}/warn/warn.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/warn/warn-%d{yyyy-MM-dd}-%i.log
</fileNamePattern>
<maxHistory>180</maxHistory>
<TimeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<MaxFileSize>100MB</MaxFileSize>
</TimeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger -
%msg%n</pattern>
</encoder>
</appender>
<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>${LOG_HOME}/info/info.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/info/info-%d{yyyy-MM-dd}-%i.log
</fileNamePattern>
<maxHistory>180</maxHistory>
<TimeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<MaxFileSize>100MB</MaxFileSize>
</TimeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger -
%msg%n</pattern>
</encoder>
</appender>
<appender name="FILE_INFO_SPECIFY"
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>${LOG_HOME}/info2/info.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/info2/info-%d{yyyy-MM-dd}-%i.log
</fileNamePattern>
<maxHistory>180</maxHistory>
<TimeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<MaxFileSize>100MB</MaxFileSize>
</TimeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger -
%msg%n</pattern>
</encoder>
</appender>
<!-- 根logger,记录warn级别以上的日志 -->
<root level="warn">
<!-- root logger关联的appender -->
<appender-ref ref="FILE_INFO" />
<appender-ref ref="FILE_WARN" />
<appender-ref ref="FILE_ERROR" />
</root>
<!-- com.xxx.controller.AnotherController logger,记录info级别以上的日志
additivity="false",不继承root的appender
-->
<logger name="com.xxx.controller.AnotherController"
level="info" additivity="false">
<appender-ref ref="FILE_INFO_2" />
</logger>
</configuration>