Java# 在项目中使用SLF4J+Logback来记录日志

Posted LRcoding

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java# 在项目中使用SLF4J+Logback来记录日志相关的知识,希望对你有一定的参考价值。

1. 简介

1.1 SLF4J概述

SLF4J 代表 Simple Logging Facade for Java。相当于一个门面,提供了 Java 中所有日志框架的简单抽象。

  • 使用 SLF4J 框架,可以在部署时,迁移到所需的日志记录框架(如 Log4j, JUL, Simple logging,NOP等)
  • SLF4J 支持参数化日志记录消息
  • SLF4J提供了一个简单的Java工具,称为迁移器。

日志严重程度

序号严重程度描述
1Fatal导致应用程序终止的严重问题
2ERROR运行时错误
3WARNING大多数情况下,这种级别的错误是由于使用了已弃用的API
4INFO运行时发生的事件
5DEBUG有关系统流程的信息
6TRACE有关系统流程的更多详细信息

SLF4J 和 Log4j的关系

1.2 Logback概述

Logback 分为三个不同的模块,logback-core(核心代码模块),logback-classic(log4j的一个改良版本,同时实现了slf4j的接口,这样如果之后要切换其他日志组件也是一件很容易的事),logback-access(访问模块与Servlet容器集成提供通过Http来访问日志的功能)

LoggerLoggerFactory 是 SLF4J包中的类 , LoggerContext 的作用是获得内部状态信息

logback在启动的时候,会按照下面的顺序加载配置文件(只要获取到配置之后就不再继续获取了)

  • 如果Java程序启动时指定了logback.configurationFile属性,就用该属性指定的配置文件。
    • java -D logback.configurationFile=/path/myLogback.xml Test,这样执行Test类的时候就会加载/path/myLogback.xml配置
  • 在classpath(resources目录下)中查找 logback.groovy 文件
  • 在classpath中查找 logback-test.xml 文件
  • 在classpath中查找 logback.xml 文件
  • 如果是 JDK6+,那么会调用ServiceLoader 查找 com.qos.logback.classic.spi.Configurator接口的第一个实现类
  • 自动使用 ch.qos.logback.classic.BasicConfigurator 在控制台输出日志

2. 项目中进行使用

使用 Maven进行快速开发

2.1 导入依赖

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.25</version>   <!-- 请根据情况选择合适的版本 -->
</dependency>

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>  <!-- 请根据情况选择合适的版本 -->
</dependency>

2.2 在resources目录下添加logback.xml

示例文件

<?xml version="1.0" encoding="UTF-8"?>
<!-- 
	debug(默认false):要不要打印 logback内部日志信息 
	scan(默认true):配置发生改变时,要不要重新加载
	scanPeriod(默认1 seconds):检测配置发生变化的时间间隔。如果没给出时间单位,默认时间单位是毫秒
-->
<configuration debug="true" scan="true" scanPeriod="1 minutes">
    <!-- 日志存放路径 -->
	<property name="log.path" value="./logs" />

	<!-- 控制台输出 -->
    <!-- 日志输出格式 -->
    
    <property name="console.pattern" value="%dHH:mm:ss.SSS [%thread] %-5level %logger20 - [%method,%line] - %msg%n" /> <!--定义参数,后面可以通过$console.pattern使用-->
    
    <!--ConsoleAppender 用于在屏幕上输出日志-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoder 默认配置为PatternLayoutEncoder -->
        <!--定义控制台输出格式-->
        <encoder>
			<pattern>$console.pattern</pattern>
		</encoder>
	</appender>

	<!-- 系统日志输出 -->
    <!-- 日志输出格式 -->
    <property name="log.pattern" value="%dHH:mm:ss.SSS [%thread] %-5level %logger20 - [%method,%line] - %msg%n" />
	<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
	    <file>$log.path/sys-info.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
			<fileNamePattern>$log.path/sys-info.%dyyyy-MM-dd.log</fileNamePattern>
			<!-- 日志最大的历史 30天 -->
			<maxHistory>30</maxHistory>
		</rollingPolicy>
		<encoder>
			<pattern>$log.pattern</pattern>
		</encoder>
        
        <!-- 定义了一个过滤器,在level之下的日志输出不会被打印出来 -->
        <!-- 这里定义了INFO,也就是控制台不会输出比INFO级别小的日志 -->
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>INFO</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
	</appender>

	<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
	    <file>$log.path/sys-error.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>$log.path/sys-error.%dyyyy-MM-dd.log</fileNamePattern>
			<!-- 日志最大的历史 40天 -->
			<maxHistory>40</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>$log.pattern</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>ERROR</level>
			<!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
			<!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

	<!-- 系统模块日志级别控制  -->
    <!--对于类路径以 com.xxxx 开头的Logger,输出级别设置为debug,并且只输出到控制台-->
    <!--这个logger没有指定appender,它会继承root节点中定义的那些appender-->
	<logger name="com.lwclick" level="debug" />            <!-- 需要根据自己的包名进行修改 -->

    <!--root是默认的logger 这里设定输出级别是info-->
	<root level="info">
        <!-- 引用了一个appender,日志会往这个appender里面写 -->
		<appender-ref ref="console" />
	</root>

	<!--系统操作日志-->
    <root level="info">
        <appender-ref ref="file_info" />
        <appender-ref ref="file_error" />
    </root>
</configuration>

2.3 代码中使用

public class Main 
    static final Logger logger = LoggerFactory.getLogger(Main.class);

    public static void main(String[] args) 
        logger.info("", "测试信息");
    

以上是关于Java# 在项目中使用SLF4J+Logback来记录日志的主要内容,如果未能解决你的问题,请参考以下文章

SLF4J和Logback

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

IDEA项目搭建九——使用slf4j和logback进行日志记录

Java日志体系最佳实践

Logback,SLF4J,Log4J2。了解它们并学习如何使用。(翻译)

Springboot中logback与slf4j冲突排坑