日志记录

文章目录
  1. 1. java日志体系概述
    1. 1.1. 例子1,spring + log4j
    2. 1.2. 例子2,spring+slf4j
  2. 2. 为什么slf4j
  3. 3. slf4j(Simple Logging Facade for Java,简单门面日志)
    1. 3.1. 绑定(slf4j-log4j12,slf4j-jdk14和slf4j-jcl)
    2. 3.2. 桥接-实现(jcl-over-slf4j和log4j-over-slf4j)
    3. 3.3. 上面只能二选一
    4. 3.4. 简单使用LoggerFactory
    5. 3.5. lombok的实现
    6. 3.6. 1.sample logback.xml(!!!)
    7. 3.7. 2.文件保留多少天和多大(!!!)

java日志体系概述

img

例子1,spring + log4j

img

由于spring-core中原生依赖commons-logging,所以只需要添加log4j和log4j的配置文件就能work

例子2,spring+slf4j

img

比之前多引入了3个jar包并且还排除了commons-logging依赖。

spring-core,因为它原生依赖commons-logging,所以需要用jcl-over-slf4j.jar桥接包来代替commons-logging把具体实现委托给slf4j。jcl-over-slf4j和commons-logging拥有相同的包名、类名、接口,所以项目中要排除掉commons-logging。

为什么slf4j

img

slf4j(Simple Logging Facade for Java,简单门面日志)

它是对所有日志框架制定的一种规范、标准、接口,并不是一个框架的具体的实现,它只服务于各种各样的日志系统。

slf4j提供了统一的记录日志的接口,对不同日志系统的具体实现进行了抽象化,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过绑定具体的日志系统来实现。在项目中使用了slf4j记录日志,并且绑定了log4j(pom.xml中配置了相应的jar包依赖),则日志会以log4j的风格输出;后期需要改为以logback的风格输出日志,只需要将jar包log4j替换成logback即可,根本不需要修改日志文件的代码

绑定(slf4j-log4j12,slf4j-jdk14和slf4j-jcl)

基于一个已存在的日志框架来实现了SLF4J API,或者为SLF4J开发原生实现(slf4j-nop和slf4j-simple)。

绑定的原理是因为slf4j-api中的LogFactory通过StaticLoggerBinder.getSingleton()获取具体实现logger,一个绑定包实现了org/slf4j/impl/StaticLoggerBinder.class,所以它们在编译时刻就绑定在一起,而绑定包中的StaticLoggerBinder类会绑定对应的实现。

桥接-实现(jcl-over-slf4j和log4j-over-slf4j)

桥接的原理是把对应的门面日志接口重新实现了一遍,包名、类名、接口都一样,只是具体实现它委托给SLF4J了。

上面只能二选一

项目可以有任意个SLF4J桥接依赖,这不包括被binding使用的API的桥接。比如,如果slf4j-log4j12被作为一个binding,那么项目不能依赖log4j-over-slf4j。否则应用可能因为无限循环而崩溃。

与各个框架的桥接/绑定关系

img

简单使用LoggerFactory

1
2
3
4
5
6
7
8
9
10
11
@SpringBootApplication
public class SpringbootSlf4jApplication {
private static final Logger logger = LoggerFactory.getLogger(SpringbootSlf4jApplication.class);

public static void main(String[] args) {
logger.info("===============项目启动了===============");
SpringApplication app = new SpringApplication(SpringbootSlf4jApplication.class);
app.run(args);
logger.info("===============启动成功了===============");
}
}

lombok的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
* @author zhuzhe
* @date 2018/6/3 16:17
* @email 1529949535@qq.com
*/
@Slf4j
@RestController
public class TestController {

@RequestMapping("/log")
public String testLog(){
log.info("######### info #########");
log.debug("######### debug #########");
log.error("######### error #########");
return null;
}
}

更详细:https://blog.csdn.net/qq_27706119/article/details/104977666

1.sample logback.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
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--1.一些常量-->
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="/HL/IdeaProjects/SpringBoot-Item/springboot-slf4j/log"/>
<!-- 定义日志格式 -->
<property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%thread] [%-30.30logger{30}] %msg%n"/>

<!--2.appender输出到哪里consoleappender,还是fileappender-->
<!-- 控制台输出 -->
<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}/SpringBoot-Slf4j_%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>

<!--3.logger level输出的级别-->
<!-- 日志输出级别 -->
<logger name="org.springframework" level="INFO"/>
<logger name="com.hl.magic" level="INFO"/>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
</configuration>

2.文件保留多少天和多大(!!!)

定义日志相关参数
标签内定义一个名为 “FILE” 的文件参数配置。主要是配置日志文件的输出文件名、日志文件保留时间、日志文件保存的路径和日志的输出格式、及单个日志文件存储的大小。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 变量引入 -->
<pattern>${LOG_PATTERN}</pattern>
<!--格式化输出:%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>