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");
    }
}

结果

终端打印

文件打印

相关推荐
身如柳絮随风扬1 天前
Dubbo 与 Spring Cloud 终极对比:RPC 框架 vs 微服务生态
spring cloud·rpc·dubbo
一个有温度的技术博主1 天前
Spring Cloud 入门与实战:从架构拆分到核心组件详解
spring·spring cloud·架构
uNke DEPH1 天前
SpringCloud Gateway 集成 Sentinel 详解 及实现动态监听Nacos规则配置实时更新流控规则
spring cloud·gateway·sentinel
慕容卡卡1 天前
你所不知道的RAG那些事
java·开发语言·人工智能·spring boot·spring cloud
dLYG DUMS2 天前
Spring Cloud Data Flow 简介
后端·spring·spring cloud
Ken_11152 天前
SpringCloud系列(61)--Nacos之服务配置中心的介绍与使用
spring cloud
Ken_11152 天前
SpringCloud系列(62)--Nacos之命名空间、分组和DataID三者之间的关系
spring cloud
Ken_11152 天前
SpringCloud系列(63)--Nacos读取不同配置之DataID配置方案
spring cloud
Devin~Y2 天前
从Spring Boot到Spring AI:音视频AIGC内容社区Java大厂面试三轮连环问(含Kafka/Redis/安全/可观测性答案)
java·spring boot·redis·spring cloud·kafka·spring security·resilience4j
eSsO KERF2 天前
使用 Logback 的最佳实践:`logback.xml` 与 `logback-spring.xml` 的区别与用法
xml·spring·logback