文章目录

  • 一、logback介绍
  • 二、取代log4j的理由
  • 三、logback的配置及使用
  • 1、首先你要使用logback,需要导入依赖
  • 2、logback默认配置
  • 3、lobback.xml常用配置详解
  • 1、logback的配置文件概述
  • 2、根节点configuration,包含下面三个属性:
  • 3、字节的logger
  • 4、子节点appender
  • 1、ConsoleAppender把日志输出控制台。
  • 2、FileAppender:把日志添加到文件。
  • 3、RollingFileAppender:滚动记录文件
  • 基于时间TimeBasedRollingPolicy
  • 基于大小和时间SizeAndTimeBasedRollingPolicy
  • 四、logback的日志名称问题


一、logback介绍

https://www.docs4dev.com/docs/zh/logback/1.3.0-alpha4/reference/appenders.html

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

二、取代log4j的理由

说实话,我对log4j日志使用不太清楚,只知道大概的使用步骤

据网上说,总的来说就是logback内核重写了,关键执行路径性能更好,内存消耗更少,去除旧的日志啊一系列更好的功能。

三、logback的配置及使用

1、首先你要使用logback,需要导入依赖

父pom依赖引入:

org.springframework.boot spring-boot-starter-parent 2.5.6

点击spring-boot-start-parent依赖,进入

org.springframework.boot
spring-boot-dependencies
2.5.6

spring-boot-depencies中已经包含了logback使用所需要的依赖,如下:

<dependency>
     <groupId>ch.qos.logback</groupId>
     <artifactId>logback-access</artifactId>
     <version>${logback.version}</version>
 </dependency>
 <dependency>
     <groupId>ch.qos.logback</groupId>
     <artifactId>logback-classic</artifactId>
     <version>${logback.version}</version>
 </dependency>
 <dependency>
     <groupId>ch.qos.logback</groupId>
     <artifactId>logback-core</artifactId>
     <version>${logback.version}</version>
 </dependency>

2、logback默认配置

级别排序为: TRACE < DEBUG < INFO < WARN < ERROR

如果配置文件 logback-test.xml 和 logback.xml 都不存在,那么 logback 默认地会调用BasicConfigurator ,创建一个最小化配置。

最小化配置由一个关联到根 logger 的ConsoleAppender 组成。输出用模式为%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n 的 PatternLayoutEncoder 进行格式化。

root logger 默认级别是 DEBUG。

上面这里这样说可以不是很清晰,没关系,接着往下看,自然就能理解了。

  1. 尝试在 classpath下查找文件logback-test.xml;
  2. 如果文件不存在,则查找文件logback.xml;
  3. 如果两个文件都不存在,logback用BasicConfigurator自动对自己进行配置,这会导致记录输出到控制台。

3、lobback.xml常用配置详解

1、logback的配置文件概述

配置文件的最基本结构可以描述为configuration>元素,包含零个或多个logger元素,然后是零个或多个元素,最多包含一<root元素。下图说明了此基本结构。

logback配置写入mysql logback怎么用_database

2、根节点configuration,包含下面三个属性:

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

<configuration scan="true" scanPeriod="60 seconds" debug="false">    <!--其他配置省略--> </configuration>

子节点contextName:

用来设置上下文名称,每个logger都关联到logger上下文,默认上下文名称为default。

但可以使用contextName设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。

<contextName>myAppName</contextName>

子节点property:

定义变量的值,两个熟悉name和value,通过property元素设置的值,插入到logger上下文中,可以使用${}使用变量,通常为存储路径。

<configuration scan="true" scanPeriod="60 seconds" debug="false"> 
   <property name="APP_Name" value="myAppName" /> 
   <contextName>${APP_Name}</contextName> 
   <!--其他配置省略--> 
</configuration>

子节点timestamp:

获取时间戳字符串,有两个属性key和datePatten

key:标识此timestamp 的名字;
datePattern:设置将当前时间(解析配置文件的时间)转换为字符串的模式,遵循java.txt.SimpleDateFormat的格式。

<timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/>
<contextName>${bySecond}</contextName>

3、字节的logger

配置给定 Logger 时不会关闭或删除任何以前引用的追加器
例子:

<configuration>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!-- encoders are assigned the type
         ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>

  <logger name="chapters.configuration" level="INFO"/>

  <!-- Strictly speaking, the level attribute is not necessary since -->
  <!-- the level of the root level is set to DEBUG by default.       -->
  <root level="DEBUG">		
    <appender-ref ref="STDOUT" />
  </root>  
  
</configuration>

以上配置想说明的就是:其他所有类中的日志以debug级别输出,"chapters.configuration"中的日志以info级别输出。

4、子节点appender

元素可以包含零个或一个元素,零个或多个元素和零个或多个元素。除了这三个公共元素之外,元素可以包含任意数量的与 appender 类的 JavaBean 属性相对应的元素。

logback配置写入mysql logback怎么用_日志文件_02

负责写日志的组件,两个属性name和class。

name指定appender名称,class指定appender的全限定名 。

1、ConsoleAppender把日志输出控制台。
<!-- 输出全部日志到控制台 -->
class="ch.qos.logback.core.ConsoleAppender"

