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.01^10002 分钟前
[0405].第05节:搭建Redis主从架构
java·redis
power-辰南3 分钟前
深入理解 Java 设计模式之策略模式
java·设计模式·策略模式
imning18 分钟前
gateway在eureka注册报java.lang.IndexOutOfBoundsException
java·开发语言
夏壹-10分分享35 分钟前
ThreadLocal为什么会导致内存泄漏?如何解决的?
java·开发语言·jvm
连胜优佳40 分钟前
19、javase- System类常用方法
java·开发语言
DanceDonkey42 分钟前
基于wait/notify方法 实现生产/消费者模型
java·数据库·中间件
宇宙李1 小时前
微服务中熔断和降级的区别,具体使用场景有哪些?
java·数据库·微服务
连胜优佳1 小时前
20、javase-API.容器
java·开发语言
leo_hush2 小时前
【Flink】flink或java异常日志输出不完整问题解决
java·大数据·flink
binqian2 小时前
【Docker】安装registry本地镜像库,开启Https功能
java·docker·https