logback配置说明
logback配置说明
官网:https://logback.qos.ch/manual/introduction.html
1.依赖
<!-- 版本自己加 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
2.配置文件
配置文件要放在classpath路径下,文件名logback.xml
<!--
参考:https://logback.qos.ch/manual/appenders.html#TimeBasedRollingPolicy
-->
<!--
根节点<configuration>,其下包含以下三个属性
scan:此属性为true时,配置文件如果发生改变,将会重新加载,默认值为true。
scanPeriod:设置监测配置文件是否有修改的时间间隔,当scan为true时,该属性生效。默认的时间间隔为1分钟。在设置时,如果没有指定时间单位,默认时间单位是毫秒。
debug:当此属性为true时,将打印出logback内部日志信息,实时查看logback运行状态。
-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!--
子节点<contextName>用来设置上下文名称,每个logger都关联到logger上下文,默认上下文名称为default。可以用<contextName>其他名称来区分不同应用程序的记录,一旦设置,不能修改。
-->
<contextName>myName</contextName>
<!--
子节点<property>用来定义变量值,通过该标签定义的值会被插入到logger上下文中,可以用"${变量的name}"来取得变量的值,
其下有两个属性:name表示变量的名称,每一个变量有一个唯一的名称;value表示变量的值,不同的变量可以有相同的值。
-->
<property name="logFilePath" value="./log" />
<!--
子节点<timestamp>用于获取时间戳字符串,有两个基本属性:
key用来标识此<timestamp>的名字,
datePattern设置当前时间转化为字符串的模式,遵循java.txt.SimpleDateFormat的格式。
timeReference="contextBirth" 每次获取这个变量,都会取当前的时间,加上这句,当前变量就固定为xml配置文件加载时的时间
-->
<timestamp key="timestampName" datePattern="yyyy-MM-dd HH:mm:ss"/>
<timestamp key="timestampName2" datePattern="yyyy-MM-dd HH:mm:ss" timeReference="contextBirth"/>
<!--
子节点<appender>用于配置写日志的组件,有两个必要属性:name用于指定appender的名称,每一个appender的名称
唯一,class指定appender的全限定名。appender有三种类型,分别是:ConsoleAppender、FileAppender、RollingFileAppender,
ConsoleAppender是把日志输出到控制台,FileAppender是把日志添加到文件,而RollingFileAppender是把日志输出到文件并且定期进行清理。
-->
<!-- 控制台输出 -->
<appender name="ConsoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
</pattern>
</layout>
</appender>
<!-- 文件输出,输出到单个文件 -->
<appender name="FileAppender" class="ch.qos.logback.core.FileAppender">
<!--被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。-->
<file>${logFilePath}/FileAppender.log</file>
<!-- 如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。 -->
<append>true</append>
<!--对记录事件进行格式化-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是 false。-->
<prudent>false</prudent>
</appender>
<!-- 文件输出,按照每天/月/年生成日志文件,滚动周期是通过FileNamePattern的%d{yyyy-MM-dd}来推断的 -->
<appender name="RollingFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。 -->
<file>${logFilePath}/RollingFileAppender.log</file>
<!--
当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名。属性class定义具体的滚动策略类,
"ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"是最常用的滚动策略,它根据时间和大小来制定滚动策略,既负责滚动也负责出发滚动。
-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--
必要节点,包含文件名及“%d”转换符,“%d”可以包含一个java.text.SimpleDateFormat指定的时间格式,如:%d{yyyy-MM}。如果直接使用 %d,
默认格式是 yyyy-MM-dd。RollingFileAppender的file字节点可有可无,通过设置file,可以为活动文件和归档文件指定不同位置,
当前日志总是记录到file指定的文件(活动文件),活动文件的名字不会改变;如果没设置file,活动文件的名字会根据fileNamePattern 的值,
每隔一段时间改变一次。“/”或者“\”会被当做目录分隔符。
-->
<!--日志文件输出的归档文件名-->
<!--
文件名可以用来推断滚动周期,至少要有一个%d{},用于推断。
%d{}可以有多个,但是只能有一个主的,用于推断周期,其他的使用aux来标记为副的
/var/log/%d{yyyy/MM, aux}/myapplication.%d{yyyy-MM-dd}.log
TimeBasedRollingPolicy支持自动文件压缩。如果fileNamePattern选项的值以结尾,则会启用此功能 例如:/wombat/foo.%d.gz。支持.gz or .zip.
%d 和 %i 必须存在,不然就不会按天按大小切割
-->
<FileNamePattern>${logFilePath}/RollingFileAppender.%d{yyyy-MM-dd}/RollingFileAppender.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!--
可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件
-->
<maxHistory>30</maxHistory>
<maxFileSize>100KB</maxFileSize>
<!--
可选的totalSizeCap属性控制所有存档文件的总大小。超过总大小上限时,将异步删除最旧的存档。totalSizeCap属性也需要设置maxHistory属性。
此外,“最大历史记录”限制总是首先应用,“总尺寸上限”限制总是其次应用。
totalSizeCap属性可以以字节、千字节、兆字节或千兆字节为单位指定,方法是分别用KB、MB和GB作为数值的后缀。
例如,5000000、5000KB、5MB和2GB都是有效值,前三个值相等。不带后缀的数值以字节为单位。
默认情况下,totalSizeCap设置为0,这意味着没有总大小上限。
-->
<totalSizeCap>0</totalSizeCap>
<!--
如果设置为true,将在appender启动时执行存档删除。默认情况下,此属性设置为false。
档案移除通常在翻滚期间执行。但是,有些应用程序可能无法持续足够长的时间,无法触发翻滚。因此,对于这样的短期应用程序,归档删除可能永远没有机会执行。
通过将cleanHistoryOnStart设置为true,可在appender启动时执行存档删除。
-->
<cleanHistoryOnStart>false</cleanHistoryOnStart>
</rollingPolicy>
<!--
此选项是通知RollingFileAppender何时激活滚动过程的组件。
TriggeringPolicy实现负责指示RollingFileAppender何时进行滚动。
SizeBasedTriggeringPolicy查看当前活动文件的大小。如果其增长大于指定的大小,它将向拥有RollingFileAppender的用户发出信号,以触发现有活动文件的滚动。
SizeBasedTriggeringPolicy只接受一个参数,即maxFileSize,默认值为10 MB。
maxFileSize选项可以以字节、千字节、兆字节或千兆字节为单位指定,方法是分别用KB、MB和GB作为数值的后缀。例如,5000000、5000KB、5MB和2GB都是有效值,前三个值相等。
-->
<!--
触发策略,日志文件最大的大小,如果用了SizeAndTimeBasedRollingPolicy或者TimeBasedRollingPolicy,这种自带触发的,不需要再加triggeringPolicy,不然他原本的和这个都不生效了
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>20KB</maxFileSize>
</triggeringPolicy>
-->
<layout class="ch.qos.logback.classic.PatternLayout">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符,有啥参数可以参考PatternLayout-->
<!--
%logger{50}
-->
<pattern>
<!--
%logger logger的名字,%logger{10},可以限定输出长度,全类名最后一段不受影响,其他段最多缩短到1个字符
%class 调用logger.error()生成日志的类的全类名,%class{10},可以限定输出长度,全类名最后一段不受影响,其他段最多缩短到1个字符
%contextName 当前配置文件的contextName标签内容
%d 时间,可以%d{yyyy-MM-dd HH:mm:ss}格式化
%file 调用logger.error()生成日志的类的文件名
%caller 调用堆栈
%line 源文件中调用logger.error()的行号
%message logger.error()的参数,就是你主要想输出的内容
%method 调用logger.error()的那个方法名
%level 日志级别,error还是debug
%thread 线程名
%exception 异常堆栈信息
%xException 异常堆栈信息,会说明哪个jar包,例如at com.xyz.Wombat(Wombat.java:57) ~[wombat-1.3.jar:1.3]
%rootException 异常堆栈信息,会一直输出到最上层的root根
%20logger 如果不够20字符,则左侧填充空格
%-20logger 如果不够20字符,则右侧填充空格
%.5logger 如果超过5个字符,则截取
%10.15logger 不够10个字符就左填充空格,超过15个字符就截取
%20(%level %logger) ()是按组应用,%20(%level %logger) 等价于 %20level %20logger
%highlight(%-5level) %highlight()高亮显示,只能在控制台用
%red(%-5level) %red()标红显示
%n 空行
-->
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
</pattern>
</layout>
<!--
三个日志过滤器:LevelFilter、ThresholdFilter、EvaluatorFilter
LevelFilter:严格接受指定级别的日志
<filter class="ch.qos.logback.classic.filter.LevelFilter">
// 设置日志级别
<level>ERROR</level>
// 如果跟该日志水平相匹配,则接受
<onMatch>ACCEPT</onMatch>
// 如果跟该日志水平不匹配,则过滤掉
<onMismatch>DENY</onMismatch>
</filter>
ThresholdFilter:接受严重程度大于等于指定级别的日志
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
EvaluatorFilter:按照表达式来接受日志
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator class="ch.qos.logback.classic.boolex.GEventEvaluator">
<expression>
e.level.toInt() >= WARN.toInt() && !(e.mdc?.get("req.userAgent") =~ /Googlebot|msnbot|Yahoo/ )
</expression>
</evaluator>
<OnMismatch>DENY</OnMismatch>
<OnMatch>NEUTRAL</OnMatch>
</filter>
DEBUG:输出调试信息;指出细粒度信息事件对调试应用程序是非常有帮助的。
INFO: 输出提示信息;消息在粗粒度级别上突出强调应用程序的运行过程。
WARN: 输出警告信息;表明会出现潜在错误的情形。
ERROR:输出错误信息;指出虽然发生错误事件,但仍然不影响系统的继续运行。
FATAL: 输出致命错误;指出每个严重的错误事件将会导致应用程序的退出。
OFF level > FATAL > ERROR > WARN > INFO > DEBUG > ALL level;范围大的会包含范围小的,
例如日志设置为INFO级别的话则FATAL、ERROR、WARN、INFO的日志开关都是打开的,而DEBUG的日志开关将是关闭的。
Log4j或logback建议只使用四个级别,优先级从高到低分别是 ERROR、WARN、INFO、DEBUG。
-->
<!-- 过滤器,严格接受指定级别的日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ALL</level>
</filter>
</appender>
<!--
指定包里面的类使用那个appender输出日志
name:指定关联的package,如果是包名,则需要这样获取logger:Logger log = LoggerFactory.getLogger(WxMessagePushWebApplication.class);只要类在包内就行
如果是普通名称,例如:fileLogger,那么就需要Logger log = LoggerFactory.getLogger("fileLogger");
level:表明指记录哪个日志级别以上的日志
appender-ref:指定logger向哪个文件输出日志信息
additivity:父级logger是否生效,默认true。如果为false,则只有当前logger生效,父级logger不生效
-->
<logger name="com.example.wxmessagepushweb" level="ALL" additivity="true">
<appender-ref ref="RollingFileAppender" />
</logger>
<root level="WARN">
<appender-ref ref="ConsoleAppender"/>
</root>
</configuration>
3.使用
public class WxMessagePushWebApplication {
static public Logger log = LoggerFactory.getLogger(WxMessagePushWebApplication.class);
public static void main(String[] args) throws Exception {
for (int j = 0; j < 5; j++) {
for (int i = 0; i < 1000; i++) {
log.error("测试日志 error" + i);
}
for (int i = 0; i < 1000; i++) {
log.warn("测试日志 warn" + i);
}
for (int i = 0; i < 1000; i++) {
log.info("测试日志 info" + i);
}
for (int i = 0; i < 1000; i++) {
log.debug("测试日志 debug" + i);
}
Thread.sleep(1000);
}
}
}
4.整合springboot
springboot的starter里面本身就自带了slf4j、logback的依赖,所以我们不需要额外加。
配置文件的名字可以放在resources目录中,logback.xml、logback-dev.xml、logback-spring.xml,这三种名字都可以,不过spring更推荐-spring结尾的名字。
当然,可以指定位置,需要在spring的配置文件中加上配置,例如:logging.config=./log/logback.xml