logback配置和使用
程序员文章站
2022-06-21 19:58:51
简介 logback是由log4j创始人设计的又一个开源日志组件。当前分成三个模块: logback core是其它两个模块的基础模块。 logback classic是log4j的一个 改良版本。此外logback classic完整实现SLF4J API,使你可以很方便地更换成其它日志系统,如l ......
简介
logback是由log4j创始人设计的又一个开源日志组件。当前分成三个模块:
logback-core是其它两个模块的基础模块。
logback-classic是log4j的一个 改良版本。此外logback-classic完整实现slf4j api,使你可以很方便地更换成其它日志系统,如log4j或jdk14 logging。
logback-access访问模块与servlet容器集成提供通过http来访问日志的功能。
配置
配置pom.xml
logback需要logback-core、logback-classic、slf4j-api、logback-access这4个依赖。其中logback-classic已经包含了logback-core和slf4j-api依赖,由于maven依赖的传递性,所以我们只需导入logback-classic和logback-access依赖即可。
<dependencies> <dependency> <groupid>ch.qos.logback</groupid> <artifactid>logback-classic</artifactid> <version>1.3.0-alpha4</version> </dependency> <dependency> <groupid>ch.qos.logback</groupid> <artifactid>logback-access</artifactid> <version>1.3.0-alpha4</version> </dependency> </dependencies>
初始化步骤
1. 在类路径中查找logback-test.xml文件。
2. 如果没有找到,则在类路径中查找logback.groovy文件。
3. 如果没有找到,则在类路径中查找logback.xml文件。
4. 如果没有找到,则尝试使用serviceloader加载classpath下meta-inf\services\ch.qos.logback.classic.spi.configurator文件中配置的com.qos.logback.classic.spi.configurator实现类(configurator文件内容为实现类的完全限定类名)。
5. 如果还是没有找到,则会加载默认配置,日志默认会输出到控制台,也就是使用basicconfigurator,basicconfigurator也是com.qos.logback.classic.spi.configurator接口的实现类。
public class basicconfigurator extends contextawarebase implements configurator { public basicconfigurator() { } public void configure(loggercontext lc) { addinfo("setting up default configuration."); 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); } }
使用logback.xml
<configuration scan="true" scanperiod="30 seconds"> <!-- 自定义属性,通过${}访问 --> <property name="filepath" value="/logs/" /> <!-- 输出到控制台 --> <appender name="stdout" class="ch.qos.logback.core.consoleappender"> <encoder> <pattern>%d{hh:mm:ss.sss} [%thread] %-5level %logger{36} %msg%n</pattern> </encoder> </appender> <!-- 输出到文件 --> <appender name="file" class="ch.qos.logback.core.rolling.rollingfileappender"> <!-- 文件路径 --> <file>${filepath}app.log</file> <!-- 日志输出格式化 --> <encoder> <pattern>%date [%level] [%thread] %logger{80} [%file : %line] %msg%n</pattern> </encoder> <!-- 滚动策略 --> <rollingpolicy class="ch.qos.logback.core.rolling.timebasedrollingpolicy"> <!-- 每日滚动 --> <filenamepattern>${filepath}app.log%d{yyyy-mm-dd}.log</filenamepattern> <!-- 将30天的日志总大小限制在3gb内 --> <maxhistory>30</maxhistory> <totalsizecap>3gb</totalsizecap> </rollingpolicy> </appender> <!-- 基于尺寸和时间的滚动策略 --> <appender name="rolling" class="ch.qos.logback.core.rolling.rollingfileappender"> <file>${filepath}other.log</file> <rollingpolicy class="ch.qos.logback.core.rolling.sizeandtimebasedrollingpolicy"> <filenamepattern>${filepath}other.log%d{yyyy-mm-dd}%i.log</filenamepattern> <!-- 每个日志文件最多100mb,保存60天的历史记录,总大小不超过20gb --> <maxfilesize>1kb</maxfilesize> <maxhistory>60</maxhistory> <totalsizecap>20gb</totalsizecap> </rollingpolicy> <encoder> <pattern>%date [%level] [%thread] %logger{80} [%file : %line] %msg%n</pattern> </encoder> </appender> <!-- name属性指定包名或者完全限定类名 --> <logger name="service.otherservice" level="debug"> <appender-ref ref="rolling" /> </logger> <!-- 根logger --> <root level="debug"> <!-- 配置输出源 --> <appender-ref ref="stdout" /> <appender-ref ref="file" /> </root> </configuration>
测试:
public class helloservice { private final static logger logger = loggerfactory.getlogger(helloservice.class); public static void main(string[] args) { //根据logback.xml中配置的日志级别,trace级别的日志将不会输出,只会输出debug及以上级别的日志。 //trace < debug < info < warn < error logger.trace("---------------trace---------------"); logger.debug("---------------debug---------------"); logger.info("---------------info---------------"); logger.warn("---------------warn---------------"); logger.error("---------------error---------------"); } }
常用技巧
1. 使用占位符
logger.debug("我是" + name + ",我今年" + age + "岁,很高兴认识你!");//普通方式 logger.debug("我是{},我今年{}岁,很高兴认识你!", name, age);//占位符方式(推荐)
当debug日志被禁用时,普通方式中,参数依然会被构造拼接,而在占位符方式中,参数不会进行构造拼接。
2. 使用时应该使用slf4j的api而不是使用logback的api(依赖日志门面,而不是依赖具体的日志实现,便于更换其他日志框架)
3. 自动重新加载配置文件
将
<configuration scan="true" scanperiod="30 seconds" >
...
</configuration>