Logback
Logback是由log4j创始人设计的另一个开源日志组件,性能比log4j要好。
官方网站:https://logback.qos.ch/index.html
Logback主要分为三个模块:
- logback-core:其它两个模块的基础模块
- logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j API
- logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能
案例演示
添加pom.xml
文件
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
添加测试类
public class LogbackService {
public final static Logger LOGGER = LoggerFactory.getLogger(LogbackService.class);
@Test
public void testSlf4j(){
LOGGER.error("error");
LOGGER.warn("warn");
LOGGER.info("info");
LOGGER.debug("debug");
LOGGER.trace("trace");
}
}
logback配置
logback会依次读取以下类型配置文件:
- logback.groovy
- logback-test.xml
- logback.xml 如果均不存在会采用默认配置
logback组件之间的关系
-
Logger:日志的记录器,把它关联到应用的对应的context上后,主要用于存放日志对象,也 可以定义日志类型、级别。
-
Appender:用于指定日志输出的目的地,目的地可以是控制台、文件、数据库等等。
-
Layout:负责把事件转换成字符串,格式化的日志信息的输出。在logback中Layout对象被封装在encoder中
基本配置信息
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="pattern" value="%logger{3} %d{yyyy-MM-dd HH:mm:ss.SSS} %c [%thread] %10level %msg%n"/>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<target>System.err</target>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>
<root level="ALL">
<appender-ref ref="console"/>
</root>
</configuration>
pattern
在ch.qos.logback.classic.PatternLayout
中可以看到相关的字符替代,如:
- %level:日志的级别
- %d:日期
- $d{yyyy-MM-dd HH:mm:ss.SSS}
- %m:方法名
- %L:行号
- %thread:线程名
- %msg:信息
- %n:换行
- %logger{length}:logger名,length可以缩短logger名
- %C{length}:全限定类名,length可以缩短class名
格式修饰符
- 左对齐:
-
+最小宽度,用十进制表示
- 如果字符小于最小宽度,则左填充或右填充,默认是左填充(即右对齐),填充符为空格。如果字符大于最小宽度,字符永远不会被截断。
- 最大宽度:
.
+最大宽度,十进制表示
- 如果字符大于最大宽度,则从前面截断。点符号
.
后面加减号-
在加数字,表示从尾部截断。
Format modifier | Logger name | Result |
---|
[%20.20logger] | main.Name | [ main.Name] |
[%-20.20logger] | main.Name | [main.Name ] |
[%10.10logger] | main.foo.foo.bar.Name | [o.bar.Name] |
[%10.-10logger] | main.foo.foo.bar.Name | [main.foo.f] |
Appender
Appender:设置日志信息的取向,常用的有以下几个
ch.qos.logback.core.ConsoleAppender
:控制台ch.qos.logback.core.rolling.RollingFileAppender
:文件大小到达指定大小的时候生成一个新的文件ch.qos.logback.core.FileAppender
:文件
root
root:用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>
。
fileAppender配置
输出到log
文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="pattern" value="%logger{3} %d{yyyy-MM-dd HH:mm:ss.SSS} %c [%thread] %10level %msg%n"/>
<property name="log_dir" value="/Users/machoul/IdeaProjects/machoul-log-test/machoul-logback-test/log"/>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<target>System.err</target>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>
<appender name="file" class="ch.qos.logback.core.FileAppender">
<target>System.err</target>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<file>${log_dir}/logback.log</file>
</appender>
<root level="ALL">
<appender-ref ref="console"/>
<appender-ref ref="file"/>
</root>
</configuration>
输出到html
文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="pattern" value="%logger{3} %d{yyyy-MM-dd HH:mm:ss.SSS} %c [%thread] %10level %msg%n"/>
<property name="log_dir" value="/Users/machoul/IdeaProjects/machoul-log-test/machoul-logback-test/log"/>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<target>System.err</target>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>
<appender name="htmlFile" class="ch.qos.logback.core.FileAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="ch.qos.logback.classic.html.HTMLLayout">
<pattern>%level%d{yyyy-MM-dd HH:mm:ss}%c%M%L%thread%m</pattern>
</layout>
</encoder>
<file>${log_dir}/logback.html</file>
</appender>
<root level="ALL">
<appender-ref ref="console"/>
<appender-ref ref="htmlFile"/>
</root>
</configuration>
RollingFileAppender配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="pattern" value="%logger{3} %d{yyyy-MM-dd HH:mm:ss.SSS} %c [%thread] %10level %msg%n"/>
<property name="log_dir" value="/Users/machoul/IdeaProjects/machoul-log-test/machoul-logback-test/log"/>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<target>System.err</target>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>
<appender name="rollFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<file>${log_dir}/roll_logback.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log_dir}/rolling.%d{yyyy-MM-dd}.log%i.gz</fileNamePattern>
<maxFileSize>20kb</maxFileSize>
</rollingPolicy>
</appender>
<root level="ALL">
<appender-ref ref="console"/>
<appender-ref ref="rollFile"/>
</root>
</configuration>
filter和异步日志
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="pattern" value="%logger{3} %d{yyyy-MM-dd HH:mm:ss.SSS} %c [%thread] %10level %msg%n"/>
<property name="log_dir" value="/Users/machoul/IdeaProjects/machoul-log-test/machoul-logback-test/log"/>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<target>System.err</target>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>
<appender name="rollFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<file>${log_dir}/roll_logback.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log_dir}/rolling.%d{yyyy-MM-dd}.log%i.gz</fileNamePattern>
<maxFileSize>20kb</maxFileSize>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>error</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="async" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="rollFile"/>
</appender>
<root level="ALL">
<appender-ref ref="console"/>
<appender-ref ref="async"/>
</root>
<logger name="com.machoul" level="debug" additivity="false">
<appender-ref ref="rollFile"/>
</logger>
</configuration>
logback-access的使用
logback-access
模块与Servlet
容器(如Tomcat
和Jetty
)集成,以提供HTTP
访问日志功能。我们可以使用logback-access
模块来替换tomcat
的访问日志。
官方配置的地址:https://logback.qos.ch/access.html#configuration
- 将
logback-access.jar
与logback-core.jar
复制到$TOMCAT_HOME/lib/
目录下 - 修改
$TOMCAT_HOME/conf/server.xml
中的Host
元素中添加:
<Valve className="ch.qos.logback.access.tomcat.LogbackValve" />
logback
默认会在$TOMCAT_HOME/conf下查找文件 logback-access.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener"/>
<property name="LOG_DIR" value="${catalina.base}/logs"/>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_DIR}/access.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>access.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>combined</pattern>
</encoder>
</appender>
<appender-ref ref="FILE"/>
</configuration>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)