Java-日志-Slf4j-Log4j-logback

文章目录

SLF4J

参考:

https://www.cnblogs.com/shenStudy/p/15806951.html

https://slf4j.org/

基础概念

java 复制代码
是什么?
	SLF4J(Simple Logging Facade for Java),是一个为Java日志系统提供标准化接口的框架。它的主要目的是为各种日志框架提供统一的API,从而简化日志记录的实现和管理。
	使用该日志框架,需要用到 logback.xml  或者 logback-spring.xml 。
	其具体的实现是由log4j或者logback等实现。
日志门面?
	SLF4J,为日志系统提供一套门面,通过面向接口规范来进行开发,避免了直接依赖具体的日志框架,可轻松切换不同的日志实现框架并且不需要改动代码。

使用

java 复制代码
实现方式:
	单一存在的日志框架,例如JUL、Log4j、Logback、Log4j2(其本身也提供日志门面接口);
	现阶段主流使用slf4j+logback;
	未来趋势使用slf4j+log4j2;
日志架构:
	采用slf4j作为门面,log4j或者logback作为实现框架,中间使用桥接器完成桥接。
日志的输出级别:
	error、warn、info(默认级别)、debug、trace,从左到右级别依次降低;
	其中error、warn、info信息会在控制台输出,其余信息不会输出。

输出形式

java 复制代码
带有占位符的日志输出:
	Logger.info("用户:{},{}",name,age);
输出系统异常:
	try {
	    int i = 1 / 0;
	} catch (Exception e) {
	    logger.error("出现异常:",e);
	}

日志绑定

各种框架的日志输出信息:

java 复制代码
🍇 logback-classic框架:
11:12:32.471 [main] ERROR com.date1.slf4jjTest - error
11:12:32.487 [main] WARN com.date1.slf4jjTest - warn
11:12:32.487 [main] INFO com.date1.slf4jjTest - info
11:12:32.487 [main] DEBUG com.date1.slf4jjTest - debug
11:12:32.487 [main] INFO com.date1.slf4jjTest - 用户:xxx,26

🍇 log4j框架:
引入依赖:slf4j-log4j12 (适配器) 以及 log4j
日志信息展示:
2024-01-22 14:11:51,695 - 0    ERROR [main] com.date1.slf4jjTest:21  - error
2024-01-22 14:11:51,695 - 0    WARN  [main] com.date1.slf4jjTest:22  - warn
2024-01-22 14:11:51,695 - 0    INFO  [main] com.date1.slf4jjTest:23  - info
2024-01-22 14:11:51,695 - 0    INFO  [main] com.date1.slf4jjTest:29  - 用户:xxx,26

运行测试方法,报错:
	log4j:WARN No appenders could be found for logger (com.date1.slf4jjTest).
	log4j:WARN Please initialize the log4j system properly.
	未进行log4j.proterties文件的配置;
	参考修改博客:
	https://www.cnblogs.com/Durant0420/p/14979620.html
	文件配置:
	具体配置文件内容 复制https://www.cnblogs.com/Durant0420/p/14979620.html 博客内容;

🍇 slf4j-simple框架:
[main] ERROR com.date1.slf4jjTest - error
[main] WARN com.date1.slf4jjTest - warn
[main] INFO com.date1.slf4jjTest - info
[main] INFO com.date1.slf4jjTest - 用户:xxx,26

🍇 slf4j-nop框架,关闭日志功能;
进程已结束,退出代码为 0
控制台无任何输出。

🍇 jul日志实现:
使用该实现需要引入适配器slf4j-jdbc,且jul已经被内置;
日志信息展示:
一月 22, 2024 2:31:05 下午 com.date1.slf4jjTest function1
严重: error
一月 22, 2024 2:31:05 下午 com.date1.slf4jjTest function1
警告: warn
一月 22, 2024 2:31:05 下午 com.date1.slf4jjTest function1
信息: info
一月 22, 2024 2:31:05 下午 com.date1.slf4jjTest function1
信息: 用户:xxx,26


🍎 特点:
	绑定多个日志框架时,会默认使用依赖文件中第一个框架;

日志实现框架的绑定流程:

java 复制代码
1.添加slf4j-api的依赖
2.使用slf4j的API在项目中进行统一的日志记录
3.绑定具体的日志实现框架
	绑定已经实现了slf4i的日志框架直接添加对应依赖
	绑定没有实现slf4i的日志框架先添加日志的适配器再添加实现类的依赖
4.slf4i有且仅有一个日志实现框架的绑定 (如果出现多个默认使用第一个依赖日志实现)

桥接旧的框架

java 复制代码
是什么?
	项目设计之初使用简单的日志框架log4j,在后期程序实现过程中需要logback,桥接器可以实现不修改原先log4j而达到升级的目的。
实现?
	原始的log4j 升级为 logback
	需要配置log4j的桥接器,即在pom文件中:log4j-over-slf4j
	<!--        log4j 升级为 logback 配置桥接器-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>log4j-over-slf4j</artifactId>
            <version>1.7.25</version>
        </dependency>

🍎 注意:

桥接器与适配器不能同时出现,即log4j-over-slf4j 与slf4j-log4j12 ,如果同时出现,会出现栈内存溢出的错误,会陷入死循环。

