使用Logback设置日志级别

Logback设置日志级别

使用Logback设置日志的设置方式现在已经有很多文章说明,本文重点说明不同设置方式的区别和用途。首先列举常用的三种方式,接下来说明其区别。

appender中的LevelFilter:

级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志

 <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
   <filter class="ch.qos.logback.classic.filter.LevelFilter">
     <level>INFO</level>
     <onMatch>ACCEPT</onMatch>
     <onMismatch>DENY</onMismatch>
   </filter>
   ...
 </appender>

appender中的ThresholdFilter:

临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL。跟LevelFilter的区别在于一个是区间,一个是单点。

 <appender name="CONSOLE"   class="ch.qos.logback.core.ConsoleAppender">
   <!-- 过滤掉 TRACE 和 DEBUG 级别的日志-->
   <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
     <level>INFO</level>
   </filter>
   ...
 </appender>   

logger中的Level:

用来设置指定名称的日志级别,如果不设定,那么采用父类的level,最顶级的父类是ROOT,一般用来调整指定类的日志级别,其规则为等于或者高于设定level的日志才可能输出(注意是可能,因为还要看appender的设置)

<logger level="TRACE" name="com.test.pk1"/>

那么以上几种应该如何使用,如何生效?

如何生效:可以这样理解日志的处理流水线:

先判断logger的level,如果不满足直接丢弃不打印,如果满足进入下一步

1、找到关联的appender,根据appender的filter对日志进行过滤

2、如何应用:通过logger设置日志的level比较常见,也比较容易理解。既然已经能够通过logger的level控制日志按照级别输出,appender的filter什么时候用?

主要应用的场景是:按照日志级别保存不同的文件。比如等于或高于error级别保存到log_error.log文件,等于或高于warn级别保存到log_warn.log文件(深究一下:为什么要按照级别保存不同的文件?方便发现问题,因为实际应用中DEBUG级别的日志量往往很大,通过日志分级别保存,可以直接看error级别的日志,快速发现问题)。

Example:

<appender class="ch.qos.logback.core.rolling.RollingFileAppender" name="WarnLogFile">
        ...
        <file>${LOGS_DIR}/log-warn.log</file>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>WARN</level>
        </filter>
        ...
    </appender>

    <appender class="ch.qos.logback.core.rolling.RollingFileAppender" name="InfoLogFile">
        ...
        <file>${LOGS_DIR}/log-info.log</file>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        ...
    </appender>

    <appender class="ch.qos.logback.core.rolling.RollingFileAppender" name="DebugLogFile">
        ...
        <file>${LOGS_DIR}/log-debug.log</file>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>
        ...
    </appender>

Logback日志-分日志等级别输出

一 logback的介绍

Logback是由log4j创始人设计的另一个开源日志组件,官方网站: http://logback.qos.ch。它当前分为下面下个模块:

  • logback-core:其它两个模块的基础模块
  • logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging
  • logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能

二 logback的配置介绍

Logger、appender及layout

Logger作为日志的记录器,把它关联到应用的对应的context上后,主要用于存放日志对象,也可以定义日志类型、级别。

Appender主要用于指定日志输出的目的地,目的地可以是控制台、文件、远程套接字服务器、 MySQL、PostreSQL、 Oracle和其他数据库、 JMS和远程UNIX Syslog守护进程等。

Layout 负责把事件转换成字符串,格式化的日志信息的输出。

logger context

各个logger 都被关联到一个 LoggerContext,LoggerContext负责制造logger,也负责以树结构排列各logger。其他所有logger也通过org.slf4j.LoggerFactory 类的静态方法getLogger取得。 getLogger方法以 logger名称为参数。用同一名字调用LoggerFactory.getLogger 方法所得到的永远都是同一个logger对象的引用。

有效级别及级别的继承

Logger 可以被分配级别。级别包括:TRACE、DEBUG、INFO、WARN 和 ERROR,定义于ch.qos.logback.classic.Level类。如果 logger没有被分配级别,那么它将从有被分配级别的最近的祖先那里继承级别。root logger 默认级别是 DEBUG。

打印方法与基本的选择规则

打印方法决定记录请求的级别。例如,如果 L 是一个 logger 实例,那么,语句 L.info("…")是一条级别为 INFO的记录语句。记录请求的级别在高于或等于其 logger 的有效级别时被称为被启用,否则,称为被禁用。记录请求级别为 p,其 logger的有效级别为 q,只有则当 p>=q时,该请求才会被执行。

该规则是 logback 的核心。级别排序为: TRACE < DEBUG < INFO < WARN < ERROR

