java学习笔记-日志体系slf4j+log4j2(代码片段)

笑虾 笑虾     2022-12-01     768

关键词:

Java 学习笔记 - 日志体系

SLF4J

Simple Logging Facade for Java (SLF4J) 充当各种日志框架(例如 java.util.logging、logback、log4j)的简单外观或抽象(外观模式),允许最终用户在部署时插入所需的日志框架。(啥叫面向接口编程,这就是吧。)
SLF4J的出现是为了干掉上一个想一统江湖,却又力不从心的JCL(Jakarta Commons Logging)

  • 首先slf4j依赖。引入后,我们就可以嗨皮了…
<dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-api</artifactId>
   <version>2.0.0-alpha5</version>
</dependency>

官方 HelloWorld

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HelloWorld 
  public static void main(String[] args) 
    Logger logger = LoggerFactory.getLogger(HelloWorld.class);
    logger.info("Hello World");
  

到了具体部署时,我们再选择使用哪个日志框架,只需要引用一个依赖,就可以实现将SLF4J与目标日志框架进行绑定

Log4j2

  • 输出规则:
    • 门槛越高,输出越少。
    • 门槛比较低,那么比它严重的都会打印出来。比如设置了WARN,那么除了WARN,比它更严重的ERROR,FATAL都会打印出来。
  • 日志级别(门槛):共8个,从高到低:
Standard LevelintLevel说明
OFF0【最高冷】不打印任何日志
FATAL100崩溃
ERROR200报错
WARN300警告
INFO400
DEBUG500打印 SQL 执行语句
TRACE600打印 SQL 结果
ALLInteger.MAX_VALUE【最低】打印所有日志

添加适配器依赖

绑定log4j2实现:

		<!-- 绑定实现:slf4j 绑定到 log4j2  -->
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-slf4j-impl</artifactId>
			<version>$log4j.version</version>
		</dependency>
		<!-- log4j2 应用于 web 项目时,解决资源释放问题  -->
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-web</artifactId>
			<version>$log4j.version</version>
			<scope>runtime</scope>
		</dependency>

web.xml 配置