实战

logback

基础概念

是什么?

java 复制代码
Logback是一个广泛用于Java应用的日志记录库。

Logback主要分为三个模块:

java 复制代码
logback-core:其它两个模块的基础模块
logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j API
logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能

日志级别有:error、warn、info、trace、debug(默认级别);

修改日志的默认信息需要通过配置文件;

组件之间的关系:

java 复制代码
1. Logger:日志的记录器,把它关联到应用的对应的context上后,主要用于存放日志对象,也可以定义日志类型、级别。
2. Appender:用于指定日志输出的目的地,目的地可以是控制台、文件、数据库等等。
3. Layout:负责把事件转换成字符串,格式化的日志信息的输出。在logback中Lavout对象被封装在encoder中

配置文件

参见的配置文件:

xml 复制代码
logback会依次读取以下类型配置文件
logback.groovy
logback-test.xml
logback.xml如果均不存在会采用默认配置

控制台输出的appender配置文件:

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	 <!--配置集中管理属性
	 我们可以直接改属性的 value 值格式: ${name} -->
	<property name=" pattern " value="[%-5level]  %d{yyyy-MM-dd HH;mm;ssSSS} %c %M %L [%thread] %m%n " > </property>
	
	<!--
	日志输出格式
	%-5level
	%dlyyyy-MM-dd HH;mm;ssSSS}日期
	%c类的完整名称
	%M为method
	%L为行号
	%thread线程名称
	%m或者%msg为信息
	%n换行
	-->

	<!--控制台日志输出的 appender-->
	<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>
	<!--root logger 配置-->
	<root level="ALL">
		<appender-ref ref="console"></appender-ref>
	</root>

</configuration>

日志文件输出的appender配置文件:

xml 复制代码
<appender name="check_log" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 定义一个名为check_log的日志输出目的地,类型是滚动日志记录器-->
    <encoder><pattern>%msg%n</pattern><charset>UTF-8</charset></encoder>
    <!-- encoder记录日志消息的格式,其中pattern消息格式,%msg%n=只记录消息体,charset字符集 -->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <!-- 使用基于时间的滚动策略,通过class配置-->
        <fileNamePattern>${LOG_HOME}/check_log/%d{yyyy-MM-dd,aux}/check_log.%d{yyyy-MM-dd.HH}.log</fileNamePattern>
        <!-- 文件路径,-->
    </rollingPolicy>
</appender>

<appender name="check_log_async" class="ch.qos.logback.classic.AsyncAppender">
<!-- 定义异步日志文件器,通过class设置,该可以提高日志写入的性能,不会阻塞主线程-->
    <discardingThreshold>0</discardingThreshold>
    <!-- 队列满时,超出的事件被丢弃的阈值,0=意味着不丢弃任何事件 -->
    <queueSize>512</queueSize>
    <!-- 异步记录器使用的队列大小,512=队列大小 -->
</appender>

<logger name="com.unicom.associatedAuth.log.CheckLog" level="INFO" additivity="false">
<!-- 配置日志记录器,name=名称,及对应的类路径;level=日志级别,等于或高于info的会被处理; additivity=false表示日志记录器不会集成父日志记录器的输出目的地,仅输出到自己指定的appender  -->
    <appender-ref ref="check_log_async"/>
    <!-- 日志记录器指定的appender-->
</logger> 

Log4j

概述

Log4j 是一种基于 Java 的日志记录框架,它提供了强大的日志记录功能,包括日志级别、日志输出格式、日志滚动等。

  • 使用:
    采用maven形式,需要导入相应的依赖包;
    配置在 properties 或 XML 文件进行。

案例:

java 复制代码
# 输出到控制台
log4j.rootLogger=DEBUG, stdout
// 定义了一个根记录器(rootLogger),将其日志级别设置为 DEBUG,并将日志输出到控制台。
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
//  定义名stdout 的输出器(appender) 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
//  其输出格式设置为 PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
// 输出格式的字符串(ConversionPattern)
相关推荐
木易 士心1 分钟前
Spring AI 核心架构解析:构建企业级 AI 应用的 Java 新范式
java·spring
61900833612 分钟前
linux 安装jdk
java·linux·运维
懂得节能嘛.15 分钟前
【动态配置中心】Java+Redis构建动态配置中心
java·开发语言·redis
专注于大数据技术栈16 分钟前
Java中JDK、JRE、JVM概念
java·开发语言·jvm
YuanlongWang19 分钟前
C# 基础——值类型与引用类型的本质区别
java·jvm·c#
Kay_Liang44 分钟前
大语言模型如何精准调用函数—— Function Calling 系统笔记
java·大数据·spring boot·笔记·ai·langchain·tools
自由的疯1 小时前
Java 如何学习Docker
java·后端·架构
自由的疯1 小时前
Java Docker本地部署
java·后端·架构
007php0071 小时前
猿辅导Java面试真实经历与深度总结(二)
java·开发语言·python·计算机网络·面试·职场和发展·golang
摇滚侠1 小时前
Spring Boot 3零基础教程,WEB 开发 内容协商机制 笔记34
java·spring boot·笔记·缓存