一、Appender定义
1、ConsoleAppender
1 2 3 4 5
| <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%level] [%thread] %logger{36} => %message %n</pattern> </layout> </appender>
|
2、RollingFileAppender
1 2 3 4 5 6 7 8 9 10
| <appender name="fileLog" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>文件保存路径</file> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%level] [%thread] %logger{36} => %message %n</pattern> <charset>UTF-8</charset> </encoder> </appender>
|
3、AsyncAppender
1 2 3
| <appender name="AsyncLogFile" class="ch.qos.logback.classic.AsyncAppender"> <appender-ref ref="fileLog" /> </appender>
|
二、文件滚动策略
1、SizeAndTimeBasedRollingPolicy
1 2 3 4 5 6 7 8 9 10 11 12 13
| <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${TSF_LOG_DIR}/%d{yyyy-MM-dd,aux}/stdout-%d{yyyy-MM-dd HH}.%i.log.gz</fileNamePattern> <maxFileSize>100MB</maxFileSize> <maxHistory>${MAX_RESERVE}</maxHistory> <totalSizeCap>512MB</totalSizeCap> <cleanHistoryOnStart>true</cleanHistoryOnStart> </rollingPolicy>
|
2、FixedWindowRollingPolicy
1 2 3 4 5 6
| <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> <fileNamePattern>stdout.%i.log</fileNamePattern> <minIndex>1</minIndex> <maxIndex>4</maxIndex> </rollingPolicy>
|
三、日志级别和输出位置设置
1、全局默认
1 2 3 4
| <root level="info"> <appender-ref ref="AsyncLogFile" /> <appender-ref ref="STDOUT" /> </root>
|
2、指定类路径
1 2 3 4 5
| <logger name="cn.probiecoder" level="info" additivity="false" includeLocation="true" > <appender-ref ref="AsyncLogFile" /> <appender-ref ref="STDOUT" /> </logger>
|
四、在logback.xml中使用if条件
语法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <if condition="some conditional expression"> <then> ... </then> </if>
<if condition="some conditional expression"> <then> ... </then> <else> ... </else> </if>
|
表达式:
property()
或p()
:返回property
的字符串值,如果property
为定义,会返回空字符串(""
)
isDefined
:判断property
是否定义
isNull
:判断property
是否为null
在使用condition
前需要先引入如下依赖:
1 2 3 4 5
| <dependency> <groupId>org.codehaus.janino</groupId> <artifactId>janino</artifactId> <version>3.1.12</version> </dependency>
|
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <if condition='isDefined("TSF_ENABLED")'> <then> <if condition="${TSF_ENABLED} == false}"> <then> <property name="CONSOLE_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss} [%level [%thread] %logger{36} => %message %n"/> <property name="FILE_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss} [%level] [%thread] %logger{36} => %message %n"/> </then> <else> <property name="CONSOLE_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss} [%level] %trace [%thread] %logger{36} => %message %n"/> <property name="FILE_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss} [%level] %trace [%thread] %logger{36} => %message %n"/> </else> </if> </then> <else> <property name="CONSOLE_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss} [%level] %trace [%thread] %logger{36} => %message %n"/> <property name="FILE_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss} [%level] %trace [%thread] %logger{36} => %message %n"/> </else> </if>
|
通过-D
指定property
值
1
| java -DFLAG=xxx -jar jar
|
五、配置示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| <?xml version="1.0" encoding="UTF-8"?> <configuration> <if condition='isDefined("ENABLED")'> <then> <if condition="${ENABLED} == false}"> <then> <property name="CONSOLE_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss} [%level [%thread] %logger{36} => %message %n"/> <property name="FILE_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss} [%level] [%thread] %logger{36} => %message %n"/> </then> <else> <property name="CONSOLE_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss} [%level] %trace [%thread] %logger{36} => %message %n"/> <property name="FILE_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss} [%level] %trace [%thread] %logger{36} => %message %n"/> </else> </if> </then> <else> <property name="CONSOLE_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss} [%level] %trace [%thread] %logger{36} => %message %n"/> <property name="FILE_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss} [%level] %trace [%thread] %logger{36} => %message %n"/> </else> </if>
<property name="CHARSET" value="UTF-8" /> <property name="MAX_RESERVE" value="2"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>${CONSOLE_PATTERN}</pattern> </layout> </appender>
<appender name="fileLog" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_FILE}</file> <encoder> <pattern>${FILE_PATTERN}</pattern> <charset>${CHARSET}</charset> </encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${LOG_DIR}/%d{yyyy-MM-dd,aux}/stdout-%d{yyyy-MM-dd HH}.%i.log.gz</fileNamePattern> <maxFileSize>100MB</maxFileSize> <maxHistory>${MAX_RESERVE}</maxHistory> <totalSizeCap>512MB</totalSizeCap> <cleanHistoryOnStart>true</cleanHistoryOnStart> </rollingPolicy> </appender>
<appender name="AsyncLogFile" class="ch.qos.logback.classic.AsyncAppender"> <appender-ref ref="fileLog" /> </appender>
<root level="info"> <appender-ref ref="AsyncLogFile" /> <appender-ref ref="STDOUT" /> </root> </configuration>
|
六、附录
logback
依赖:
1 2 3 4 5 6 7 8 9 10
| <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.4.7</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.4.7</version> </dependency>
|
参考:
https://janino-compiler.github.io/janino/
https://logback.qos.ch/manual/configuration.html#conditional