日志框架 logback

三蛛同框

日志框架

logback

SPI 机制

SPI 全称 Service Provider Interface,是 Java 提供的一套用来被第三方实现或者扩展的 API,它可以用来启用框架扩展和替换组件。他是一种服务发现机制。它通过在 ClassPath 路径下的 META-INF/services 文件夹查找文件,自动加载文件里所定义的类

1
2
3
4
public static <S> ServiceLoader<S> load(Class<S> service, ClassLoader loader)
{
return new ServiceLoader<>(service, loader);
}

手动模拟 SPI 机制

  • Driver
1
2
3
4
5
public interface Driver {

public void getConnection();

}
  • MyDriver
1
2
3
4
5
6
public class MyDriver implements Driver {
@Override
public void getConnection() {
System.out.println("SPI 机制");
}
}
  • META-INF.services.com.dream.driver.Driver
1
com.dream.mydriver.MyDriver

然后将改项目打包 加入 Logback 中

1
2
3
4
5
6
public static void main(String[] args) {
ServiceLoader<Driver> load = ServiceLoader.load(Driver.class);
//寻找Driver对象 找到了就调用getConneciton方法
load.forEach(Driver::getConnection);

}

这个时候就会通过 SPI 机制读取到配置文件中的类实现

logback 编程式配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
public class Myconfigurator extends ContextAwareBase implements Configurator {

public Myconfigurator() {

}

@Override
public void configure(LoggerContext lc) {
addInfo("Setting up default configuration.");

//控制台Appender
ConsoleAppender<ILoggingEvent> ca = new ConsoleAppender<ILoggingEvent>();
//添加上下文
ca.setContext(lc);
//名字
ca.setName("console");
//layout样式
LayoutWrappingEncoder<ILoggingEvent> encoder = new LayoutWrappingEncoder<ILoggingEvent>();
//添加上下文
encoder.setContext(lc);

//文件Appender
FileAppender<ILoggingEvent> fileAppender = new FileAppender<>();
fileAppender.setContext(lc);
fileAppender.setName("file");
fileAppender.setFile("D://logs/logback.log");
PatternLayout patternLayout = new PatternLayout();
patternLayout.setContext(lc);
patternLayout.setPattern("%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n");
//画板执行
patternLayout.start();
fileAppender.setEncoder(encoder);
//文件Appender执行
fileAppender.start();

// 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);
rootLogger.addAppender(fileAppender);
}
}
1
2
3
4
5
6
7
8
9
10
private final static Logger LOGGER = LoggerFactory.getLogger(LogbackTest.class);

@Test
public void testLogback(){
LOGGER.error("error");
LOGGER.warn("warn");
LOGGER.info("info");
LOGGER.debug("debug");
LOGGER.trace("trace");
}

三大组件

1、appender,输出源,一个日志可以后好几个输出源

2、encoder,一个 appender 有一个 encoder,负责将一个 event 事件转换成一组 byte 数组,并将转换后的字节数据输出到文件中。

Encoder 负责把事件转换为字节数组,并把字节数组写到合适的输出流。因此,encoder 可以控制在什么时候、把什么样的字节数组写入到其拥有者维护的输出流中。Encoder 接口有两个实现类,LayoutWrappingEncoder 与 PatternLayoutEncoder。
注意:在 logback 0.9.19 版之前没有 encoder。
在之前的版本里,多数 appender 依靠 layout 来把事件转换成字符串并用 java.io.Writer 把字符串输出。在之前的版本里,用户需要在 FileAppender 里嵌入一个 PatternLayout。

3、layout,格式化数据将 event 事件转化为字符串,解析的过程

4、filter 过滤器

占位符

%-5level 级别

%d{yyyy-MM-dd HH:mm:ss.SSS} 日期

%c 类的完整名称

%M为 method

%L为 行号

%thread 线程名称

%m或者%msg为 信息

%n 换行

logback 配置文件配置

1
2
3
4
5
6
7
8
9
10
11
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!--使用slf4j作为日志的门面,使用log4j2来记录日志 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<configuration>
<jmxConfigurator />

<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%date [%thread] %-5level %logger{25} - %msg%n</Pattern>
</layout>
</appender>