分日志等级别输出

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
    <property name="LOG_HOME" value="log"/>
    <property name="PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{TRACE_ID}] %-5level %logger{20}[%L] - %msg%n"/>
    <!-- 控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>${PATTERN}</pattern>
            <!-- 设置输出字符集编码 -->
            <charset>UTF-8</charset>  
        </encoder>
    </appender>
    <!-- 按照每天生成日志文件 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${LOG_HOME}/log.%d{yyyy-MM-dd}.log</FileNamePattern>
            <!--日志文件保留天数-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>${PATTERN}</pattern>
            <!-- 设置输出字符集编码 -->
            <charset>UTF-8</charset>  
        </encoder>
        <!--日志文件最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>50MB</MaxFileSize>
        </triggeringPolicy>
    </appender>
    <!-- ERROR 文件输出日志 -->
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${LOG_HOME}/log_error.log</File>
        <append>true</append>
        <prudent>false</prudent>
        <!-- 日志文件rolling策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${LOG_HOME}/log_error_%d{yyyy-MM-dd}.log.gz</FileNamePattern>
            <!-- 日志在磁盘上保留天数 -->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <!-- 过滤器,只ACCEPT接收ERROR级别的日志,其它日志级别都DENY拒绝 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <!-- 日志输出格式 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${PATTERN}</pattern>
        </encoder>
    </appender>
    <!-- INFO 文件输出日志 -->
    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${LOG_HOME}/log_info.log</File>
        <append>true</append>
        <prudent>false</prudent>
        <!-- 日志文件rolling策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${LOG_HOME}/log_info_%d{yyyy-MM-dd}.log.gz</FileNamePattern>
            <!-- 日志在磁盘上保留天数 -->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <!-- 过滤器,只ACCEPT接收ERROR级别的日志,其它日志级别都DENY拒绝 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <!-- 日志输出格式 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${PATTERN}</pattern>
        </encoder>
    </appender>
    <!-- DEBUG 文件输出日志 -->
    <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${LOG_HOME}/log_debug.log</File>
        <append>true</append>
        <prudent>false</prudent>
        <!-- 日志文件rolling策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${LOG_HOME}/log_debug_%d{yyyy-MM-dd}.log.gz</FileNamePattern>
            <!-- 日志在磁盘上保留天数 -->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <!-- 过滤器,只ACCEPT接收ERROR级别的日志,其它日志级别都DENY拒绝 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <!-- 日志输出格式 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${PATTERN}</pattern>
        </encoder>
    </appender>
    <!-- 把日志异步输出到磁盘文件中,避免每次都进行磁盘IO操作 -->
    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <queueSize>10000</queueSize>
        <appender-ref ref="FILE" />
    </appender>
    <!-- 日志输出级别 -->
    <root level="INFO">
        <appender-ref ref="STDOUT"/>
<!--        <appender-ref ref="ASYNC"/>-->
<!--        <appender-ref ref="ERROR_FILE"/>-->
<!--        <appender-ref ref="INFO_FILE"/>-->
<!--        <appender-ref ref="DEBUG_FILE"/>-->
    </root>
