logger配置文件

日志的级别

日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出

区别:

debug 级别最低,详细的了解系统程序的运行情况,在任何地方都可以用;

info 重要,输出信息:用来反馈系统的当前状态给用户,以便定位问题;

后三个,警告、错误、严重错误,这三者应该都在系统运行时检测到了一个不正常的状态。

warn, 可修复,系统可继续运行下去;

Error, 可修复性,但无法确定系统会正常的工作下去;

Fatal, 相当严重,可以肯定这种错误已经无法修复,并且如果系统继续运行下去的话后果严重。

使用

什么时候使用 info, warn , error ?

info 用于打印程序应该出现的正常状态信息, 便于追踪定位;

warn 表明系统出现轻微的不合理但不影响运行和使用;

error 表明出现了系统错误和异常,无法正常完成目标操作。

标签介绍

configuration 标签

  • scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true
  • scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
  • debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。

include标签

logback配置在实际应用中往往会遇到appender的配置中存在大量的重复内容,但是logback又不像编程语言一样支持继承,采用include和变量结合可以一定程度上解决这个问题。

property标签

property设置变量: 使“${}”来使用变量。

设置上下文名称contextName

每个logger都关联到logger上下文,默认上下文名称为“default”。但可以使用contextName设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改,可以通过%contextName来打印日志上下文名称。

<contextName>logback</contextName>

Layout标签

Layout组件来将LoggingEvent进行格式化,返回一个String,然后通过OutputStream.write()方法,把格式化之后的日志信息写到目的地.

子节点一appender

appender用来格式化日志输出节点,有俩个属性name和class,class用来指定哪种输出策略,常用就是控制台输出策略和文件输出策略。

