一、配置Logback
可以通过以下三种方式配置Logback:
- 编程方式
- 配置 XML 脚本
- 配置 Groovy 格式
logback 的初始化步骤:
- logback 会在类路径下寻找名为 logback-test.xml 的文件。
- 如果没有找到,logback 会继续寻找名为 logback.groovy 的文件。
- 如果没有找到,logback 会继续寻找名为 logback.xml 的文件。
- 如果没有找到,将会通过 JDK 提供的 ServiceLoader 工具在类路径下寻找文件 META-INFO/services/ch.qos.logback.classic.spi.Configurator,该文件的内容为实现了Configurator接口的实现类的全限定类名。
- 如果以上都没有成功,logback 会通过BasicConfigurator为自己进行配置,并且日志将会全部在控制台打印出来。
最后一步的目的是为了保证在所有的配置文件都没有被找到的情况下,提供一个默认的(但是是非常基础的)配置。
如果你使用的是 maven,你可以在 src/test/resources 下新建 logback-test.xml。maven 会确保它不会被生成。所以你可以在测试环境中给配置文件命名为 logback-test.xml,在生产环境中命名为 logback.xml。
二、Logback的配置文件示例
1、Logback配置文件的结构
logback的配置文件的根节点是 configuration,可包含0个或多个 appender,0个或多个 logger,最多一个 root。
2、利用配置文件将日志信息输出到文件:
在JavaSE项目的类路径下(src目录)添加一个logback.xml文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="E:/log/" />
<appender name="fileAppender" class="ch.qos.logback.core.FileAppender">
<file>E:/log/testFile2.log</file>
<encoder><!-- 必须指定,否则不会往文件输出内容 -->
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n</pattern>
</encoder>
<append>true</append>
<prudent>false</prudent>
</appender>
<!-- 日志输出级别 -->
<root level="DEBUG">
<appender-ref ref="fileAppender" />
</root>
</configuration>
测试用例:
package test.java.TestLogback;
import ch.qos.logback.core.util.StatusPrinter;
import ch.qos.logback.classic.LoggerContext;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TestLogback01 {
private static Logger logger = LoggerFactory.getLogger(TestLogback01.class);
@Test
public void test(){
logger.info("info....");
logger.debug("debug....");
}
}
运行发现,配置成功了,但是控制台上没有任何输出,因为我们的日志新都打印到文件中去了。上篇讲到,我们可以通过LoggerContext类来打印logback内部的状态信息,又称之为 Status 对象。修改如下:
@Test
public void test(){
logger.info("info....");
logger.debug("debug....");
LoggerContext loginContext = (LoggerContext)LoggerFactory.getILoggerFactory();
StatusPrinter.print(loginContext);
}
这样我们就可以在控制台打印出logback内部的状态信息,跟踪我们的日志。
测试结果:
11:42:11,542 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
11:42:11,542 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
11:42:11,542 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/G:/idea_work/stuJar/out/production/stuJar/logback.xml]
11:42:11,692 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.FileAppender]
11:42:11,702 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [fileAppender]
11:42:11,712 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
11:42:11,742 |-INFO in ch.qos.logback.core.FileAppender[fileAppender] - File property is set to [E:/log/testFile2.log]
11:42:11,742 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to DEBUG
11:42:11,742 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [fileAppender] to Logger[ROOT]
11:42:11,742 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
11:42:11,752 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@13c78c0b - Registering current configuration as safe fallback point
但是如果为每个类都添加LoggerContext,调用StatusPrinter.print()方法打印状态信息会很麻烦,也会出现很多重复的代码。我们可以通过修改配置文件来打印状态信息,而不需要通过编码的方式调用 StatusPrinter
去实现。只需要在 configuration 元素上添加 debug 属性。如下:
<configuration debug="true">
...
</configuration>
或者通过系统属性 "logback.statusListenerClass"来设置状态监听StatusListener强制输出状态信息。如下:
<configuration debug="true">
<statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />
</configuration>
这样做的意义在于
如果配置文件的配置有问题,logback 会检测到这个错误并且在控制台打印它的内部状态。但是,如果配置文件没有被找到,logback 不会打印它的内部状态信息,因为没有检测到错误。在缺乏状态信息的情况下,要找一个有问题的配置文件很难,特别是在生产环境下。为了能够更好的定位到有问题的配置文件,我们需要采用如上三种方式强制输出状态信息。