<appender name="file" class="ch.qos.logback.core.FileAppender">
<!-- 文件log打印路径-->
<file>D://logs/lobackconfig.log</file>
<!-- 模板-->
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%date [%thread] %-5level %logger{25} - %msg%n</Pattern>
</layout>
</appender>

<!-- 手动权限自定义配置-->
<logger name="com.dream.xiaobo.LogbackTest" level="warn">
<!-- 不继承父类配置-->
<additive>false</additive>
<appender-ref ref="console" />
<appender-ref ref="file"/>
</logger>

<!-- 根配置-->
<root level="debug">
<!-- 执行哪个appender ref映射-->
<appender-ref ref="console" />
<!-- <appender-ref ref="file"/>-->
</root>
</configuration>

logback日志拆分与滚动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
<?xml version = "1.0" encoding = "UTF-8"?>
<configuration>

<!--
配置集中管理属性,可以直接修改属性的value值
格式 ${name}
-->

<!--日志输出格式:
[%-5level]
%d{yyyy-MM-dd HH:mm:ss.SSS} : 日期
%c : 类的完整名称
%M : 为method
%L : 为行号
%thread : 线程名称
%m 或者 %msg : 为信息
%n : 换行

-->

<!-- 第一种方式:
<property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L %thread %m%n"></property>
-->

<!-- 第二种方式 -->
<property name="pattern" value="[ %-5level ] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n"/>


<!--格式化输出:
%d表示日期,
%thread表示线程名,
%-5level:级别从左显示5个字符宽度
%msg:日志消息,
%n是换行符
-->


<!--Appender: 设置日志信息的去向,常用的有以下几个
ch.qos.logback.core.ConsoleAppender (控制台)
ch.qos.logback.core.rolling.RollingFileAppender (文件大小到达指定尺寸的时候产生一个新文件)
ch.qos.logback.core.FileAppender (文件)

-->

<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!--输出流对象 默认 System.out 改为 System.err-->
<target>System.err</target>
<!-- 日志消息格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>



<!-- 定义日志文件保存路径 -->
<property name="log_dir" value="D://logs"/>

<!--用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。
<loger>仅有一个name属性,一个可选的level和一个可选的addtivity属性 name:用来指定受此logger约束的某一个包或者具体的某一个类。 level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF, 如果未设置此属性,那么当前logger将会继承上级的级别。
additivity: 是否向上级loger传递打印信息。默认是true。
<logger>可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个 logger


-->

<!--

也是<logger>元素,但是它是根logger。默认debug level:用来设置打印级别,
大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
<root>可以包含零个或多个<appender-ref>元素,
标识这个appender将会添加到这个 logger。

-->


<!-- 日志文件拆分和归档的appender对象-->
<appender name="rollFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日志输出路径-->
<file>${log_dir}/roll_logback.log</file>
<!--日志格式配置-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<!--指定日志文件拆分和压缩规则-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--通过指定压缩文件名称,来确定分割文件方式-->
<fileNamePattern>${log_dir}/rolling.%d{yyyy-MM- dd}.log%i.gz</fileNamePattern>
<!--保留天数-->
<maxHistory>3</maxHistory>
<!--文件拆分大小-->
<maxFileSize>1MB</maxFileSize>
</rollingPolicy>
</appender>


<!--root logger 配置-->
<root lever="ALL">
<appender-ref ref="console"></appender-ref>
<appender-ref ref="rollFile"></appender-ref>
</root>

</configuration>

logback异步日志配置

  • myconfigurator
1
2
3
4
//        异步日志
AsyncAppender asyncAppender = new AsyncAppender();
asyncAppender.addAppender(ca);
asyncAppender.addAppender(fileAppender);
  • xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
<?xml version = "1.0" encoding = "UTF-8"?>
<configuration>

<!--
配置集中管理属性,可以直接修改属性的value值
格式 ${name}
-->

<!--日志输出格式:
[%-5level]
%d{yyyy-MM-dd HH:mm:ss.SSS} : 日期
%c : 类的完整名称
%M : 为method
%L : 为行号
%thread : 线程名称
%m 或者 %msg : 为信息
%n : 换行

-->

<!-- 第一种方式:
<property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L %thread %m%n"></property>
-->

<!-- 第二种方式 -->
<property name="pattern" value="[ %-5level ] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n"/>


