Java 学习笔记 - 日志体系:SLF4J 是啥?与各日志框架啥关系?

Java 学习笔记 - 日志体系:SLF4J 是啥?与各日志框架啥关系?

  • SLF4J 是啥?与各日志框架啥关系?
  • Log4j2
    • 添加适配器依赖
    • web.xml 配置
    • log4j2.xml
  • 参考资料

SLF4J 是啥?与各日志框架啥关系?

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

  • 首先slf4j依赖。引入后,我们就可以嗨皮了…
<dependency>
   <groupId>org.slf4jgroupId>
   <artifactId>slf4j-apiartifactId>
   <version>2.0.0-alpha5version>
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与目标日志框架进行绑定

Java 学习笔记 - 日志体系:SLF4J 是啥?与各日志框架啥关系?_第1张图片

  1. 再次强调:SLF4J 是一个抽象层,它的出现就是为了屏蔽各种日志实现方案的差异。应用层开发只针对 SLF4J 编程即可,日志的底层实现,可以按需配不同的包。

  2. 项目统一了日志API,可以避免同时维护几套日志体系的烦恼。天下大同,引用外人的依赖也不怕日志乱了。

  3. 从图中也可以看出,有些日志框架是直接实现 SLF4J 的,有些还需要加一个适配层转换一下。

  4. 依赖关系:比如我们引用了某个依赖,展开一看它下面就有 org.slf4j-slf4j-api:1.7.5 这种,意思就是说他的日志是按 SLF4J 接口写的,你得自己添加个具体的实现。

  5. 常见的还有 底层日志框架 版本与 SLF4J 不匹配问题。一般别差大版本都能跑。

  6. 还有一种常见的情况,我们需要排除依赖中自带的底层日志框架,然后自己手动换一个符合项目的。比如:那些自带了 log4j2 雷爆版本的依赖。

Log4j2

  • 输出规则:
    • 门槛越高,输出越少。
    • 门槛比较低,那么比它严重的都会打印出来。比如设置了WARN,那么除了WARN,比它更严重的ERROR,FATAL都会打印出来。
  • 日志级别(门槛):共8个,从高到低:
Standard Level intLevel 说明
OFF 0 【最高冷】不打印任何日志
FATAL 100 崩溃
ERROR 200 报错
WARN 300 警告
INFO 400
DEBUG 500 打印 SQL 执行语句
TRACE 600 打印 SQL 结果
ALL Integer.MAX_VALUE 【最低】打印所有日志

添加适配器依赖

绑定log4j2实现:

		
		<dependency>
			<groupId>org.apache.logging.log4jgroupId>
			<artifactId>log4j-slf4j-implartifactId>
			<version>${log4j.version}version>
		dependency>
		
		<dependency>
			<groupId>org.apache.logging.log4jgroupId>
			<artifactId>log4j-webartifactId>
			<version>${log4j.version}version>
			<scope>runtimescope>
		dependency>

web.xml 配置

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

    
	<context-param>
		<param-name>log4jConfigurationparam-name>
		<param-value>classpath:log4j2.xmlparam-value>
	context-param>
	
	
	<listener>
		<listener-class>org.apache.logging.log4j.web.Log4jServletContextListenerlistener-class>
	listener>
	<filter>
		<filter-name>log4jServletFilterfilter-name>
		<filter-class>org.apache.logging.log4j.web.Log4jServletFilterfilter-class>
	filter>
	<filter-mapping>
		<filter-name>log4jServletFilterfilter-name>
		<url-pattern>/*url-pattern>
		<dispatcher>REQUESTdispatcher>
		<dispatcher>FORWARDdispatcher>
		<dispatcher>INCLUDEdispatcher>
		<dispatcher>ERRORdispatcher>
	filter-mapping>
	

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

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

log4j2.xml

  • 添加配置文件 :src/main/resources/log4j2.xml
  • 输出
    • 控制台:打印 DEBUG 和比它更严重的日志。
    • all.log:和控制台一样,写到日志文件,备份。(这个有点猛,硬盘抗不住)
    • error.log:单独记录所有错误日志。
    • mybatis.log:单独记录mybatis执行的SQL和结果


<configuration status="error" monitorInterval="30">
    <properties>
        
        <property name="LOG_HOME">${log4j.logFileBasePath}property>
        
        <property name="PATTERN_LAYOUT">%-5level %d{yyyy-MM-dd HH:mm:ss.SSS}{GMT+8} %class{36} %L %M - %msg%xEx%nproperty>
        
        <property name="errorBakPattern">${log4j.logFileBasePath}/error/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log.gzproperty>
        <property name="mybatisBakPattern">${log4j.logFileBasePath}/mybatis/$${date:yyyy-MM}/mybatis-%d{yyyy-MM-dd}-%i.log.gzproperty>
    properties>

    
    <appenders>
        
        <Console name="Console" target="SYSTEM_OUT">
            
            <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}"/>
            
            <Filters>
                <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            Filters>
            
            <SizeBasedTriggeringPolicy size="50MB"/>
            
            <DefaultRolloverStrategy max="20"/>
        RollingFile>
        
        
        <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>
    
    <loggers>
        
        <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 name="com.jerry" />
        
        <root level="debug">
            <appender-ref ref="Console"/>
            <appender-ref ref="ALL"/>
            <appender-ref ref="ERROR"/>
        root>
    loggers>
configuration> 

参考资料

笑虾:log4j2 核弹大锅,顺便学习 SLF4J 与 log4j2 各日志框架关系
笑虾:log4j 告警:log4j:WARN No appenders could be found for logger(包含配置文件说明)

SLF4J 官方文档 - SLF4J 常见问题(版本关系之类的看这里)
log4j2 官方文档 - log4j - PatternLayout
Mybatis 官方文档 - 日志
Log4J.properties 例子

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

你可能感兴趣的:(Java,java,后端,slf4j,log,日志)