Logback是一款经典的日志框架。 在许多地方都可以使用,这里先放出官方的文档地址 https://logback.qos.ch/documentation.html
1.准备必要的包文件
logback的必要的包
logback-core logback-classic slf4j-api
如果你是使用Maven的话,则只需要引入以下即可
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.3.0-alpha13</version>
</dependency>
可选的依赖: 如果你在使用中用到了STMPAppender,则需要引入JavaMail的依赖
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>${javax.mail.version}</version>
</dependency>
如果要使用JaninoEventEvaluator,则需要引入janino
<dependency>
<groupId>org.codehaus.janino</groupId>
<artifactId>janino</artifactId>
<version>3.1.6</version>
</dependency>
2.完成配置文件
Logback可以通过编程方式进行配置,也可以使用以XML或Groovy格式表示的配置脚本进行配置。顺便说一句,现有的log4j用户可以将他们的log4j.properties文件转换为logback.xml使用我们的DistinctionTranslator Web应用程序。
让我们首先讨论一下logback为尝试配置自身而遵循的初始化步骤:
Logback 尝试在类路径中查找名为 logback-test.xml 的文件。
如果未找到此类文件,它将在类路径中检查文件 logback.xml。
如果未找到此类文件,则使用 服务提供程序加载工具(在 JDK 1.6 中引入)通过在类路径中查找文件 META-INF\services\ch.qos.logback.classic.spi.Configurator 来解析 com.qos.logback.classic.spi.Configurator 接口的实现。 其内容应指定所需实现的完全限定类名。Configurator
如果上述操作均未成功,则 Logback 将使用 BasicConfigurator 自动配置自身,这将导致日志记录输出定向到控制台。
最后一步是作为最后的努力,在没有配置文件的情况下提供默认(但非常基本)的日志记录功能。
配置文件的基本由三部分构成 Appender,Logger,Root
Appender标签
Appender是具体负责日志输出的组件,设置一个Appender标签,差不多等于定义一个日志的输出方式。 当然,他可以有多个。(暂且理解为一个输出器)
它有两个必要的属性 1.name 这个不多说,就是制定一个名字 2.class 制定实例化Appender对象的具体类
这里的class可以指定如下类型
- ch.qos.logback.core.ConsoleAppender (控制台输出)
- ch.qos.logback.core.FileAppender (文件输出)
- ch.qos.logback.core.rolling.RollingFileAppender (文件输出的进阶版)
- ch.qos.logback.classic.net.SocketAppender (网络连接下远程输出)
- ch.qos.logback.classic.net.SSLSocketAppender
- ch.qos.logback.classic.net.SMTPAppender(邮件输出)
- 。。。。。。。。。。。。。。
一般如果需要自定义Appender的话需要基础抽象类AppenderBase完成appender方法。 这些的详细介绍在官网中有详细的讲解。你可以直接参考。 https://logback.qos.ch/manual/appenders.html
一般而言,它的内部只会设置encoder或layout,及filter子标签。 **这里的layout和encoder标签的功能很相似。**所以你可以随便选择一个使用。 且它们都需要class属性作为必要属性,但如果你只想使用layout,encoder的默认实现,你可以省略该属性。 (PS)
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n</pattern>
</layout>
<encoder class="ch.qos.logback.classic.PatternLayoutEncoder">
<pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n</pattern>
</encoder>
使用Filter可以对Appender的输出内容进行过滤,且可以自定义。
public class SampleFilter extends Filter<ILoggingEvent> {
@Override
public FilterReply decide(ILoggingEvent event) {
if(某种情况)
return FilterReply.ACCEPT;
if(某种情况)
return FilterReply.NEUTRAL;
if(某种情况)
return FilterReply.DENY;
}
}
}
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<filter class="chapters.filters.SampleFilter" />
<encoder>
<pattern>
%-4relative [%thread] %-5level %logger - %msg%n
</pattern>
</encoder>
</appender>
Logger标签
Logger标签代表记录器 它有三个属性可以配置
- name (名称----必要【指定受此影响的包名或者类名】)
- level(记录等级,在TRACE, DEBUG, INFO, WARN, ERROR, ALL or OFF一个)
- additivity (是否可以设置多Appender,true为可以,false反之)
root标签则为根logger 它则只可以设置一个属性level用来设置日志等级
Logger之间的日志等级具有继承关系,如果logger的level属性不填则默认继承父logger的日志等级。
另外一个点是,Logger或root标签则只可以出现appender-ref子标签(目前没有发现其他可以在logger中使用的标签)
appender-ref标签指定一个已经存在的Appender标签的name属性即可 (这有点像spring 的配置文件中bean标签的ref属性,同样参照一个已存在的bean)
例:
<logger name="logback"/>
<root level="DEBUG">
<appender-ref ref="STDOUT" />
</root>
3.使用测试
创建项目,引入依赖包 然后创建logback.xml在classpath下(即src下) 完成配置文件,
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>
%date{yyyy-MM-dd hh:mm:ss}|%5level [%thread] - %msg%n
</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="STDOUT" />
</root>
</configuration>
在Java中测试
public class MyLogTest {
final static Logger logger = LoggerFactory.getLogger(MyLogTest.class);
public static void main(String[] args) {
logger.warn("DoBefore");
DoSomething();
logger.debug("helloshit");
logger.error("helloshit");
logger.trace("helloshit");
logger.info("helloshit");
}
public static void DoSomething() {
System.out.println("This method will do something");
}
}
结果如下
2022-05-03 03:19:32| WARN [main] - DoBefore
This method will do something
2022-05-03 03:19:32|DEBUG [main] - helloshit
2022-05-03 03:19:32|ERROR [main] - helloshit
2022-05-03 03:19:32| INFO [main] - helloshit
仔细对比一下发现少了一条TRACE的输出 这并不是BUG,而是logback的logger日志等级输出机制
它分为请求日志等级(简称p)和实际可执行日志等级 ( 简称q) 可执行日志等级就是我们刚才给root根logger指定的level属性的值, 请求日志等级就是我们在方法中的调用, 如果p>=q,则可以输出日志,反之则不可以输出,这就是刚才为什么少了一条输出的原因。 如果需要更详细的了解,请看下面的连接 https://logback.qos.ch/manual/architecture.html
多目标输出日志
多目标输出日志也非常的简单,你只再配置一个appender即可
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>
%date{yyyy-MM-dd hh:mm:ss}|%5level [%thread] - %msg%n
</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>E:\eclipseWorkSpace\LogBackTest\src\logfile.log</file>
<append>true</append>
<encoder>
<pattern>
%date{yyyy-MM-dd hh:mm:ss}|%5level [%thread] - %msg%n
</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
</configuration>
|