Java日志配置指南:使用Slf4j和Logback将日志保存到指定文件
1. 概述

新项目需要添加日志需求,于是网上查找了日志配置。要求是将日志保存到指定的文件中。网上搜了文章,发现没有特别完整的文章,所以自己整理一下。
1.Java日志概述
日志记录是应用程序的重要组成部分。线上的问题追踪、基于日志的业务逻辑统计分析等都离不开日志。 Java领域有很多日志框架。目前常用的日志框架有Log4j 1、Log4j 2、Commons Logging、Slf4j、Logback、Jul等。
2. Java常见日志框架类别 2. 流程
我们这里使用lombok自带的Slf4j。我们只需要引入这个依赖即可
1.添加POM依赖
org.projectlombok
lombok
true
2.添加logback.xml
位置在src/main/resources下面
JPANAME
${log.pattern}
${log.pattern}
${log.file}
30
50MB
true
5000
0
false
3、测试代码
@Slf4j
@RestController
public class TestController {
@GetMapping("/getcookies")
public String readAllCookies(HttpServletRequest request) {
String re = "";
Cookie[] cookies = request.getCookies();
if (cookies != null) {
re = Arrays.stream(cookies)
.map(c -> c.getName() + "=" + c.getValue())
.collect(Collectors.joining(", "));
}
log.debug("输出DEBUG级别日志");
log.info("输出INFO级别日志");
log.warn("输出WARN级别日志");
log.error("输出ERROR级别日志");
log.info(re);
return re;
}
}
3.源码地址
项目地址:springboot-12-assemble模块
4.logback简介 1.logback简介
Logback是log4j创始人设计的另一个开源日志组件,官网:。目前分为以下几个模块:
2. logback 取代 log4j 的原因: 更快的实现:Logback 的内核被重写,在一些关键执行路径上性能提升了 10 倍以上。而且,不仅logback的性能得到提升,初始内存负载也更小。经过极其充分的测试:Logback 已经经历了多年和无数小时的测试。 Logback 测试处于完全不同的级别。 Logback-classic 非常自然地实现了 SLF4j:Logback-classic 实现了 SLF4j。当使用SLF4j时,你不会感觉到logback经典。而且由于 logback-classic 非常自然地实现了 slf4j,因此很容易切换到 log4j 或其他。您只需将其作为另一个jar包提供,无需触及通过SLF4JAPI实现的代码。文档非常齐全 官方网站有两百多页的文档。自动重新加载配置文件。当配置文件被修改时,Logback-classic可以自动重新加载配置文件。扫描过程快速且安全,并且不需要创建额外的扫描线程。这项技术充分保证了应用程序能够在JEE环境中愉快地运行。 Lilith是日志事件的观察者,类似于log4j的电锯。而且lilith还可以处理大量的日志数据。谨慎的模式和非常友好的恢复。在谨慎模式下,多个 FileAppender 实例在多个 JVM 下运行,并且可以安全地写入相同的日志文件。
RollingFileAppender 有一些限制。 Logback的FileAppender及其子类包括RollingFileAppender可以非常友好地从I/O异常中恢复。配置文件可以处理不同的情况,开发者经常需要在不同的环境(开发、测试、生产)下判断不同的Logback配置文件。这些配置文件只有一些细小的差别,可以通过 、 、 来实现,使一个配置文件适应多种环境。过滤器 有时,您需要诊断问题并记录它。在log4j中,唯一的办法就是降低日志级别,但这会产生大量日志,影响应用程序性能。在Logback中,除了某些特殊情况之外,您可以继续维持该日志级别。例如,如果用户Alice登录,她的日志将处于DEBUG级别,而其他用户可以继续以WARN级别登录。实现该功能只需要添加4行XML配置即可。可以参考MDCFlter。 SiftingAppender(一个非常通用的Appender):它可以用于根据任何给定的运行参数来分割日志文件。例如SiftingAppender可以区分日志事件并跟踪用户的Session,然后每个用户都会有一个日志文件。自动压缩已键入的日志文件:RollingFileAppender 在生成新文件时将自动压缩键入的日志文件。
压缩是一个异步过程,因此即使对于大型日志文件,应用程序在压缩过程中也不会受到任何影响。栈树有包版本:Logback在打印栈树日志时会带上包数据。自动删除旧的日志文件:通过设置TimeBasedRollingPolicy或SizeAndTimeBasedFNATP的maxHistory属性,可以控制已生成的日志文件的最大数量。如果您设置 maxHistory 12,则超过 12 个月的日志文件将被自动删除。 3.logback配置介绍
Logger 用作日志记录器。与应用对应的上下文关联后,主要用于存储日志对象,还可以定义日志类型和级别。
Appender主要用于指定日志输出的目的地。目的地可以是控制台、文件、远程套接字服务器、MySQL、PostreSQL、Oracle 等数据库、JMS 和远程 UNIX Syslog 守护进程等。
Layout 负责将事件转换为字符串并输出格式化的日志信息。
每个记录器都与一个 LoggerContext 关联。 LoggerContext 负责创建记录器并以树结构排列记录器。所有其他记录器也是通过 org.slf4j.LoggerFactory 类的静态方法 getLogger 获取的。 getLogger 方法将记录器名称作为参数。使用相同名称调用 LoggerFactory.getLogger 方法将始终获得对同一记录器对象的引用。
可以为记录器分配级别。级别包括:TRACE、DEBUG、INFO、WARN 和 ERROR,在 ch.qos.logback.classic.Level 类中定义。如果没有为记录器分配级别,它将继承其最近的祖先的级别。根记录器的默认级别是 DEBUG。
打印方法决定了请求的日志记录级别。例如,如果 L 是记录器实例,则语句 L.info("..") 是级别为 INFO 的日志记录语句。如果日志请求的级别大于或等于其记录器的有效级别,则称该日志请求已启用;否则,就被认为是被禁用的。日志请求级别为p,其记录器的有效级别为q。仅当 p>=q 时才会执行该请求。
这条规则是 logback 的核心。级别顺序为:TRACE < DEBUG < INFO < WARN < ERROR
4.Logback的默认配置
如果配置文件logback-test.xml和logback.xml不存在,logback会默认调用BasicConfigurator来创建最小配置。最小配置由与根记录器关联的 ConsoleAppender 组成。输出使用 PatternLayoutEncoder 进行格式化,模式为 %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n。根记录器的默认级别是 DEBUG。
Logback配置文件的语法非常灵活。因为它很灵活,所以不能使用 DTD 或 XML 模式来定义。尽管如此,配置文件的基本结构可以这样描述:它以零个或多个元素开头,后跟零个或多个元素,有零个或多个元素,后至多有一个元素。
尝试在classpath下找到logback-test.xml文件;如果该文件不存在,则搜索文件logback.xml;如果两个文件都不存在,logback 会自动使用 BasicConfigurator 进行配置,这将导致日志记录输出到控制台。 5、logback.xml常用配置详解
scan:当该属性设置为true时,如果配置文件发生变化,将重新加载。默认值为 true。
scanPeriod:设置监控配置文件是否被修改的时间间隔。如果没有给出时间单位,则默认单位是毫秒。该属性在 scan 为 true 时生效。默认间隔为 1 分钟。
debug:该属性设置为true时,会打印出logback内部日志信息,可以实时查看logback运行状态。默认值为 false。
例如:
例如:
myAppName
名称:变量的名称
value:值是变量定义的值
例如:
${APP_Name}
key:标识此的名称;
datePattern:设置将当前时间(解析配置文件的时间)转换为字符串的模式,格式为java.txt.SimpleDateFormat。
例如:
${bySecond}
5.1. ConsoleAppender将日志输出到控制台,有以下子节点:
:格式化日志。 (具体参数稍后解释)
:String System.out(默认)或System.err(区别就不多说了)
例如:
](javascript:void(0)