文章目录
简述
logback是java的日志开源组件,也是log4j创始人写的,属于改良版本,据说性能比log4j要好10倍;
同时,logback遵循SLF4J接口规范,由logback改为其他日志组件,比如log4j或者其他只要遵守SLF4J接口规范的,都只需要更换jar包,不需要修改业务代码。
总之,目前普遍推荐使用logback日志组件,下面记录一下它的配置文件中的各项配置含义。
logback.xml文件详解
直接上配置文件,结合配置文件介绍:
<?xml version="1.0" encoding="UTF-8"?>
<!--debug:默认false,要不要打印 logback内部日志信息,建议关闭;
scan:默认true,配置发送改变时,要不要重新加载;
scanPeriod:检测配置发生变化的时间间隔,默认1分钟,如果没给出时间单位,默认时间单位是毫秒;
-->
<configuration debug="false" scan="true" scanPeriod="50 seconds">
<!--定义常量开始---------------->
<!--日志上下文名称,后面输出格式中可以通过定义 %contextName 来打印日志上下文名称-->
<contextName>logback</contextName>
<!--定义参数,后面可以通过${app.name}使用-->
<property name="app.name" value="logback_test"/>
<!--trace<debug<info<warn<error-->
<property name="log.level" value="info"/>
<!--日志文件保留时间,30天-->
<property name="log.maxHistory" value="30"/>
<!-- 定义日志的根目录 -->
<property name="log.filePath" value="logs/webapps"/>
<!--
%d :日期格式;
%-5level :显示日志级别,-5表示占用5个字符;
[%thread] :线程名称,名字用中括号扩起来,方便识别;
%c :输出所属的类目,通常就是所在类的全名;
%L :显示所在类中的行数;
%msg :具体的日志信息;
%n: 换行符;
-->
<property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %c [%L] %msg%n"/>
<!--定义常量结束---------------->
<!--下面定义appender,不同的appender用于将日志输出到不同的地方,比如控制台和日志文件中-->
<!--控制台日志,ConsoleAppender 用于在屏幕控制台上输出日志-->
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<!--filter表示一个过滤器,用于设置日志级别,在此LEVEL之下的日志输出不会被打印出来;-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<!--这里定义了DEBUG,也就是控制台不会输出比DEBUG级别小的日志,比如trace级别;
如果不写,默认INFO级别-->
<level>DEBUG</level>
<!--符合DEBUG级别的接受-->
<onMatch>ACCEPT</onMatch>
<!--不符合DEBUG级别的拒绝-->
<onMismatch>DENY</onMismatch>
</filter>
<!-- encoder 默认配置为PatternLayoutEncoder,用于讲日志转化为字符串并输出到文件中 -->
<encoder>
<!--定义控制台输出格式,值就是上面定义的常量-->
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!--输出日志文件,RollingFileAppender表示滚动文件,支持每隔一段时间输出一个文件,比如每天-->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--定义日志输出的路径,因为此appender默认是info级别,所以取名info.log-->
<file>${log.filePath}/info.log</file>
<!--定义日志滚动的策略,基于时间滚动-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--定义文件滚动时的文件名的格式;这里格式为.log,还可以设置为.log.gz,表示自动压缩-->
<fileNamePattern>${log.filePath}/info/info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!--日志文件最大保存时长,-->
<maxHistory>${log.maxHistory}</maxHistory>
<!-- 日志量最大20GB,该属性在 1.1.6版本后 才开始支持-->
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<!--每个日志文件最大100MB-->
<maxFileSize>100MB</maxFileSize>
</triggeringPolicy>
<!--定义输出格式-->
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--root是默认的logger 这里设定输出级别是debug-->
<root level="debug">
<!--定义了两个appender,日志会通过往这两个appender里面写,ref的参数"stdout"和"file"就是上面appender标签的name参数值-->
<appender-ref ref="stdout"/>
<appender-ref ref="file"/>
</root>
<!--
logger用于告知logback应该关注哪个包下面的日志,
对于类路径以 com.example.logback 开头的Logger,输出级别设置为info;
这个logger没有指定appender,它会继承root节点中定义的那些appender
-->
<logger name="com.example.logback" level="${log.level}"/>
<!--通过 LoggerFactory.getLogger("mytest") 可以获取到这个logger-->
<!--由于这个logger自动继承了root的appender,root中已经有stdout的appender了,自己这边又引入了stdout的appender-->
<!--如果没有设置 additivity="false" ,就会导致一条日志在控制台输出两次的情况-->
<!--additivity表示要不要使用rootLogger配置的appender进行输出-->
<logger name="mytest" level="info" additivity="false">
<appender-ref ref="stdout"/>
</logger>
<!--由于设置了 additivity="false" ,所以输出时不会使用rootLogger的appender-->
<!--但是这个logger本身又没有配置appender,所以使用这个logger输出日志的话就不会输出到任何地方-->
<logger name="mytest2" level="info" additivity="false"/>
</configuration>
使用
引入maven依赖:
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
如果使用了springboot的web,默认回包含此依赖,无需额外添加。