常见的日志框架及Logback日志框架的使用

发布时间 2023-11-16 22:21:09作者: emphemeral

什么是日志

日志是一种记录系统运行时信息的方式,这些信息可以包括程序的状态、错误消息、警告、调试信息等

日志的作用

1. 调试和故障排除
当代码出现Bug时,可以通过查看日志,了解程序正在执行过程中的各个步骤和状态,可快速定位和修复问题。
2. 监控和性能分析
用于监控应用程序的运行状况和性能。可以记录关键指标,如响应时间、内存使用情况、数据库查询次数等,通过这些日志数据分析,可以及时发现潜在的性能问题,并采取措施来改进应用程序的性能
3. 了解用户行为
如果应用程序需要收集用户数据,可以记录用户的行为、偏好和操作,以便更好地了解他们的需求,改进用户体验,并做出针对性的改进。
4. 安全性
通过记录安全事件和潜在的风险,可以更好的保护应用程序和用户数据。

日志级别

TRACE(跟踪日志)
最低级别的日志记录,用于输出最详细的调试信息,通常用于开发调试目的。在生产环境中,应该关闭TRACE级别的日志记录,以避免输出过多无用信息。
DEBUG(调试日志)
用于输出程序中的一些调试信息,通常用于开发过程中。像trace一样,在生产环境中应该关闭DEBUG级别的日志记录。
INFO(信息日志)
用于输出程序正常运行时的一些关键信息,比如程序的启动、运行日志等。通常在生产环境中开启INFO级别的日志记录。
WARN(警告日志)
用于输出一些警告信息,提示程序可能出现一些异常或错误。在应用程序中,WARN级别的日志记录通常用于记录一些非致命的异常信息,以便能够及时发现并处理这些问题。
ERROR(错误日志)
用于输出程序运行时的一些错误信息,通常表示程序出现了一些不可预料的错误。在应用程序中,ERROR级别通常用于记录一些致命性异常信息,以便能够及时发现并处理。
FATAL(致命日志)
最高级别的日志记录,表示程序出现致命错误或异常,即不可恢复的错误。

如何写日志

选择恰当的日志级别
打印有用的信息
注意日志格式
避免泄露敏感信息(如密码、API密钥或个人数据)

使用System.out.println打印日志的不足之处

  1. 大量的IO操作,对系统性能产生比较大的消耗。
  2. 它是一个同步操作,打印日志时会阻碍系统正常的业务处理。
  3. 控制台输出,无法保存日志,不方便运维事后排查问题。
  4. 无法控制输出。(没有日志打印开关)

常见的日志框架

Log4j
Log4j是最早流行的日志框架之一。它由Ceki Gülcü开发,并后来由Apache软件基金会接
管。Log4j 提供了灵活的配置选项、多种输出目的地、日志级别和分层日志体系。尽管Log4j 1在其时代
取得了巨大的成功,但在性能和某些功能方面存在限制,因此后来演化为Log4j2
LogBack
Logback 是Ceki Gülcü开发的日志框架,他也是Log4j的作者。Logback 是Log4j 的后续版本,旨在提供更高性能、更灵活的配置和现代化的日志解决方案。Logback 支持异步日志记录、多种输出格式、灵活的配置以及与SLF4J紧密集成
SLF4J
严格来说,SLF4J 并不算一个框架,而是Ceki Gülcü开发的一个日志门面接口。它为Java应用程序提供了统一的日志抽象,使开发人员可以使用一致的API进行日志记录,而不需要直接依赖于特定的日志实现。SLF4J 可以与多种底层日志框架(如Logback、Log4j2、java.util.logging等)结合使用。使用 SLF4J 应用程序就可以在不同的日志框架之间进行灵活配置和切换,同时还可以获得更好的性能表现
image
SLF4J使用:
<!-- slf4j 依赖包--> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.36</version> </dependency>
Log4j2(Log4j2与LogBack:从性能方面 Log4j2 与 Logback 表现都很优秀,但 Log4j2 晚出来几年,有后发优势,性能会比 Logback 更好)
Log4j2 是 Apache 软件基金会开发的 Log4j 的下一代版本。它引入了许多新特性,如异步日志记录、插件支持、丰富的过滤器等,旨在提供更好的性能和灵活性。Log4j2 在设计上考虑了 Log4j 的局限性,并且支持多种配置方式

日志框架三大组件

记录器(Loggers)
按照布局中指定的格式把日志信息写入一个或多个输出源
输出源(Appenders)
日志输出可以是控制台、文本文件、XML文件或Socket 等
布局(Logouts)
所有集成Layout类的类定义了日志信息的布局,所谓布局就是日志信息的格式

LogBack在SpringBoot中的运用:

导入依赖:
<dependencies>
<!-- slf4j 依赖包-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.36</version>
</dependency>
<!-- lombok 依赖包-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.12</version>
</dependency>
</dependencies>
在工程的resources目录下创建logback.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="true" scanPeriod="1 seconds">
<contextName>logback</contextName>
<!-- 定义日志变量-->
<property name="log.path" value="logs.log/" />
<!--日志输出到控制台-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>DEBUG</level>
</filter>
<encoder>
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level
%logger{36} - %msg%n
</pattern>
</encoder>
</appender>
<!-- 日志输出到文件 -->
<appender name="file"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}</file>
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}.%d{yyyy-MM-dd}.zip</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n
</pattern>
</encoder>
</appender>
<!-- 根日志输出级别-->
<root level="debug">
<appender-ref ref="console" />
<appender-ref ref="file" />
</root>
<!-- 指定包日志输出级别-->
<logger name="com.binge" level="debug" />
</configuration>
创建文件的打印日志方式一(不推荐)
package com.hpc;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogDemo {
	//获取日志记录器对象
	private static final Logger log = LoggerFactory.getLogger(LogDemo.class);
	public static void main(String[] args) {
		log.info("这是一条日志信息");
	}
}
创建文件的打印日志方式二(推荐使用)---使用注解
package com.hpc;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class LogDemo2 {
	public static void main(String[] args) {
		log.info("这是一条日志信息");
	}
}