</configuration>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • springboot logback调整mybatis日志级别无效的解决

    现象 在日志配置文件 logback-spring.xml 中,无论怎么修改级别,mybatis 的 sql 日志都会打印出来. 原因 在 application.yml 中配置了 mybatis 的自定义日志类,如下: mybatis: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl 点进去查看源码,发现 debug 日志级别始终为 true,所以怎么配置都不生效 public boolean isDeb

  • Logback动态修改日志级别的方法

    问题提出: 一般在生产环境上,日志的级别是INFO以上,但有时候程序出现问题(如SQL报错),少量日志不能尽快定位问题,这时候可以动态修改日志级别到DEBUG,打印更多日志后可以快速定位到问题. 解决方法: 定义动态修改日志级别的接口:这种方法的好处是不用修改配置文件,排错后再次调用接口把日志级别修改回去:坏处是需要在代码中写死指定哪些包要修改日志级别.示例代码如下: @RestController public class LogController { private static Logg

  • spring boot使用logback日志级别打印控制操作

    因为公司业务需要,需要把性能日志和业务日志分开打印,用elk收集处理,所以需要对不同的业务的日志,打印到不同文件. 使用的是spring boot自带的logback. 首先在yml文件配置logback.xml文件,默认会从resources下找logback.xml文件,找不到会从yml文件中找logging.config下的指定文件. logging: level: DEBUG config: classpath:logback.xml logback.xml是logback的配置文件,可

  • 利用logback 设置不同包下的日志级别

    1.实现效果:项目的整体的日志打印级别为ERROR,但在某个包下或某个类想打印INFO级别的日志. 2.配置: FILE是ERROR级别日志打印: SPECIAL 是INFO级别日志打印: FILE与SPECIAL唯一不同是日志保存路径不同,其它策略相同: 通过 logger标签指定包路径或类路径并引用SPECIAL: <?xml version="1.0" encoding="UTF-8"?> <configuration> <con

  • 使用Logback设置日志级别

    Logback设置日志级别 使用Logback设置日志的设置方式现在已经有很多文章说明,本文重点说明不同设置方式的区别和用途.首先列举常用的三种方式,接下来说明其区别. appender中的LevelFilter: 级别过滤器,根据日志级别进行过滤.如果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志 <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppende

  • TensorFlow设置日志级别的几种方式小结

    TensorFlow中的log共有INFO.WARN.ERROR.FATAL 4种级别.有以下几种设置方式. 1. 通过设置环境变量控制log级别 可以通过环境变量TF_CPP_MIN_LOG_LEVEL进行设置,TF_CPP_MIN_LOG_LEVEL的不同值的含义分别如下: Level Level for Humans Level Description 0 DEBUG all messages are logged (Default) 1 INFO INFO messages are no

  • SpringBoot实用小技巧之如何动态设置日志级别

    前言 有时线上问题我们用打日志的方式来观察错误或埋点参数,但由于这些日志如果都打出来会占用大量存储空间而且覆盖了一些有效信息,所以线上级别一般设置INFO,调试级别用作特殊情况下.此时如果线上想查看调试级别下的日志,又不能更改日志级别后重新发布该怎么办? Spring Boot提供了日志级别动态配置功能,为我们的线上应用调试提供了很好的机制.在实际使用中需要结合Spring-Security提供的安全机制来保护Actuator 提供的各种系统级端点的安全访问. SpringBoot从版本 1.5

  • 如何设置Spring Boot测试时的日志级别

    1.概览 该教程中,我将向你展示:如何在测试时设置spring boot 日志级别.虽然我们可以在测试通过时忽略日志,但是如果需要诊断失败的测试,选择正确的日志级别是非常重要的. 2.日志级别的重要性 正确设置日志级别可以节省我们许多时间. 举例来说,如果测试在CI服务器上失败,但在开发服务器上时却通过了.我们将无法诊断失败的测试,除非有足够的日志输出. 为了获取正确数量的详细信息,我们可以微调应用程序的日志级别,如果发现某个java包对我们的测试更加重要,可以给它一个更低的日志级别,比如DEB

  • Java ASM使用logback日志级别动态切换方案展示

    目录 背景 logback简介 解决方案 方案一:logback自动扫描更新 方案二:ASM动态修改字节码 延伸扩展 背景 一切皆有因果,所有事情,都有事件驱动.本方案的日志级别切换是由这样的背景下产生的: 单个生产环境上,有几百近千个微服务 日志级别切换不重启服务,要求即时生效果 由业务开发人员去修改代码或增加相关依赖配置等涉及面广,推动进度慢 后期动态实时过滤垃圾日志,减少io和磁盘空间成本 logback简介 在跟敌人发起战争之前,只有先发解敌方的情况,才能做到百战百胜.要想对logbac

  • springboot使用Logback把日志输出到控制台或输出到文件

    一:日志: 1.配置日志级别 日志记录器(Logger)的行为是分等级的.如下表所示: 分为:OFF.FATAL.ERROR.WARN.INFO.DEBUG.ALL 默认情况下,spring boot从控制台打印出来的日志级别只有INFO及以上级别,可以配置日志级别 设置日志级别 logging.level.root=WARN 这种方式只能将日志打印在控制台上 二.Logback日志 spring boot内部使用Logback作为日志实现的框架. Logback和log4j非常相似,如果你对l

  • SpringBoot3集成SLF4J+logback进行日志记录的实现

    目录 1 快速实现 2 配置xml 2.1 configuration 2.2 property和springProperty 2.3 root 2.4 appender 2.4.1 ConsoleAppender 2.4.2 FileAppender 2.4.3 RollingFileAppender 2.5 logger 3 更多情形 3.1 日志级别 3.2 日志滚动 3.2.1 时间策略 3.2.2 文件大小策略 3.2.3 时间与文件大小策略 3.3 日志过滤 3.3.1 LevelF

  • shell脚本实现分日志级别输出的方法

    shell脚本如何优雅的记录日志信息,下面让我们一步一步,让shell脚本的日志也变得高端起来,实现如下功能 ①设定日志级别,实现可以输出不同级别的日志信息,方便调试 ②日志格式类似为:[日志级别] 时间 funcname:函数名 [lineno:行号] 日志信息 ③不同级别,设定不同颜色 ④让其变为函数库文件,重用代码 下面看看我用shell记录日志的进化之路 1.最简单的日志记录方式 对于刚入门的同学,记录日志一般用echo加重定向方式,这应该是最原始的方式了^_^ echo "log me

  • spring boot线上日志级别动态调整的配置步骤

    目录 前言 正文 springboot版本:1.5.7 配置 文末结语 前言 日志模块是每个项目中必须的,用来记录程序运行中的相关信息.一般在开发环境下使用DEBUG级别的日志输出,为了方便查看问题,而在线上一般都使用INFO级别的日志,主要记录业务操作的日志.那么问题来了,当线上环境出现问题希望输出DEBUG日志信息辅助排查的时候怎么办呢?修改配置文件,重新打包然后上传重启线上环境,之前确实是这么做的.下面会介绍使用动态调整线上日志级别来解决这个问题. 正文 spring boot版本:1.5

  • shell脚本设置日志格式的方法

    shell脚本设置日志格式 1.封装函数 #!/bin/bash function log() { echo "$@" } //测试: log "this is a test..." log "today is `date '+%Y-%m-%d'` " 2.设置时间日志 #!/bin/bash function log() { echo "$(date '+%Y-%m-%d %H:%M:%S') $@" } log "

随机推荐