用例:${ENCODER_PATTERN} 日志打印的格式(后面在说)

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${ENCODER_PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    <root level="DEBUG"> 
          <appender-ref ref="STDOUT" /> 
    </root> 
</configuration>

用例含义:把大于等于debug级别的日志输出到控制台。

2、FileAppender:把日志添加到文件。

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

append:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
encoder:对记录事件进行格式化。(具体参数之后在分析 )
prudent:如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是 false。

<!-- 错误日志:用于将错误日志输出到独立文件 -->
	<appender name="FILEERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<!-- 正在记录的日志文件的路径及文件名 -->
		<file>${BASE_LOG_DIR}/logs/jscc_ccintegration_error.log</file>
		<!-- 追加方式记录日志 -->
		<append>true</append>
		<!-- 日志文件的格式 -->
		<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <fileNamePattern>${ENCODER_PATTERN}</fileNamePattern>
			<charset>UTF-8</charset>
		</encoder>
	</appender>
3、RollingFileAppender:滚动记录文件
基于时间TimeBasedRollingPolicy

file:日志输出路径

rollingPolicy:根据时间制定滚动策略。class=“ch.qos.logback.core.rolling.TimeBasedRollingPolicy”

  • fileNamePattern:必要节点,如果设置file,可以为活动文件和归档文件设置不同位置,当前日志文件总是记录到指定的文件(活动文件)活动文件的名字不会改变。
    如果没有设置file,活动文件的名字会根据fileNamePattern,每隔一段时间改变一次。根据%d{}的格式判断间隔时间。
<!--<rollingPolicy>日志策略,每天建立一个日志文件,或者当天日志文件超过64MB时-->
     <fileNamePattern>${LOG_HOME}/log/file/fileLog_info_%d{yyyy-MM-dd}.%i.log</fileNamePattern>-->
     
  <!--<rollingPolicy>日志策略,每分钟简历一个日志文件,或者每分钟日志文件超过64MB时-->
          <fileNamePattern>${LOG_HOME}/log/file/fileLog_info_%d{yyyy-MM-dd_HH-mm}.%i.log</fileNamePattern>
  • MaxHistory:假设设置每隔天滚动,下面的配置就是保存最近3天的文件,删除旧文件是,之前归档时创建的目录也会被删除。
<MaxHistory>3</MaxHistory>

用例:按时间策略滚动,设置最长存储时间,文件大小限制。

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<!-- 归档的日志文件的路径,例如今天是2013-12-21日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
			而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
			<fileNamePattern>${BASE_LOG_DIR}/logs/jscc_ccintegration_error_%d{yyyy-MM-dd}.%i.log</fileNamePattern>
			<!-- 除按日志记录之外,还配置了日志文件不能超过20M,若超过20M,日志文件会以索引0开始,
			命名日志文件,例如jsicp-error-2013-12-21.0.log -->
			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
				<maxFileSize>20MB</maxFileSize>
			</timeBasedFileNamingAndTriggeringPolicy>
			<MaxHistory>3</MaxHistory>
		</rollingPolicy>

用例:按大小滚动,文件大小限制,文件存储时长,日志归档文件的总大小。

<configuration>
  <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>mylog.txt</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
      <!-- rollover daily -->
      <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
       <!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB -->
       <maxFileSize>100MB</maxFileSize>    
       <maxHistory>60</maxHistory>
       <totalSizeCap>20GB</totalSizeCap>
    </rollingPolicy>
    <encoder>
      <pattern>%msg%n</pattern>
    </encoder>
  </appender>

  <root level="DEBUG">
    <appender-ref ref="ROLLING" />
  </root>

</configuration>

append:true,追加方式记录日志

encoder:日志输出格式

filter:按日志等级记录,方便查找。

<!-- 此日志文件只记录warn级别的 -->
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
			<level>warn</level>
			<onMatch>ACCEPT</onMatch>
			<onMismatch>DENY</onMismatch>
		</filter>
基于大小和时间SizeAndTimeBasedRollingPolicy
<configuration>
  <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>mylog.txt</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
      <!-- rollover daily -->
      <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
       <!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB -->
       <maxFileSize>100MB</maxFileSize>    
       <maxHistory>60</maxHistory>
       <totalSizeCap>20GB</totalSizeCap>
    </rollingPolicy>
    <encoder>
      <pattern>%msg%n</pattern>
    </encoder>
  </appender>

  <root level="DEBUG">
    <appender-ref ref="ROLLING" />
  </root>

</configuration>

请注意,TimeBasedRollingPolicy已经允许限制归档日志文件的组合大小。如果仅希望限制日志归档文件的总大小,则上述TimeBasedRollingPolicy和设置totalSizeCap属性应足够。

请注意,除了“%d”外,还包括“%i”转换令牌。 %i 和%d 标记都是必需的. 每次当前日志文件在当前时间段结束之前达到 maxFileSize 时,它将以从 0 开始的递增索引进行归档。

基于大小和时间的归档支持删除旧的归档文件。您需要使用 maxHistory 属性指定要保留的周期数。当您的应用程序停止并重新启动时,日志记录将在正确的位置 continue 进行,即在当前期间以最大的索引号进行记录。

四、logback的日志名称问题

logge日志的名称只能以logback开头。

例子:logback-xxx.xml

我们可以通过读源码发现,项目初始化的时候,会拿到以logback开头的配置文件,将你取名字及后缀去掉,然后拼接spring+文件类型。

AbstractLoggingSystem
--getSpringInitializationConfig

protected String[] getSpringConfigLocations() {
        String[] locations = this.getStandardConfigLocations();

        for(int i = 0; i < locations.length; ++i) {
            String extension = StringUtils.getFilenameExtension(locations[i]);
            locations[i] = locations[i].substring(0, locations[i].length() - extension.length() - 1) + "-spring." + extension;
        }
    
        return locations;
    }

---------------------

LogbackLoggingSystem

protected String[] getStandardConfigLocations() {
        return new String[]{"logback-test.groovy", "logback-test.xml", "logback.groovy", "logback.xml"};
}