Logback是由log4j创始人设计的又一个开源日志组件, 查了一些资料说比log4j的性能还好, 以后将会逐步地替代掉log4j. 那么现在就来学学怎么使用logback吧
这里务必使用最新的版本
<dependency>
<groupId>ch.qos.logbackgroupId>
<artifactId>logback-classicartifactId>
dependency>
在resources
目录中,按如下新建一个logback-spring.xml配置文件.
appender是负责写日志的组件, 主要用来设置日志的输出位置, 日志文件的生成策略等
:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
:对记录事件进行格式化。
:当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。
: 告知 RollingFileAppender 合适激活滚动。
:当为true时,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但是有两个限制,1不支持也不允许文件压缩,2不能设置file属性,必须留空。TimeBaseRollingPolicy
, SizeBasedTriggeringPolicy
, 和``TimeBaseRollingPolicy
根据fileNamePattern
标签来表示什么周期触发一次生成新的日志文件,maxHistory
表示保存日志的最大单位时间, 下面这个表示每天生成一个日志文件,最多保存30天
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logFile.%d{yyyy-MM-dd}.logfileNamePattern>
<maxHistory>30maxHistory>
rollingPolicy>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%npattern>
encoder>
appender>
SizeBasedTriggeringPolicy
表示基于文件大小进行滚动
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>test.logfile>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>tests.%i.log.zipfileNamePattern>
<minIndex>1minIndex>
<maxIndex>3maxIndex>
rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>5MBmaxFileSize>
triggeringPolicy>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%npattern>
encoder>
appender>
上述配置表示按照固定窗口模式生成日志文件,当文件大于5MB时,生成新的日志文件。窗口大小是1到3,当保存了3个归档文件后,将覆盖最早的日志。
。
仅有一个name
属性,一个可选的level
和一个可选的addtivity
属性。
可以包含零个或多个
元素,标识这个appender将会添加到这个loger。
元素,但是它是根logger。只有一个level属性,因为已经被命名为"root".DEBUG
。
可以包含零个或多个
元素,标识这个appender将会添加到这个logger。
比如:
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%npattern>
encoder>
appender>
<logger name="logback"/>
<logger name="org.springframework.web" level="INFO" additivity="false">
<appender-ref ref="STDOUT"/>
logger>
<logger name="com.zgd.demo.LogerTest" additivity="true">
<appender-ref ref="STDOUT"/>
logger>
<root level="DEBUG">
<appender-ref ref="STDOUT" />
root>
configuration>
上面两个logger, 第一个的name是org.springframework.web
,这样这个包下的所有类的日志,都会采取这个logger的设置, 等级是INFO
, additivity
是false, 所以不会向上传递, 日志等级是INFO
第二个的name是com.zgd.demo.LogerTest
,这个类里的日志打印都会采用这个logger的设置, 因为没有设置等级, 使用默认ROOT
的等级DEBUG
, 因为additivity
是true,所以会向上传递日志
使用过滤器可以设置日志的传递. 日志经过各个过滤器,被抛弃或者被打印或者不处理
关于过滤器onMatch
表示匹配大于这个级别的日志和onMismatch
表示匹配小于于这个级别的日志,可以选的有
ACCEPT
–打印
DENY
– 不打印
NEUTRAL
–交给下一个过滤器处理
比如:
onMatch=“ACCEPT” 表示匹配该级别及以上
onMatch=“DENY” 表示不匹配该级别及以上
onMatch=“NEUTRAL” 表示该级别及以上的,由下一个filter处理,如果当前是最后一个,则表示匹配该级别及以上
onMismatch=“ACCEPT” 表示匹配该级别以下
onMismatch=“NEUTRAL” 表示该级别及以下的,由下一个filter处理,如果当前是最后一个,则不匹配该级别以下的
onMismatch=“DENY” 表示不匹配该级别以下的
注意顺序,级别大的在前
由于我使用了全局配置文件配置, 所以其中会有 ${log.home_url} 这样的参数 ,将其替换掉你需要的配置即可
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<jmxConfigurator/>
<property name="log.home_dir" value="/usr/local/springboot/log"/>
<property name="log.app_name" value="http-demo"/>
<property name="log.maxHistory" value="30"/>
<property name="log.level" value="debug"/>
<property name="log.maxSize" value="5MB" />
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%thread] %logger - %msg%n
pattern>
encoder>
appender>
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERRORlevel>
<onMatch>ACCEPTonMatch>
<onMismatch>DENYonMismatch>
filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>
${log.home_dir}/error/%d{yyyy-MM-dd}/${log.app_name}-%i.log
fileNamePattern>
<maxHistory>${log.maxHistory}maxHistory>
<MaxFileSize>${log.maxSize}MaxFileSize>
rollingPolicy>
<encoder>
<pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
pattern>
encoder>
appender>
<appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARNlevel>
<onMatch>ACCEPTonMatch>
<onMismatch>DENYonMismatch>
filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.home_dir}/warn/%d{yyyy-MM-dd}/${log.app_name}-%i.logfileNamePattern>
<maxHistory>${log.maxHistory}maxHistory>
<MaxFileSize>${log.maxSize}MaxFileSize>
rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%npattern>
encoder>
appender>
<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFOlevel>
<onMatch>ACCEPTonMatch>
<onMismatch>DENYonMismatch>
filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.home_dir}/info/%d{yyyy-MM-dd}/${log.app_name}-%i.logfileNamePattern>
<maxHistory>${log.maxHistory}maxHistory>
<MaxFileSize>${log.maxSize}MaxFileSize>
rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %logger - %msg%npattern>
encoder>
appender>
<appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUGlevel>
<onMatch>ACCEPTonMatch>
<onMismatch>DENYonMismatch>
filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.home_dir}/debug/%d{yyyy-MM-dd}/${log.app_name}-%i.logfileNamePattern>
<maxHistory>${log.maxHistory}maxHistory>
<MaxFileSize>${log.maxSize}MaxFileSize>
rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %logger - %msg%npattern>
encoder>
appender>
<appender name="TRACE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>TRACElevel>
<onMatch>ACCEPTonMatch>
<onMismatch>DENYonMismatch>
filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.home_dir}/trace/%d{yyyy-MM-dd}/${log.app_name}-%i.logfileNamePattern>
<maxHistory>${log.maxHistory}maxHistory>
<MaxFileSize>${log.maxSize}MaxFileSize>
rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %logger - %msg%npattern>
encoder>
appender>
<appender name="app" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.home_dir}/app/%d{yyyy-MM-dd}/${log.app_name}-%i.logfileNamePattern>
<maxHistory>${log.maxHistory}maxHistory>
<MaxFileSize>${log.maxSize}MaxFileSize>
rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %logger - %msg%npattern>
encoder>
appender>
<logger name="org.springframework.web" additivity="false" level="WARN">
<appender-ref ref="WARN"/>
logger>
<logger name="com.zgd" additivity="false" level="DEBUG" >
<appender-ref ref="app" />
<appender-ref ref="ERROR" />
<appender-ref ref="CONSOLE" />
logger>
<root>
<level value="${log.level}"/>
<appender-ref ref="CONSOLE"/>
root>
configuration>
上面的配置我设置了一个name为com.zgd
的logger ,因为我的所有类都是写在这个包下面的,我使用app(logger
的级别以上都输出),ERROR
(error级别以上的日志输出),CONSOLE
(打印到控制台)这三个appender. 如果大家需要所有级别的日志分级别输出, 将ROOT
节点注释打开就可以了
//注意导入的包都是slf4j的包
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogbackTest {
private static final Logger LOGGER = LoggerFactory.getLogger(LogbackTest.class);
public static void main(String[] args) {
LOGGER.trace("logback的--trace日志--输出了");
LOGGER.debug("logback的--debug日志--输出了");
LOGGER.info("logback的--info日志--输出了");
LOGGER.warn("logback的--warn日志--输出了");
LOGGER.error("logback的--error日志--输出了");
}
}
这里我将root中的级别改成了info , 所以只会输出info和比info级别更高的日志
级别:
trace-debug-info-warn-error-fetal
按照logger指定的输出级别输出,会覆盖root指定的级别。
更新 2019年12月6日16:28:36
有时候我们需要将info以上级别的都输出到info日志中,方便我们看异常信息,这时候上面的 match 和 dismatch什么的就不能满足要求了
解决办法: ch.qos.logback.classic.filter.ThresholdFilter
这个过滤器
<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFOlevel>
filter>
<file>${logPath}/info.logfile>
<append>trueappend>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${logPath}/info/info-%d{yyyyMMdd}-%i.logfileNamePattern>
<maxHistory>${maxHistory}maxHistory>
<MaxFileSize>${maxSize}MaxFileSize>
rollingPolicy>
<encoder>
<pattern>${pattern}pattern>
encoder>
appender>