文章目录
一、Logback概述
logback是log4j的继承者,其分为三个模块:
模块名 | 说明 |
---|---|
logback-core | 基础模块,可以在此模块的基础上构建自己的模块 |
logback-classic | 1、通化并升级改良log4j 2、实现 slf4j 的API,方便日志框架的切换 |
logback-access | 集成Servlet容器,提供HTTP访问日志的功能 |
二、configuration属性
2.1、使用示例
<configuration scan="true" scanPeriod="60 seconds" debug="false">
</configuration>
2.2、参数说明
属性 | 可选值 | 说明 | 备注 |
---|---|---|---|
scan | true |false | 开启扫描,配置变更时logback自动更新配置 | 默认空,即false |
scanPeriod | 30 (|milli(second)?|second(e)?|minute|hour|day)s? | 扫描间隔: 数字 + 空格 + 日期单位 | 默认一分钟 若不指定时间单位,默认毫秒 |
debug | true |false | 注册OnConsoleStatusListener的简写模式,控制台输出logback内部日志 | 默认false |
packagingData | true |false | 每行日志都输出包信息其所在jar包信息 | 对性能影响较大,1.1.4及以上版本默认false |
2.3、解析
scan源码:ch.qos.logback.classic.joran.action.ConfigurationAction
package ch.qos.logback.classic.joran.action;
// ..............
public class ConfigurationAction extends Action {
static final String INTERNAL_DEBUG_ATTR = "debug";
static final String PACKAGING_DATA_ATTR = "packagingData";
static final String SCAN_ATTR = "scan";
static final String SCAN_PERIOD_ATTR = "scanPeriod";
// ....scan....
void processScanAttrib(InterpretationContext ic, Attributes attributes) {
String scanAttrib = ic.subst(attributes.getValue(SCAN_ATTR));
//
if (!OptionHelper.isEmpty(scanAttrib) && !"false".equalsIgnoreCase(scanAttrib)) {
ScheduledExecutorService scheduledExecutorService = context.getScheduledExecutorService();
URL mainURL = ConfigurationWatchListUtil.getMainWatchURL(context);
if (mainURL == null) {
addWarn("Due to missing top level configuration file, reconfiguration on change (configuration file scanning) cannot be done.");
return;
}
ReconfigureOnChangeTask rocTask = new ReconfigureOnChangeTask();
rocTask.setContext(context);
context.putObject(CoreConstants.RECONFIGURE_ON_CHANGE_TASK, rocTask);
String scanPeriodAttrib = ic.subst(attributes.getValue(SCAN_PERIOD_ATTR));
Duration duration = getDuration(scanAttrib, scanPeriodAttrib);
if (duration == null) {
return;
}
addInfo("Will scan for changes in [" + mainURL + "] ");
// Given that included files are encountered at a later phase, the complete list of files
// to scan can only be determined when the configuration is loaded in full.
// However, scan can be active if mainURL is set. Otherwise, when changes are detected
// the top level config file cannot be accessed.
addInfo("Setting ReconfigureOnChangeTask scanning period to " + duration);
ScheduledFuture<?> scheduledFuture = scheduledExecutorService.scheduleAtFixedRate(rocTask, duration.getMilliseconds(), duration.getMilliseconds(),
TimeUnit.MILLISECONDS);
context.addScheduledFuture(scheduledFuture);
}
}
// ........
}
2.4、示例
debug
=true ,示例
13:33:04.002 WARN --- [ http-nio-8080-exec-2] c.qbhj.logback.controller.LogController : warn......warn......
13:33:04.003 INFO --- [ http-nio-8080-exec-2] c.qbhj.logback.controller.LogController : info......info......
13:33:04.003 ERROR --- [ http-nio-8080-exec-2] c.qbhj.logback.controller.LogController : error......error......error......
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 以下为debug=true输出的logback内部日志 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
13:33:04,003 |-INFO in c.q.l.co.rolling.helper.RenameUtil - Renaming file [logs\case-logback\case-springboot-logback.error.log] to [logs\case-logback\history\case-springboot-logback.error.2023-03-18-13-32.0.log59129593988100.tmp]
13:33:04,005 |-INFO in ch.qos.logback.core.rolling.helper.Compressor - GZ compressing [logs\case-logback\history\case-springboot-logback.error.2023-03-18-13-32.0.log59129593988100.tmp] as [logs\case-logback\history\case-springboot-logback.error.2023-03-18-13-32.0.log.gz]
13:33:04,006 |-INFO in c.q.l.core.rolling.helper.TimeBasedArchiveRemover - Removed 0 Bytes of files
packagingData
=true,示例如下:
14:28:48.835 [btpool0-7] INFO c.q.l.demo.prime.PrimeAction - 99 is not a valid value
java.lang.Exception: 99 is invalid
at ch.qos.logback.demo.prime.PrimeAction.execute(PrimeAction.java:28) [classes/:na]
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431) [struts-1.2.9.jar:1.2.9]
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236) [struts-1.2.9.jar:1.2.9]
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432) [struts-1.2.9.jar:1.2.9]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) [servlet-api-2.5-6.1.12.jar:6.1.12]
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:502) [jetty-6.1.12.jar:6.1.12]
at ch.qos.logback.demo.UserServletFilter.doFilter(UserServletFilter.java:44) [classes/:na]
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1115) [jetty-6.1.12.jar:6.1.12]
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:361) [jetty-6.1.12.jar:6.1.12]
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:417) [jetty-6.1.12.jar:6.1.12]
at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230) [jetty-6.1.12.jar:6.1.12]
日志最后展示日志输出类的包信息,如 [struts-1.2.9.jar:1.2.9]
三、configuration子节点
3.1、configuration文件语法(节点配置)
如下(图片摘自官网):
3.2、变量
3.2.1、变量定义
- 语法:
<property>
<variable>
低版本可以通过<property>
来定义,1.0.7版本后可以通过<variable>
等同于<property>
,二者一样
- 使用示例:
<!-- 定义 -->
<variable name="USER_HOME" value="/home/sebastien" />
<property name="USER_HOME1" value="/home/sebastien" />
<!-- 引用外部配置 -->
<variable file="src/main/java/chapters/configuration/variables1.properties" />
<variable resource="resource1.properties" />
3.2.2、变量引用/使用
- 语法:
使用: ${变量名}
指定默认值:以
:-
分隔${name:-value}
- 示例:
<!-- 变量引用,语法: ${变量名} -->
<file>${USER_HOME}</file>
<!-- 指定默认值为 default-user,语法 ":-默认值"-->
<file>${USER_HOME:-default-user}</file>
3.3、<logger>、<root>详解
见 【Logback】<logger>、<root>标签详解