SpringMVC项目 src/main/webapp/WEB-INF/web.xml

    <!-- 这个是默认的只可以省  -->
	<context-param>
		<param-name>log4jConfiguration</param-name>
		<param-value>classpath:log4j2.xml</param-value>
	</context-param>
	
	<!-- log4j2-begin -->
	<listener>
		<listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
	</listener>
	<filter>
		<filter-name>log4jServletFilter</filter-name>
		<filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>log4jServletFilter</filter-name>
		<url-pattern>/*</url-pattern>
		<dispatcher>REQUEST</dispatcher>
		<dispatcher>FORWARD</dispatcher>
		<dispatcher>INCLUDE</dispatcher>
		<dispatcher>ERROR</dispatcher>
	</filter-mapping>
	<!-- log4j2-end -->

如果是log4jlog4j2记得清理垃圾。去掉log4j的配置

<context-param>
	<param-name>log4jConfigLocation</param-name>
	<param-value>classpath:properties/log4j.properties</param-value>
</context-param>

log4j2.xml

  • 添加配置文件 :src/main/resources/log4j2.xml
  • 输出
    • 控制台:打印 DEBUG 和比它更严重的日志。
    • all.log:和控制台一样,写到日志文件,备份。(这个有点猛,硬盘抗不住)
    • error.log:单独记录所有错误日志。
    • mybatis.log:单独记录mybatis执行的SQL和结果
<?xml version="1.0" encoding="UTF-8"?>
<!-- 
status 日志级别。当设置成trace时,你会看到log4j2内部各种详细输出。
monitorInterval:自动检测修改配置,设置间隔秒数。
    %d: 表示日期
    %level:表示日志级别,%-5level,表示5个占位符
    %C: 包名 (%F: 类文件名,这里没加)
    %t: 方法名
    %L: 行号
    %m: 消息体(即我们填的信息)
    详见:本文底部:log4j2 官方文档 - log4j - PatternLayout
-->
<configuration status="error" monitorInterval="30">
    <properties>
        <!-- 存log文件的根目录。 $log4j.logFileBasePath 是 pom.xml 中定义的环境变量 -->
        <property name="LOG_HOME">$log4j.logFileBasePath</property>
        <!-- 日志内容格式化 -->
        <property name="PATTERN_LAYOUT">%-5level %dyyyy-MM-dd HH:mm:ss.SSSGMT+8 %class36 %L %M - %msg%xEx%n</property>
        <!-- RollingFile 备份位置 -->
        <property name="errorBakPattern">$log4j.logFileBasePath/error/$$date:yyyy-MM/error-%dyyyy-MM-dd-%i.log.gz</property>
        <property name="mybatisBakPattern">$log4j.logFileBasePath/mybatis/$$date:yyyy-MM/mybatis-%dyyyy-MM-dd-%i.log.gz</property>
    </properties>

    <!--先定义所有的 appender-->
    <appenders>
        <!--【控制台】-->
        <Console name="Console" target="SYSTEM_OUT">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
            <!--这个都知道是输出日志的格式-->
            <PatternLayout pattern="$PATTERN_LAYOUT"/>
        </Console>
        
        <!--【完整日志】-->
        <File name="ALL" fileName="$LOG_HOME/all.log" append="false">
            <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY" />
            <PatternLayout charset="UTF-8" pattern="$PATTERN_LAYOUT"/>
        </File>
        
        <!--【错误日志】-->
        <RollingFile name="ERROR" fileName="$LOG_HOME/error.log" filePattern="$errorBakPattern">
            <PatternLayout charset="UTF-8" pattern="$PATTERN_LAYOUT"/>
            <!--输出error及以上级别的日志-->
            <Filters>
                <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <!--单个文件大小,超过后按filePattern重命名并压缩归档-->
            <SizeBasedTriggeringPolicy size="50MB"/>
            <!-- 同一文件夹下最多几个文件,默认7个 -->
            <DefaultRolloverStrategy max="20"/>
        </RollingFile>
        
        <!--【Mybatis日志】-->
        <RollingFile name="Mybatis" fileName="$LOG_HOME/mybatis.log" filePattern="$mybatisBakPattern">
            <PatternLayout charset="UTF-8" pattern="$PATTERN_LAYOUT"/>
            <Filters>
                <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <SizeBasedTriggeringPolicy size="50MB"/>
            <DefaultRolloverStrategy max="20"/>
        </RollingFile>
    </appenders>
    <!--定义logger,不指定 appender-ref 会从父级向上找-->
    <loggers>
        <!--
        	mybatis 日志(好像不支持通配符,以后一定把Dao放在一块555)
        	additivity="false" 不向父级传递,因为不想父级再打一遍,
        	那样就与 <logger name="com.jerry" /> 重复了。
        -->
        <logger name="com.jerry.event.node.dao" level="trace" additivity="false">
            <appender-ref ref="Mybatis"/>
        </logger>
        <logger name="com.jerry.event.info.dao" level="trace" additivity="false">
            <appender-ref ref="Mybatis"/>
        </logger>
        <logger name="com.jerry.event.flow.dao" level="trace" additivity="false">
            <appender-ref ref="Mybatis"/>
        </logger>
        <logger name="com.jerry.event.extension.dao" level="trace" additivity="false">
            <appender-ref ref="Mybatis"/>
        </logger>
        <logger name="com.jerry.event.eventoutsize.dao" level="trace" additivity="false">
            <appender-ref ref="Mybatis"/>
        </logger>
        <logger name="com.jerry.event.mapper" level="trace" additivity="false">
            <appender-ref ref="Mybatis"/>
        </logger>
        <!--为当前项目项目定义 logger-->
        <logger name="com.jerry" />
        <!--root的logger-->
        <root level="debug">
            <appender-ref ref="Console"/>
            <appender-ref ref="ALL"/>
            <appender-ref ref="ERROR"/>
        </root>
    </loggers>
</configuration> 

参考资料

log4j2 核弹大锅,顺便学习 SLF4J 与 log4j2 各日志框架关系

log4j2 官方文档 - log4j - PatternLayout
Mybatis 官方文档 - 日志

java日志发展史 log4j slf4j log4j2 jul jcl 日志和各种桥接包的关系
聊一聊log4j2配置文件log4j2.xml

log4j,log4j2,logback,slf4j日志学习

日志学习笔记Log4jLog4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、数据库等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致... 查看详情

log4j,log4j2,logback,slf4j日志学习(代码片段)

<divid="content_views"class="markdown_views"> <!--flowchart箭头图标勿删--> <svgxmlns="http://www.w3.org/2000/svg"style="display:no 查看详情

java日志框架学习--logback和log4j2--下

Java日志框架学习--LogBack和Log4j2--下LogbackLogback中的组件Logback配置文件日志输出格式使用演示配置文件输出到控制台输出到控制台和文件输出到控制台,文件和html日志拆分过滤器异步日志自定义LoggerLog4jLog4j2简介Log4j2特征应用演示... 查看详情

java日志使用slf4j配置log4j后,有日志文件但日志文件内容为空

SLF4J的全称是SimpleLoggingFacadeforJava,即简单日志门面。SLF4J并不是具体的日志框架,而是作为一个简单门面服务于各类日志框架,如java.util.logging,logback和log4j。SLF4J支持{}作为占位符,等价于C语言中的%s,而不必再进行字符串的拼... 查看详情

java日志框架--log4j2(入门案例slf4j+log4j2log4j2异步日志无垃圾记录)(代码片段)

1.log4j2ApacheLog4j2是对Log4j的升级版,参考了logback的一些优秀的设计,并且修复了一些问题,因此带来了一些重大的提升,主要有:异常处理,在logback中,Appender中的异常不会被应用感知到,但是在log... 查看详情

java日志框架--log4j2(入门案例slf4j+log4j2log4j2异步日志无垃圾记录)(代码片段)

1.log4j2ApacheLog4j2是对Log4j的升级版,参考了logback的一些优秀的设计,并且修复了一些问题,因此带来了一些重大的提升,主要有:异常处理,在logback中,Appender中的异常不会被应用感知到,但是在log... 查看详情

log4j笔记:升级2.x版本的日志滚动问题

因为slf4j依赖的log4j在流量大的时候总遇到多线程引起的死锁问题,升级到log4j2.x版本。原来的log4j.properties配置文件已经不被log4j2支持了,需要改写为log4j2.xml。在升级的过程中,配置与原先相同,使用异步日志,按小时滚动,却... 查看详情

java日志体系jcl和slf4j(代码片段)

Java日志体系(二)jcl和slf4j《java日志体系(一)统一日志》:https://www.cnblogs.com/binarylei/p/9828166.html《Java日志体系(二)jcl和slf4j》:https://www.cnblogs.com/binarylei/p/10781582.html前面介绍了jdk自带的logging、log4j1、log4j2、logback等实 查看详情

理清java日志体系框架组成推荐组合及常见问题处理(代码片段)

目录1、日志框架发展史(按时间排序)1.1 Log4j1.2 J.U.L(jdk-logging)1.3 J.C.L(commons-logging)1.4Slf4j(SimpleLoggingFacadeforJava)1.5Logback1.6Log4j22、日志框架组成部分2.1 接口/门面类(3个)2.2 实现类(4个)2.3 桥接类(12个)3、日志框架各部分的作用... 查看详情

slf4j+log4j2模式的日志搭建

...大家介绍一下我们我们在项目中必须得有的一个部分——日志!是的,就是那些让我们看着头疼的东西~~~好的日志可以帮助团队成员快速发现并解决问题,用好了可以大幅度提高代码缺陷修复效率!言归正传,今天先来讲讲如何... 查看详情

log4j2+slf4j日志不打印问题

参考技术A问题原因:使用slf4j+log4j2时使用的桥接包是log4j-slf4j-impl,https://logging.apache.org/log4j/2.x/log4j-slf4j-impl/index.html项目中存在多个日志的实现(例如:slf4j-log4j12)通过mvndependency:tree查看现有依赖包,进行排除即可 查看详情

理清java日志体系框架组成推荐组合及常见问题处理(代码片段)

目录1、日志框架发展史(按时间排序)1.1 Log4j1.2 J.U.L(jdk-logging)1.3 J.C.L(commons-logging)1.4Slf4j(SimpleLoggingFacadeforJava)1.5Logback1.6Log4j22、日志框架组成部分2.1 接口/门面类(3个)2.2 实现类(4个)2.3 桥接类(12个)3、日志框架各部分的作用... 查看详情

log4j学习笔记

log4j是一个用Java编写的可靠,快速和灵活的日志框架(API),它在Apache软件许可下发布。Log4j是高度可配置的,并可通过在运行时的外部文件配置。它根据记录的优先级别,并提供机制,以指示记录信息到许多的目的地,诸如:... 查看详情

java日志框架--log4j2(入门案例slf4j+log4j2log4j2异步日志无垃圾记录)(代码片段)

...数配置,最实用的就是我们在生产上可以动态的修改日志的级别而不需要重启应用。无垃圾机制,log4j2在大部分情况下,都可以使用其设计的一套无垃圾机制,避免频繁的日志收集导致的jvmgc。官网:https://logg... 查看详情

mybatis学习笔记-04(代码片段)

mybatis学习笔记-041.设置日志1.1默认日志1.2LOG4J2.分页2.1limit分页2.2RowBounds分页3.lombok使用方法4.使用注解开发使用注解进行CRUD1.设置日志日志可以方便我们排错,默认是不开启的,开启需要在核心配置文件中设置。name和value... 查看详情

java日志框架slf4j和log4j以及logback的联系和区别

1.SLF4J(SimpleloggingFacadeforJava)意思为简单日志门面,它是把不同的日志系统的实现进行了具体的抽象化,只提供了统一的日志使用接口,使用时只需要按照其提供的接口方法进行调用即可,由于它只是一个接口,并不是一个具体的... 查看详情

slf4j搭配log4j2处理日志(代码片段)

...Log4j2+Slf4j应该是未来的大势所趋。关于slf4jLF4J不同于其他日志类库,与其它日志类库有很大的不同。SLF4J(SimpleloggingFacadeforJava)不是一个真正的日志实现,而是一个抽象层(abstractionlayer),它允许你在后台使用任意一个日志类库... 查看详情

log4j+slf4j管理日志项目迁移logback+slf4j

...生,最近被安排了一个任务,原有的项目中使用的是log4j日志管理要转换成logbacak的日志管理。介于之前并未深究log4j和logback日志,所以做起来也很是头疼,不得不查询资料问别人,才勉强完成,所以记录一下从头的步骤,以供... 查看详情