一、logback介绍
Logback是由log4j创始人设计的另一个开源日志组件,官方网站: http://logback.qos.ch。它当前分为下面下个模块:
logback-core:其它两个模块的基础模块
logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging
logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能
二、logback取代log4j的理由
1、更快的实现:Logback的内核重写了,在一些关键执行路径上性能提升10倍以上。而且logback不仅性能提升了,初始化内存加载也更小了。
2、非常充分的测试:Logback经过了几年,数不清小时的测试。Logback的测试完全不同级别的。
3、Logback-classic非常自然实现了SLF4j:Logback-classic实现了SLF4j。在使用SLF4j中,你都感觉不到logback-classic。而且因为logback-classic非常自然地实现了slf4j , 所 以切换到log4j或者其他,非常容易,只需要提供成另一个jar包就OK,根本不需要去动那些通过SLF4JAPI实现的代码。
4、非常充分的文档 官方网站有两百多页的文档。
5、自动重新加载配置文件,当配置文件修改了,Logback-classic能自动重新加载配置文件。扫描过程快且安全,它并不需要另外创建一个扫描线程。这个技术充分保证了应用程序能跑得很欢在JEE环境里面。
剩余的在网上搜索吧。
三、logback的使用
1、需要的jar包:logback-access.jar、logback-classeic.jar、logback-core.jar、slf4j-api.jar,将这四个jar包引入到工程中即可
2、在根目录下添加logback.xml配置文件
3、代码:
package main.java.com.learn;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class logbackChi {
private final static Logger logger = LoggerFactory.getLogger(logbackChi.class);
public static void main(String[] args) {
logger.info("first child info logback");
logger.error("first child error logback");
logger.debug("first child dubug logback");
}
}
四、logback的几个特点及实现
1、自动加载配置文件的修改
在logback.xml的配置文件<configration>元素中设置scan属性为true,则配置文件的修改会被自动重新加载。
example:
<configuration scan="true">
...
</configuration>
设置了scan属性后。默认的配置的扫描时间时每分钟一次,可以通过属性scanPeriod去修改默认的扫描时间
example:
<configuration scan="true" scanPeriod="30 seconds" >
...
</configuration>
2、logback打印内部日志
在<configration>中设置属性debug属性为true相当于在代码中加入以下代码:
// print logback's internal status
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
StatusPrinter.print(lc);
会打印logback内部的日志 example:
0:30:25,863 |-INFO in c.q.l.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy - Roll-over at midnight.
10:30:25,866 |-INFO in c.q.l.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy - Setting initial period to Thu Jul 26 10:30:25 CST 2018
10:30:25,871 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE] - Active log file name: D://backlogs//TestWeb.log.2018-07-26.log
10:30:25,871 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE] - File property is set to [null]
10:30:25,872 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to INFO
10:30:25,872 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[ROOT]
10:30:25,873 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [FILE] to Logger[ROOT]
10:30:25,873 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
10:30:25,874 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@2134c210 - Registering current configuration as safe fallback point
2018-07-26 10:30:25.876 [main] INFO main.java.com.learn.logbackTest - first info logback
打印内部日志有助于定位logback初始的配置问题
3、设置logback.xml的位置
我们可以通过一个系统参数“logback.congrationFile”去特殊化配置文件的存放路径。这个参数可以是一个url。class path下的一个资源文件,或者工程外的一个文件。
当然我们也可以通过代码设置这个参数。但是这个系统参数必须在任何一个logger实例创建之前被设置:
example:
package main.java.com.learn;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.util.ContextInitializer;
import ch.qos.logback.core.util.StatusPrinter;
public class logbackTest {
public static void main(String[] args) {
System.setProperty(ContextInitializer.CONFIG_FILE_PROPERTY, "config/logback.xml");
logbackChi childLog = new logbackChi();
childLog.main(null);
}
}
package main.java.com.learn;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class logbackChi {
private final static Logger logger = LoggerFactory.getLogger(logbackTest.class);
public static void main(String[] args) {
logger.info("first child info logback");
logger.error("first child error logback");
logger.debug("first child dubug logback");
}
}
此时的配置文件被我们放置在根目录的config文件下
五、logback.xml中的配置参数解析
配置文件中主要包含的元素:<configration>、<root>、<logger>、<appender>、<filter>、<property>等
各元素关系如下:
一个configration 元素包含一个root元素(root是特殊的logger),数个logger元素,数个<appender>元素。
元素解析:
<logger>:logger 中的参数name的值是工程中的包名称。level指的是打印消息级别(RACE, DEBUG, INFO, WARN, ERROR, ALL or OFF. )logger的主要作用是定义工程中某个包范围内的代码的打印日志级别。logger可关联多个appender。相当于同一个包下的日志可以以不同的格式被打印到不同的日志文件中。
logger定义的级别是有继承性的。如果使用一个logger对某个包下的代码设置level,则起父层的logger设置的level对其不起作用。
<appender>:appender中的属性比较多。apedner主要是定义日志的打印路径及打印格式。appeder中使用filter可过滤某个级别的日志。由此可实现相同包日志,不同级别的日志打印到不同的文件中。一个appender可被多个logger关联。相当于不同的包下的日志可被同一种格式打印到同一个文件中。
<propterty>:该属性主要用来定义变量。example:
<property name="LOG_HOME" value="D://backlogs/" />
变量的使用:
<FileNamePattern>${LOG_HOME}/TestWebError.log.%d{yyyy-MM-dd}.log</FileNamePattern>
也可以定义很多变量在一个单独的变量文件中,然后引入到logback.xml中,example:
<configuration>
<property file="src/main/java/chapters/configuration/variables1.properties" />
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${USER_HOME}/myApp.log</file>
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="FILE" />
</root>
</configuration>
六、logback.xml配置样板
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="D://backlogs/" />
<!-- 控制台输出 -->
<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>
<logger name="main.java.util" level="error">
<appender-ref ref="FILE" />
</logger>
<!-- 日志输出级别 -->
<root level="DUBUG">
<appender-ref ref="STDOUT" />
</root>
</configuration>
七、参考文献
https://logback.qos.ch/manual/configuration.html#syntax