配置文件中:file标签中的路径如果不存在会自动创建,而FileNamePattern标签中定义的文件目录不会自动生成,需要手动创建保证该目录存在,不然不会创建归档日志
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>logback</contextName>
<!-- 此处为自己手写的获取hostname类, 在后面可以根据${hostname}获取服务器环境变量中的hostname -->
<define name="hostname" class="com.ss.cc.webmvc.aspect.CanonicalHostNamePropertyDefiner"/>
<!-- 日志级别排序为: TRACE < DEBUG < INFO < WARN < ERROR -->
<!--控制台输出内容的颜色转换以及格式-->
<substitutionProperty name="logging.pattern.console"
value="%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
<!--日志文件输出内容的格式-->
<substitutionProperty name="logging.pattern.file"
value="%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule conversionWord="wex"
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRule conversionWord="wEx"
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
<!--输出到控制台-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!--控制台使用layout节点-->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>
${logging.pattern.console}
</pattern>
</layout>
</appender>
<!--按天生成日志-->
<appender name="infoFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--滚动策略,我配置了按天生成日志文件-->
<!--相对路径,生成的文件就在项目根目录下-->
<file>/data/logs/ci/debug/online/${hostname}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- FileNamePattern标签中定义的文件目录不会自动生成,需要手动创建保证该目录存在,不然不会创建归档日志 -->
<FileNamePattern>
<!-- /data/logs/ci/debug/online/${hostname}/%d{yyyy-MM-dd}.%i.log-->
/data/logs/ci/debug/history/${hostname}.%d{yyyy-MM-dd}.%i.log
<!-- E:/logs/debug/%d{yyyy-MM}/cim-ci_%d{yyyy-MM-dd}.log-->
</FileNamePattern>
<!--注意超过365天的日志文件会被删除,即使已经按天分开也会删除-->
<!-- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">-->
<!-- <maxFileSize>1MB</maxFileSize>-->
<!-- </timeBasedFileNamingAndTriggeringPolicy>-->
<MaxHistory>10</MaxHistory>
<maxFileSize>20MB</maxFileSize>
<totalSizeCap>2GB</totalSizeCap>
</rollingPolicy>
<!--日志文件里只保存ERROR及以上级别的日志-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<OnMatch>ACCEPT</OnMatch>
</filter>
<!--文件使用encoder节点-->
<encoder>
<Pattern>
${logging.pattern.file}
</Pattern>
</encoder>
</appender>
<!--按天生成日志-->
<appender name="errorFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--滚动策略,我配置了按天生成日志文件-->
<file>/data/logs/ci/error/online/${hostname}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--相对路径,生成的文件就在项目根目录下-->
<FileNamePattern>
/data/logs/ci/error/history/${hostname}.%d{yyyy-MM-dd}.%i.log
<!-- E:/logs/error/%d{yyyy-MM}/cim-ci_%d{yyyy-MM-dd}.log-->
</FileNamePattern>
<!--注意超过365天的日志文件会被删除,即使已经按天分开也会删除-->
<MaxHistory>60</MaxHistory>
<maxFileSize>20MB</maxFileSize>
</rollingPolicy>
<!--日志文件里只保存ERROR及以上级别的日志-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<!--文件使用encoder节点-->
<encoder>
<Pattern>
${logging.pattern.file}
</Pattern>
</encoder>
</appender>
<!--这个logger里的配置相当于之前yml里的logging.level.com.lpc: trace-->
<!--additivity的作用-->
<!--true,则子Logger不止会在自己的appender里输出,还会在root的logger的appender里输出-->
<!--而这个logger里没配置appender,所以得交给root打印-->
<!--所以com.lpc包里的日志从TRACE级别开始-->
<!--其他包里的日志根据root的配置从TRACE级别开始打印-->
<!-- </logger>-->
<!-- 不显示apollo的日志信息-->
<logger name="com.ctrip.framework.apollo" level="FATAL" additivity="false">
</logger>
<root level="INFO">
<appender-ref ref="console"/>
<appender-ref ref="infoFile"/>
<appender-ref ref="errorFile"/>
<!-- <appender-ref ref="INFOFILE"/>-->
</root>
</configuration>
</configuration>
获取hostname的代码编写;自定义代码获取其他属性也可以参照该方法获取
import java.net.InetAddress;
import java.net.UnknownHostException;
import ch.qos.logback.core.PropertyDefinerBase;
public class CanonicalHostNamePropertyDefiner extends PropertyDefinerBase {
@Override
public String getPropertyValue() {
InetAddress ia;
try {
ia = InetAddress.getLocalHost();
String host = ia.getHostName();//获取计算机主机名
return host;
} catch (UnknownHostException e) {
e.printStackTrace();
}
return null;
}