java#在项目中使用slf4j+logback来记录日志

LRcoding      2022-06-13     230

关键词:

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("", "测试信息");
    

在 SLF4J/Logback 中使用标记的最佳实践

】在SLF4J/Logback中使用标记的最佳实践【英文标题】:BestpracticesforusingMarkersinSLF4J/Logback【发布时间】:2011-05-0902:39:14【问题描述】:我们在项目中使用SLF4J+Logback组合已有一段时间了,对此非常满意,但我们的日志记录策略相当简... 查看详情

slf4j和logback(代码片段)

问题:由于项目需要,今天弄了很久,SLF4J和Logback 一、SLF4J和Logback和CommonsLogging和Log4j的区别以及在普通的java项目中使用:SLF4J和CommonsLogging类似,充当日志API,Logback和Log4j类似,充当其实现类,为什么有了CommonsLogging和Log4j,又... 查看详情

springboot中logback与slf4j冲突排坑

...okeeper作为服务治理,导致在用Junit进行单元测试时出现了logback与slf4j冲突的问题。springboot使用logback打印日志,我们的项目正好用了这一点,所以解决办法是排除掉zookeeper中slf4j的依赖 查看详情

使用slf4j和logback(一:基本使用)

 1.SLF4J是什么?slf4j是一个日志门面,它不是具体的日志实现框架,而是提供了通用的日志接口,按个人理解来说,是通过接口实现多态,来满足应用在不同日志框架间切换的需求。例如在程序中我们需要记录日志,使用SLF4J... 查看详情

logback源码分析(代码片段)

...ortorg.slf4j.LoggerFactory;//省略...Loggerlogger=LoggerFactory.getLogger(LogbackTest.class);logger.info("isbestplayerinworld","Greizmann");本文以Logback日志框架来分析以上代码的实现。slf4j如今日志框架常用的有log4j、log4j2、jul(common-log)以及logba... 查看详情

从源码来理解slf4j的绑定,以及logback对配置文件的加载(代码片段)

...om/youzhibing/p/6849843.html 编译期间,完成slf4j的绑定已经logback配置文件的加载。slf4j会在classpath中寻找org/slf4j/impl/StaticLoggerBinder.class(会在具体的日志框架如log4j、logback等中存在),找到并完成绑定;同时,logback也会在classpath中寻... 查看详情

项目存在多个logback配置

以下两个是我在使用slf4j+logback时候日志提示的问题,问题不大,都是WARN,并不真正影响运行,但是结果可能不是你希望的结果。<1>SLF4J:Foundbindingin[jar:file:/servers/storm-0.9.0.1/lib/logback-classic-1.0.6.jar!/org/slf4j/impl/StaticLoggerBinder.cla... 查看详情

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

...理要转换成logbacak的日志管理。介于之前并未深究log4j和logback日志,所以做起来也很是头疼,不得不查询资料问别人,才勉强完成,所以记录一下从头的步骤,以供别人参考,有不对地方还请大神斧正。首先提供一下log4j和slf4j以... 查看详情

logback,slf4j,log4j2。了解它们并学习如何使用。(翻译)(代码片段)

...此已经编写了各种框架。一些Java日志记录框架包括Log4j,logback,Apache通用日志记录,java.util.Logger等。所有这些日志记录器都将日志记录到文件或其他指定的介质中。什么是SLF4JSLF4j代表Java的简单日志记录外观。顾名思义,它是... 查看详情

logback最佳实践

参考技术ALogback是由log4j创始人设计的一个开源日志组件。LogBack被分为3个组件,logback-core,logback-classic和logback-access。Logback是要与SLF4J结合起来。这两个组件的官方网站如下:logback官方网站:logback官方网站SLF4J官方网站:SLF4J官方... 查看详情

springboot学习

...层是spring框架,spring框架默认使用JCL;springboot选用SLF4j和logback;2、SLF4j使用1、如何在系统中使用SLF4j以后开发的时候,日志记录方法的调用,不应该来直接调用日志的实现类,而是调用日志抽象层里面的方法;应该给系统里面导入... 查看详情

slf4j和logback日志框架详解(代码片段)

SLF4J和Logback日志框架详解作者:chszs,转载需注明。博客主页:http://blog.csdn.net/chszs本文讲述SLF4J和Logback日志框架。  SLF4J是一套简单的日志外观模式的JavaAPI,帮助在项目部署时对接各种日志实现。LogBack在运行时... 查看详情

log4j/log4j2/logback混用问题

...了解标题提到的几个日志框架,建议了解一下log4j/log4j2/logback简单使用说明,本节中pom依赖前面的内容;log4jdemolog4j2demologbackdemologdemojava项目一般会选择一种日志框架,但很难保证当前项目依赖的三方组件会选用和当前项目相同... 查看详情

如何在单个项目中使用多个配置和 logback?

】如何在单个项目中使用多个配置和logback?【英文标题】:Howtousemultipleconfigurationswithlogbackinasingleproject?【发布时间】:2011-10-0516:27:27【问题描述】:logback的配置文件在类路径中找到,因此是Eclipse-project-specific,这不是我想要的... 查看详情

springboot应用日志

...用到第三方库,所以我们推荐在Spring应用中使用SLF4J/Logback来记录日志。SLF4J与Logback简介SLF4J——SimpleLoggingFacadeForJava,它是一个针 查看详情

SLF4J + Logback 不登录 WildFly

】SLF4J+Logback不登录WildFly【英文标题】:SLF4J+LogbackdoesnotloginWildFly【发布时间】:2014-05-2913:23:37【问题描述】:我在WildFly8中运行Web应用程序,但由于某种原因它没有记录。我将SLF4J与LOGBACK一起使用。日志文件是在部署时创建的,... 查看详情

jdk9的新特性:jvm的xlog

...出现的问题。在现代java项目中,我们使用log4j或者slf4j,Logback等日志记录框架来处理日志问题。JVM是java程序运行的基础,JVM中各种事件比如:GC,classloading,JPMS,heap,thread等等其实都可以有日志来记录。通过这些 查看详情

slf4j+logback实现日志输出和记录(代码片段)

一、SLF4J   SLF4J,即简单日志门面(SimpleLoggingFacadeforJava),不是具体的日志解决方案,它只服务于各种各样的日志系统。在使用SLF4J的时候,不需要在代码中或配置文件中指定你打算使用那个具体的日志系统。   使用... 查看详情