控制台输出ConsoleAppender:
    <!--输出到控制台-->
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>info</level>
        </filter>

        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%red(%date{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{10}) - %cyan(%msg%n)</pattern>
        </layout>
    </appender>
  • %d{HH: mm:ss.SSS}——日志输出时间
  • %thread——输出日志的进程名字,这在Web应用以及异步任务处理中很有用
  • %-5level——日志级别,并且使用5个字符靠左对齐
  • %logger{36}——日志输出者的名字
  • %msg——日志消息
  • %n——平台的换行符

ThresholdFilter为系统定义的拦截器,例如我们用ThresholdFilter来过滤掉ERROR级别以下的日志不输出到文件中。如果不用记得注释掉,不然你控制台会发现没日志~

输出到文件RollingFileAppender

另一种常见的日志输出到文件,随着应用的运行时间越来越长,日志也会增长的越来越多,将他们输出到同一个文件并非一个好办法。RollingFileAppender用于切分文件日志:

<!--输出到文件-->
    <!-- 时间滚动输出 level为 DEBUG 日志 -->
    <appender name="logfile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--<Encoding>UTF-8</Encoding>-->
        <File>${log.base}.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名 -->
            <FileNamePattern>${log.base}.%d{yyyy-MM-dd}.log.zip</FileNamePattern>
            <!-- 文件的最大存储空间 -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern>
        </layout>
    </appender>

其中重要的是rollingPolicy的定义,上例中

//定义了日志的切分方式——把每一天的日志归档到一个文件中
<fileNamePattern>logback.%d{yyyy-MM-dd}.log</fileNamePattern>
//表示只保留最近30天的日志,以防止日志填满整个磁盘空间。同理,可以使用%d{yyyy-MM-dd_HH-mm}来定义精确到分的日志切分方式。
<maxHistory>30</maxHistory>
//用来指定日志文件的上限大小,例如设置为1GB的话,那么到了这个值,就会删除旧的日志。
<totalSizeCap>1GB</totalSizeCap>
FileAppender:

把日志添加到文件,有以下子节点:

:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。

:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。

:对记录事件进行格式化。(具体参数稍后讲解 )

:如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是 false。

filter标签
filter标签下的子标签

:设置过滤级别

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

:用于配置不符合过滤条件的操作

子标签中值的含义

过滤器的返回值只能是ACCEPT、DENY和NEUTRAL的其中一个。

  • 如果返回DENY,那么记录事件立即被抛弃,不再经过剩余过滤器;
  • 如果返回NEUTRAL,那么有序列表里的下一个过滤器会接着处理记录事件;
  • 如果返回ACCEPT,那么记录事件被立即处理,不再经过剩余过滤器。

过滤器被添加到 中,为 添加一个或多个过滤器后,可以用任意条件对日志进行过滤。 有多个过滤器时,按照配置顺序执行。

子节点二loger标签:

用来设置某一个包或者具体的某一个类的日志打印级别、以及指定。仅有一个name属性,一个可选的level和一个可选的addtivity属性。

  • name: 用来指定受此loger约束的某一个包或者具体的某一个类。
  • level: 用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特俗值NHERITED或者同义词NULL,代表强制执行上级的级别。 如果未设置此属性,那么当前loger将会继承上级的级别。
  • addtivity:是否向上级loger传递打印信息。默认是true。

loger可以包含零个或多个appender-ref元素,标识这个appender将会添加到这个loger。

注意:使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:

  • 第一种把改成这样就会打印sql,不过这样日志那边会出现很多其他消息
  • 第二种就是单独给dao下目录配置debug模式,代码如下,这样配置sql语句会打印,其他还是正常info级别:

子节点三 root标签:

  • root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
  • level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能设置为INHERITED或者同义词NULL。默认是DEBUG 可以包含零个或多个元素,标识这个appender将会添加到这个logger。

样例

<?xml version="1.0" encoding="UTF-8"?>
<configuration  scan="true" scanPeriod="10 seconds">
	<!--<include resource="org/springframework/boot/logging/logback/base.xml" />-->
	<!--<contextName>logback</contextName>-->
    
    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
    <property name="log.debug" value="D:/activeLog/logs/debug" />
    <property name="log.info" value="D:/activeLog/logs/info" />
    <property name="log.warn" value="D:/activeLog/logs/warn" />
    <property name="log.error" value="D:/activeLog/logs/error" />
    <property name="log.druid.sql" value="D:/activeLog/logs/sql" />
    <property name="log.mybatis" value="D:/activeLog/logs/mybatis" />
    
    <!-- 彩色日志 -->
    <!-- 彩色日志依赖的渲染类 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
    <!-- 彩色日志格式 -->
    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    <!--输出到控制台-->
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>info</level>
        </filter>

        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%red(%date{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{10}) - %cyan(%msg%n)</pattern>
        </layout>
    </appender>
    <!--输出到文件-->
    <!-- 时间滚动输出 level为 debug 日志 -->
    <appender name="debugFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${log.debug}.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名 -->
            <FileNamePattern>${log.base}.%d{yyyy-MM-dd}.log.zip</FileNamePattern>
            <!-- 文件的最大存储空间 -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern>
        </layout>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%msg%n</pattern>
            <!-- 设置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    <logger name="debugFile" level="DEBUG" additivity="false">
        <appender-ref ref="debugFile" />
    </logger>
    <!-- 时间滚动输出 level为 info 日志 -->
    <appender name="infoFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.info}.%d{yyyy-MM-dd}.log</fileNamePattern>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%msg%n</pattern>
        </encoder>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern>
        </layout>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%msg%n</pattern>
            <!-- 设置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    <logger name="infoFile" level="INFO" additivity="false">
        <appender-ref ref="infoFile" />
    </logger>
    <!-- 时间滚动输出 level为 warn 日志 -->
    <appender name="warnDebug" class="ch.qos.logback.core.FileAppender">
        <file>${log.warn}.log</file>
        <append>true</append>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%msg%n</pattern>
        </encoder>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%msg%n</pattern>
        </layout>
    </appender>
    <logger name="warnFile" level="WARN" additivity="false">
        <appender-ref ref="warnFile" />
    </logger>
    <!-- 时间滚动输出 level为 ERROR 日志 -->
    <appender name="errorDebug" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.error}.%d{yyyy-MM-dd}.log</fileNamePattern>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%msg%n</pattern>
        </encoder>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%msg%n</pattern>
        </layout>
    </appender>
    <logger name="errorFile" level="ERROR" additivity="false">
        <appender-ref ref="errorFile" />
    </logger>


    <appender name="druidFileLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名 -->
            <fileNamePattern>${log.druid.sql}.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
            <!--日志文件保留天数 -->
            <MaxHistory>90</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
            <pattern>
                %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
            </pattern>
        </encoder>
    </appender>
    <logger name="com.alibaba.druid.filter.stat.StatFilter" level="INFO" additivity="false">
        <appender-ref ref="druidFileLog" />
    </logger>
    <!-- 输出 mybatis 日志 -->
    <appender name="mybatis" class="ch.qos.logback.core.FileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名 -->
            <fileNamePattern>${log.mybatis}.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
            <!--日志文件保留天数 -->
            <MaxHistory>90</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
            <pattern>
                %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
            </pattern>
        </encoder>
    </appender>

    <logger name="org.sang.mapper" level="DEBUG" additivity="false">
        <appender-ref ref="mybatis" />
    </logger>

	 <!--开发环境:打印控制台-->
    <springProfile name="CONSOLE">
        <logger name="com.nmys.view" level="debug"/>
    </springProfile>
   
    <root>
        <level value="INFO" />
        <appender-ref ref="CONSOLE" />
    </root>

    
    <!--生产环境:输出到文件-->
    <!--<springProfile name="pro">-->
        <!--<root level="info">-->
            <!--<appender-ref ref="CONSOLE" />-->
            <!--<appender-ref ref="DEBUG_FILE" />-->
            <!--<appender-ref ref="INFO_FILE" />-->
            <!--<appender-ref ref="ERROR_FILE" />-->
            <!--<appender-ref ref="WARN_FILE" />-->
        <!--</root>-->
    <!--</springProfile>-->
</configuration>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Slf4j本身并不提供配置文件,它仅提供了一个通用的日志接口。日志的具体实现和配置文件是由Slf4j的实现框架(如Logback、Log4j等)来提供和管理的。 下面是一个使用Logback作为Slf4j的实现框架的配置文件示例: 1. 创建一个名为`logback.xml`的配置文件(或者`logback.groovy`,根据具体的需求),并将其放置在类路径下。 2. 在配置文件中,可以定义不同的日志输出格式、日志级别、日志文件路径等。以下是一个基本的示例: ```xml <configuration> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="info"> <appender-ref ref="console" /> </root> </configuration> ``` 上述示例配置了一个名为`console`的`ConsoleAppender`,定义了日志输出格式的模式。`%d{HH:mm:ss.SSS}`表示时间戳,`[%thread]`表示线程名,`%-5level`表示日志级别,`%logger{36}`表示日志记录器名称(最多显示36个字符),`%msg%n`表示日志消息和换行符。 然后,通过`<root>`元素指定了根日志记录器的级别为`info`,并将`console` appender 添加到根日志记录器。 3. 在应用程序中加载配置文件。加载配置文件的方式取决于使用的Slf4j实现框架。对于Logback,可以通过以下方式加载配置文件: ```java import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.core.util.StatusPrinter; import org.slf4j.LoggerFactory; public class LogbackConfigExample { public static void main(String[] args) { // 获取LoggerContext实例 LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); // 配置文件路径 String configFile = "logback.xml"; try { // 重新加载配置文件 loggerContext.reset(); loggerContext.configure(configFile); } catch (Exception e) { // 配置文件加载失败时打印异常信息 StatusPrinter.print(loggerContext); } // 使用Logger记录日志 org.slf4j.Logger logger = LoggerFactory.getLogger(LogbackConfigExample.class); logger.info("This is an info message"); } } ``` 在上述示例中,我们首先通过`LoggerFactory.getILoggerFactory()`方法获取`LoggerContext`实例。然后,使用`reset()`方法重置`LoggerContext`,然后使用`configure()`方法加载指定的配置文件。 如果加载配置文件失败,可以通过`StatusPrinter.print(loggerContext)`方法打印错误信息。 最后,我们使用`LoggerFactory.getLogger()`方法获取`Logger`实例,并使用它记录日志。 请注意,具体的加载配置文件方法和配置文件格式可能因Slf4j的实现框架而异。上述示例针对使用Logback作为实现框架的情况,如果使用其他实现框架(如Log4j),则需要相应地修改加载配置文件的方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值