sheng的学习笔记-logback

基础知识

什么是logback

Logback是一个用于Java应用程序的日志框架,提供了更好的性能、可扩展性和灵活性。

与Log4j相比,Logback提供了更快的速度和更低的内存占用,这使得它成为大型企业级应用程序的理想选择。

logback和slf4j的关系是

logback是slf4j的一个具体实现。slf4j是一个日志门面(facade),提供了一系列的日志接口,而logback是实现这些接口的具体日志框架。应用程序通过调用slf4j的API进行日志操作,而实际的日志输出是由底层的日志框架(如logback)来实现的。

示例程序

引入的包

slf4j-api.jarlogback-core.jarlogback-classic.jar引入项目。

引用的包先不着急,我是springboot的项目,pom.xml用的spring的其他包自动引用了

配置文件

在application.yml中增加配置

复制代码
logging:
  config: classpath:mylogback.xml

在Springboot项目中,如果没有配置,自动寻找 src/main/resources路径下的logback-spring.xml的文件

配置文件基本结构如下图:

logger标签

logger就是日志记录器,用来控制要输出哪些日志记录语句,对日志信息进行级别限制。

有level属性、name属性、additivity属性,其中name属性必须要写,指定到哪一个类或者哪一个包,additivity表示是否向上一层传递打印信息,默认为true。可以包含 appender-ref 元素

使用示例:

<configuration>

<logger level="ERROR" name="com.example.testlog.LogTest" additivity="false">

<appender-ref ref="STDOUT"></appender-ref>

</logger>

</configuration>

root标签

root标签指定最基础的的日志输出级别,它只有一个level属性,可以包含 appender-ref 元素。

level属性可以选择,ALLTRACEDEBUGINFOWARNERRORNULLOFFINHERITED

使用示例:

<configuration>

<root level="debug">

<appender-ref ref="STDOUT"></appender-ref>

</root>

</configuration>

appender标签

appender就是附加器,日志记录器会将输出的任务交给附加器完成,不同的附加器会将日志输出到不同的地方,例如控制台、文件、网络等

几个常见的附加器:

控制台附加器:ch.qos.logback.core.ConsoleAppender

文件附加器:ch.qos.logback.core.FileAppender

滚动文件附加器:ch.qos.logback.core.rolling.RollingFileAppender

属性有name、class,class用来指定附加器,name来表示当前附件器的名字。其他需要指定附件器的标签,可以通过appender-ref标签中的ref来指定。可以包含encoder元素、fileter元素等

使用示例:

<configuration>

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">

<encoder>

<pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{36} - %msg%n</pattern>

</encoder>

</appender>

</configuration>

filter标签

filter是过滤器,过滤器是附件器的一个组件,它是用于判断附件器是否输出日志的。一个附件器可以包含多个过滤器。

过滤器只能有三个值,DENY、NEUTRAL、ACCEPT。

DENY是不输出日志

NEUTRAL是不决定是否输出日志

ACCEPT是输出日志。

可以有三个元素,level元素、onMatch元素、onMismatch元素。<level>:设置过滤级别

<onMatch>:用于配置符合过滤条件的操作

<onMismatch>:用于配置不符合过滤条件的操作。

使用示例:

<configuration>

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">

<filter>

<level>info</level>

<onMatch>DENY</onMatch>

<onMismatch>ACCEPT</onMismatch>

</filter>

<encoder>

<pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{36} - %msg%n</pattern>

</encoder>

</appender>

</configuration>

encoder标签

encoder最主要的就是pattern标签,用于控制输出日志的格式

%d: 表示日期
%-5level:日志级别
%thread:表示线程名
%logger:输出日志的类名
logger{length}:对输出日志的类名缩写展示
%msg:日志输出内容
%n:换行符
-:左对齐

使用示例:

<encoder>

<pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{36} - %msg%n</pattern>

</encoder>

property标签(变量配置)

property标签用来定义变量, 有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值

使用示例:

<property name="HOME" value="../log">

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">

<file>${HOME}/log.log</file>

</appender>

logger和root的区别

在logback中,logger和root logger都是日志记录器(logger)的实例,用于控制日志的输出级别。它们之间的区别在于它们的作用范围和默认配置。

logger是应用程序中的具体组件或类的日志记录器。每个logger都可以单独配置,以控制特定组件或类的日志输出级别。通过logger,我们可以对不同的组件或类设置不同的日志级别,从而灵活地控制日志的输出。

root logger是logger的顶级父级别。它是logger层次结构的根节点,用于控制整个应用程序的日志输出级别。如果没有为特定的logger配置日志级别,那么它将继承root logger的日志级别。因此,root logger的日志级别可以被视为默认的全局日志级别。

完整配置文件

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>logs/logfile.log</file>
        <append>true</append>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="info">
        <appender-ref ref="STDOUT"/>
    </root>

    <logger level="debug" name="com.sheng" additivity="false">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="FILE"/>
    </logger>

</configuration>

代码

java 复制代码
package com.sheng.utils;

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

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

    public static void main(String[] args) {
        logger.debug("Debug message");
        logger.info("Info message");
        logger.warn("Warning message");
        logger.error("Error message");
    }
}

结果

终端打印

文件打印

相关推荐
弥琉撒到我2 小时前
微服务MongoDB解析部署使用全流程
mongodb·spring cloud·微服务·架构
弥琉撒到我3 小时前
微服务SpringSession解析部署使用全流程
spring cloud·微服务·云原生·架构·springsession
追风小老头折腾程序3 小时前
Java单体服务和集群分布式SpringCloud微服务的理解
java·后端·spring·spring cloud
bug菌¹6 小时前
滚雪球学SpringCloud[1.3]:SpringCloud环境搭建
后端·spring·spring cloud
一只编程菜鸟7 小时前
SpringCloud Alibaba之Seata处理分布式事务
分布式·spring·spring cloud
汪小哥8 小时前
浅谈spring 后端项目配置logback日志
java·spring·logback
蹦跶de芝麻1 天前
Spring Cloud Gateway 之动态uri 自定义过滤器
spring cloud
bug菌¹1 天前
滚雪球学SpringCloud[9.1讲]:Docker与容器化详解
spring cloud·docker·eureka
bug菌¹1 天前
滚雪球学SpringCloud[10.2讲]:微服务项目的性能优化与调优
spring cloud·微服务·性能优化