springboot logback.xml配置
logback.xml
文件加载
public class ContextInitializer {
final public static String GROOVY_AUTOCONFIG_FILE = "logback.groovy";
final public static String AUTOCONFIG_FILE = "logback.xml";
final public static String TEST_AUTOCONFIG_FILE = "logback-test.xml";
final public static String CONFIG_FILE_PROPERTY = "logback.configurationFile";
public URL findURLOfDefaultConfigurationFile(boolean updateStatus) {
ClassLoader myClassLoader = Loader.getClassLoaderOfObject(this);
URL url = findConfigFileURLFromSystemProperties(myClassLoader, updateStatus);
//从系统路径中加载日志配置文件
if (url != null) {
return url;
}
url = getResource(TEST_AUTOCONFIG_FILE, myClassLoader, updateStatus);
if (url != null) {
return url;
} //项目类路径中加载logback-test.xml
url = getResource(GROOVY_AUTOCONFIG_FILE, myClassLoader, updateStatus);
if (url != null) {
return url;
} //项目类路径中加载logback.groovy
return getResource(AUTOCONFIG_FILE, myClassLoader, updateStatus);
//项目类路径中加载logback.xml
}
private URL findConfigFileURLFromSystemProperties(ClassLoader classLoader, boolean updateStatus) {
String logbackConfigFile = OptionHelper.getSystemProperty(CONFIG_FILE_PROPERTY);
//系统变量logback.configurationFile指定文件位置
if (logbackConfigFile != null) {
URL result = null;
try {
result = new URL(logbackConfigFile);
return result;
} catch (MalformedURLException e) {
// so, resource is not a URL:
// attempt to get the resource from the class path
result = Loader.getResource(logbackConfigFile, classLoader);
if (result != null) {
return result;
}
File f = new File(logbackConfigFile);
if (f.exists() && f.isFile()) {
try {
result = f.toURI().toURL();
return result;
} catch (MalformedURLException e1) {
}
}
} finally {
if (updateStatus) {
statusOnResourceSearch(logbackConfigFile, classLoader, result);
}
}
}
return null;
}
private URL getResource(String filename, ClassLoader myClassLoader, boolean updateStatus) {
//项目类路径中加载日志配置文件
URL url = Loader.getResource(filename, myClassLoader);
if (updateStatus) {
statusOnResourceSearch(filename, myClassLoader, url);
}
return url;
}
configuration
根节点属性:
scan:当配置文件修改时是否重新加载,默认为true;
scanPeriod:扫描间隔时间,如"60 seconds",不带单位时,默认为毫秒;
debug:是否输出logback的内部日志,默认为false
子节点
<property name=" " value=" "/>:设置属性值
<contextName>name</contextName>:设置上下文的名称
<timestamp key="" datePattern=""/>:设置时间戳的格式
appender
configuration子节点,可设置日志输出目的地,可为控制台、文件、数据库等
appender属性:
name:appender的名称
class:appender使用的输出类
appender子节点:
<append>true</append>:是否在文件后面追加,默认为true
<encoder>。。。</encoder>:输出格式
<prudent>false</prudent>:为true时,多个appender向同一个文件输出时可保证安全,但效率较低,默认为false
*************
Appender类
ConsoleAppender:输出到控制台
public class ConsoleAppender<E> extends OutputStreamAppender<E> {
protected ConsoleTarget target; //systemout、systemerr,默认为systemout
protected boolean withJansi;
FileAppender:输出到文件
public class FileAppender<E> extends OutputStreamAppender<E> {
protected boolean append = true;
protected String fileName = null;
private boolean prudent = false;
private FileSize bufferSize = new FileSize(8192L);
RollingFileAppender:滚动输出文件,文件输出常用这个类
public class RollingFileAppender<E> extends FileAppender<E> {
File currentlyActiveFile;
TriggeringPolicy<E> triggeringPolicy;
RollingPolicy rollingPolicy;
RollingPolicy:文件滚动策略
public interface RollingPolicy extends LifeCycle {
void rollover() throws RolloverFailure;
void setParent(FileAppender<?> appender);
String getActiveFileName();
CompressionMode getCompressionMode();
}
TimeBasedRollingPolicy:时间滚动策略,常用此滚动策略
public class TimeBasedRollingPolicy<E> extends RollingPolicyBase implements TriggeringPolicy<E> {
private int maxHistory = 0;
protected FileSize totalSizeCap = new FileSize(0L);
TimeBasedFileNamingAndTriggeringPolicy<E> timeBasedFileNamingAndTriggeringPolicy;
boolean cleanHistoryOnStart = false;
SizeAndTimeBasedRollingPolicy:文件大小、时间滚动策略
public class SizeAndTimeBasedRollingPolicy<E> extends TimeBasedRollingPolicy<E> {
FileSize maxFileSize;
FixedWindowRollingPolicy:固定窗口滚动(设置滚动文件名字),需设置触发滚动策略
public class FixedWindowRollingPolicy extends RollingPolicyBase {
int maxIndex = 7; //窗口索引最大值
int minIndex = 1; //窗口索引最小值
public static final String ZIP_ENTRY_DATE_PATTERN = "yyyy-MM-dd_HHmm";
private static int MAX_WINDOW_SIZE = 20; //窗口索引最大为20
SizeBasedTriggeringPolicy:文件大小触发滚动策略
public class SizeBasedTriggeringPolicy<E> extends TriggeringPolicyBase<E> {
FileSize maxFileSize = new FileSize(10485760L);
*************
使用示例
输出到文件
使用时间滚动输出到文件
使用大小、时间滚动输出到文件
使用size限制文件大小,文件命名时需带%i
滚动策略FixedWindowRollingPolicy、触发滚动策略SizedBasedTriggeringPolicy
使用size限制文件大小时,文件命名需带%i
logger
logger属性
name:指定包名、或者类的全限定名
level:日志输出级别,如果不设置,默认与root的日志级别相同
additivity:是否输出到root节点,默认为true
子节点
<appender-ref ref=" "/>:ref引用的内容为appender的name
root
root为特殊的logger,只有一个属性level
子节点
<append-ref ref=" "/>:ref引用的内容为appender的name
配置示例
logback.xml:日志配置文件,放在resources目录下
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<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"/>
<property name="log.path" value="e:/hhhh/"/>
<property name="console.pattern" 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}"/>
<property name="file.pattern" 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}"/>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${console.pattern}</pattern>
</encoder>
</appender>
<appender name="file" class="ch.qos.logback.core.FileAppender">
<file>${log.path}/my.log</file>
<encoder>
<pattern>${file.pattern}</pattern>
</encoder>
</appender>
<appender name="file2" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/mylog.%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<pattern>${file.pattern}</pattern>
</encoder>
</appender>
<appender name="mysql" class="ch.qos.logback.classic.db.DBAppender">
<connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">
<dataSource class="com.alibaba.druid.pool.DruidDataSource">
<url>jdbc:mysql://localhost:3306/log?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8</url>
<driverClassName>com.mysql.cj.jdbc.Driver</driverClassName>
<username>root</username>
<password>123456</password>
</dataSource>
</connectionSource>
</appender>
<root level="info">
<appender-ref ref="console"/>
<appender-ref ref="file"/>
<appender-ref ref="file2"/>
<appender-ref ref="mysql"/>
</root>
</configuration>