引用: https://www.cnblogs.com/warking/p/5710303.html
参考官方使用文档:https://logback.qos.ch/manual/index.html
Logback官方网站: http://logback.qos.ch。它当前分为下面下个模块
- logback-core:其它两个模块的基础模块
- logback-classic:
logback-classic 包含了logback-core和slf4j的依赖
,可以通过它来轻松的实现与log4j
或者java.util.logging (JUL)
的切换. - logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能
使用
maven依赖
<logback.version>1.2.3</logback.version>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
测试用例
public class AppTest {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Test
public void testEmptyConfig() {
logger.debug("==DEBUG==");
logger.info("==INFO==");
logger.warn("==WARN==");
logger.error("==ERROR==");
}
}
打印结果:
默认加载步骤
logback使用如下步骤进行初始化:
- 尝试从
classpath
中寻找logback-test.xml
- 如果没有找到文件,则尝试从
classpath
中寻找logback.groovy
- 如果没有找到文件,则尝试从
classpath
中寻找logback.xml
- 如果仍然没有找到,则通过SPI从
META-INF\services\ch.qos.logback.classic.spi.Configurator
中找到Configurator
的具体实现类 - 如果上述都没有找到,则使用
BasicConfigurator
生成一个简单的ConsoleAppender
BasicConfigurator
//ch.qos.logback.classic.BasicConfigurator
public class BasicConfigurator extends ContextAwareBase implements Configurator {
public void configure(LoggerContext lc) {
ConsoleAppender<ILoggingEvent> ca = new ConsoleAppender<ILoggingEvent>();
ca.setContext(lc);
ca.setName("console");
LayoutWrappingEncoder<ILoggingEvent> encoder = new LayoutWrappingEncoder<ILoggingEvent>();
encoder.setContext(lc);
// same as
// PatternLayout layout = new PatternLayout();
// layout.setPattern("%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n");
TTLLLayout layout = new TTLLLayout();
layout.setContext(lc);
layout.start();
encoder.setLayout(layout);
ca.setEncoder(encoder);
ca.start();
Logger rootLogger = lc.getLogger(Logger.ROOT_LOGGER_NAME);
rootLogger.addAppender(ca);
}
}
等同于:
<configuration>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="console" />
</root>
</configuration>
logback常用配置
结构
结构图
demo
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<property name="app_name" value="study_logback"/>
<contextName>${app_name}</contextName>
<include resource="logback-01.xml"/>
<appender name="sdout" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>【%contextName】 %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<logger name="cn.jhs" level="INFO"/>
<root level="info">
<appender-ref ref="console_01"/>
<appender-ref ref="sdout"/>
</root>
</configuration>
解释
<configuration>
: 根节点<property>
: 设置全局属性,可以通过${XXX}
获取属性值<contextName>
: 用来设置上下文名称,默认上下文名称为default
。上图中的%contextName
就使用上下文。<appender>
:负责写日志的组件,它有两个必要属性name和class。name指定appender名称,class指定appender的全限定名.<loger>
: 用来设置某一个包
或具体的某一个类
的日志打印级别、以及指定<appender>
<root>
: 它也是一个<logger>
元素,但是它是根loger
,是所有<loger>
的上级。只有一个level属性
,<include>
: 引用其它的配置文件。被引用的配置如下,
logback-01.xml,使用
<included>
包裹。<?xml version="1.0" encoding="UTF-8"?> <included> <!--输出到控制台--> <appender name="console_01" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>【%contextName-01】 %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> </included>
<configuration>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
</configuration >
- scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
- scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
- debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
<appender>
ConsoleAppender
负责写日志的组件,它有两个必要属性name和class。name指定appender名称,class指定appender的全限定名。
**ConsoleAppender **
ConsoleAppender 把日志输出到控制台,有以下子节点
<encoder>
:对日志进行格式化。<target>
:字符串System.out(默认)
<property name="default_pattern"
value="【%contextName】 %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>
<appender name="sdout" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${default_pattern}</pattern>
</encoder>
</appender>
FileAppender
把日志添加到文件,有以下子节点:
<file>
:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。<append>
:如果是 true,日志被追加到文件结尾
,如果是 false,清空现存文件
,默认是true。<encoder>
:对记录事件进行格式化。<prudent>
:如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是 false。
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>testFile.log</file>
<append>true</append>
<encoder>
<pattern>${default_pattern}</pattern>
</encoder>
</appender>
RollingFileAppender
滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。有以下子节点:
<file>
略。
<append>
略。
<rollingPolicy>
当发生滚动时,决定RollingFileAppender的行为,涉及文件移动
和重命名。
- TimeBasedRollingPolicy:最常用的滚动策略,它根据时间来制定滚动策略。它有如下属性:
<fileNamePattern>
: 必要节点,包含文件名及“%d”转换符. “%d”可以包含一个java.text.SimpleDateFormat指定的时间格式,如:%d{yyyy-MM}
。如果直接使用 %d,默认格式是yyyy-MM-dd
<maxHistory>
: 可选节点。控制保留的归档文件的最大数量,超出数量就删除旧文件。单位是月
,即保留<maxHistory>
月以内的文件。
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- rollover daily -->
<fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
<!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB -->
<maxFileSize>100MB</maxFileSize>
<maxHistory>60</maxHistory>
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
- FixedWindowRollingPolicy: 根据固定窗口算法重命名文件的滚动策略。有以下子节点
<minIndex>
:窗口索引最小值<maxIndex>
:窗口索引最大值,当用户指定的窗口过大时,会自动将窗口设置为12。<fileNamePattern>
:必须包含“%i”.
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>tests.%i.log.zip</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>3</maxIndex>
</rollingPolicy>
SizeBasedTriggeringPolicy
查看当前活动文件的大小,如果超过指定大小会告知RollingFileAppender 触发当前活动文件滚动。只有一个节点:<maxFileSize>
:这是活动文件的大小,默认值是10MB。
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>100MB</MaxFileSize>
</triggeringPolicy>
<logger>
<logger>
<loger>
:用来设置某一个包或具体的某一个类的日志打印级别
、以及指定<appender>
。
- 一个
必写的name
属性:用来指定受此loger约束的某一个包或者具体的某一个类。 - 一个
可选的leve
:用来设置打印级别,大小写无关 - 一个
可选的addtivity
属性:是否向上级loger传递打印信息。如果当前<logger>
不打印日志,但是设置了addtivity=true
,则向<root>
传递,最终由<root>
的日志级别来判断是否打印。 零个或多个<appender-ref>
:标识这个appender
将会添加到这个logger
<root>
<root>
:它也是<logger>
元素,但是它是根loger
,是所有<loger>
的上级。只有一个level属性,因为name已经被命名为"root",且已经是最上级了。
其他
常用logger配置
mybatis打印sql
<!-- show parameters for hibernate sql 专为 Hibernate 定制 -->
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />
<logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />
<logger name="org.hibernate.SQL" level="DEBUG" />
<logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
<logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />
<!--myibatis log configure-->
<logger name="com.apache.ibatis" level="TRACE"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
<!-- springboot 打印sql,必须指定到每一个Mapper-->
<logger name="cn.jhs.xxx.dao.XXXMapper" level="DEBUG" />
springboot-mybatis 可以使用配置:
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
配置,全局的打印sql
也可以用:配置文件中使用配置:
logging.level. cn.jhs.xxx.dao.XXXMapper: DEBUG //包路径为mapper文件包路径
logback.xml样例
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="/home" />
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>
pattern
%contextName 上下文名称
%d 表示日期,可用 %d{yyyy-MM-dd HH:mm:ss.SSS}
%thread 表示线程名,
%-5level:从左显示5个字符宽度,显示日志级别
%msg:日志消息,
%n 是换行符
spring扩展profile支持
<!-- 测试环境+开发环境. 多个使用逗号隔开.
想要spring扩展profile支持,必须要以logback-spring.xml命名
-->
<springProfile name="test,dev">
<logger name="com.apache.ibatis" level="TRACE"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
</springProfile>