<!--格式化输出:
%d表示日期,
%thread表示线程名,
%-5level:级别从左显示5个字符宽度
%msg:日志消息,
%n是换行符
-->


<!--Appender: 设置日志信息的去向,常用的有以下几个
ch.qos.logback.core.ConsoleAppender (控制台)
ch.qos.logback.core.rolling.RollingFileAppender (文件大小到达指定尺寸的时候产生一个新文件)
ch.qos.logback.core.FileAppender (文件)

-->

<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!--输出流对象 默认 System.out 改为 System.err-->
<target>System.err</target>
<!-- 日志消息格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>



<!-- 定义日志文件保存路径 -->
<property name="log_dir" value="D://logs"/>

<!--用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。
<loger>仅有一个name属性,一个可选的level和一个可选的addtivity属性 name:用来指定受此logger约束的某一个包或者具体的某一个类。 level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF, 如果未设置此属性,那么当前logger将会继承上级的级别。
additivity: 是否向上级loger传递打印信息。默认是true。
<logger>可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个 logger


-->

<!--

也是<logger>元素,但是它是根logger。默认debug level:用来设置打印级别,
大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
<root>可以包含零个或多个<appender-ref>元素,
标识这个appender将会添加到这个 logger。

-->


<!-- 日志文件拆分和归档的appender对象-->
<appender name="rollFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日志输出路径-->
<file>${log_dir}/roll_logback.log</file>
<!--日志格式配置-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<!--指定日志文件拆分和压缩规则-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--通过指定压缩文件名称,来确定分割文件方式-->
<fileNamePattern>${log_dir}/rolling.%d{yyyy-MM- dd}.log%i.gz</fileNamePattern>
<!--保留天数-->
<maxHistory>3</maxHistory>
<!--文件拆分大小-->
<maxFileSize>1MB</maxFileSize>
</rollingPolicy>
</appender>

<!-- 异步日志配置-->
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="console"/>
<appender-ref ref="rollFile"/>
</appender>


<!--root logger 配置-->
<root lever="ALL">
<!-- <appender-ref ref="console"></appender-ref>-->
<!-- <appender-ref ref="rollFile"></appender-ref>-->
<!-- 将异步日志添加进Logger-->
<appender-ref ref="ASYNC"/>
</root>

</configuration>

logback-access的使用

logback-access模块与Servlet容器(如Tomcat和Jetty)集成,以提供HTTP访问日志功能。我们可以使 用logback-access模块来替换tomcat的访问日志

步骤

  • 1、现将tomcat的config文件添加如下内容
1
<Valve className="org.apache.catalina.valves.AccessLogValve"  directory="logs" prefix="localhost_access_log." suffix=".txt"  pattern="common" resolveHosts="false"/>

catalina 日志

1
<Valve className="ch.qos.logback.access.tomcat.LogbackValve"/>

logback.access 日志

这两个二选一

参数介绍

className 想配置访问日志?这就必须得写成这样。
directory 这个东西是日志文件放置的目录,在tomcat下面有个logs文件夹,那里面是专门放置日志文件的,当然你也可以修改,我就给改成了D:\
prefix 这个是日志文件的名称前缀,我的日志名称为localhost_access_log.2007-09-22.txt,前面的前缀就是这个localhost_access_log
suffix 这就是后缀名啦,可以改成别的
pattern 这个是最主要的参数了,具体的咱们下面讲,这个参数的内容比较丰富
resolveHosts 如果这个值是true的话,tomcat会将这个服务器IP地址通过DNS转换为主机名,如果是false,就直接写服务器IP地址啦
  • 2、将logback-access.jar与logback-core.jar复制到$TOMCAT_HOME/lib/目录下

  • 3、在config目录下创建新的配置文件 logback-access.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- always a good activate OnConsoleStatusListener -->
<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>

本篇文章 仅供自己学习整理 方便阅读 参考b站某UP主 如有侵权 通知即删

你知道的越多 你不知道的越多 嘿 我是小博 带你一起看我目之所及的世界……

-------------本文结束 感谢您的阅读-------------

本文标题:日志框架 logback

文章作者:小博

发布时间:2022年03月22日 - 21:09

最后更新:2022年03月22日 - 21:11

原始链接:https://codexiaobo.github.io/posts/575097866/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。