当前位置:网站首页>logback日志框架
logback日志框架
2022-06-10 23:40:00 【Mr_Jin.】
优点:
它比所有现有的日志系统都要快,而且占用空间更小,还提供了在其他日志系统中没有的独特而有用的特性。
logback配置
在项目中使用logback时,它会默认在项目的classpath路径下按顺序查找名为logback-test.xml、logback.groovy、logback.xml的配置文件,如果上述文件均未找到,则使用默认配置(默认日志输出级别为debug)。
configuration
<configuration>是logback配置文件的根节点,有scan、sacnPeriod、debug、packagingData等属性。
· debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。(为true时和上面在MyApp1的main方法加入的两行代码效果相同)
· scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
· scanPeriod: 设置扫描配置文件的时间间隔,默认单位为毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
配置示例如下:
<configuration scan="true" scanPeriod="60 seconds" debug="false" packagingData="false">
...
</configuration>
下面介绍几个常用的Appender
- ConsoleAppender
ConsoleAppender,顾名思义,在控制台上输出。示例:
<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>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="STDOUT" />
</root>
</configuration>
- FileAppender
FileAppender,一个OutputStreamAppender的子类,作用是将日志输出到文件。目标文件可以指定,如果该文件已经存在,它将根据附加属性的值被追加或截断。示例:
<configuration>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>testFile.log</file>
<append>true</append>
<!-- set immediateFlush to false for much higher logging throughput -->
<immediateFlush>true</immediateFlush>
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="FILE" />
</root>
</configuration>
Uniquely named files (by timestamp)
在应用程序开发阶段或短期应用程序(例如批处理应用程序)期间,希望在每个新应用程序启动时创建一个新的日志文件。这在元素的帮助下很容易做到。示例:
<configuration>
<!-- Insert the current time formatted as "yyyyMMdd'T'HHmmss" under
the key "bySecond" into the logger context. This value will be
available to all subsequent configuration elements. -->
<timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<!-- use the previously created timestamp to create a uniquely
named log file -->
<file>log-${bySecond}.txt</file>
<encoder>
<pattern>%logger{35} - %msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="FILE" />
</root>
</configuration>
· RollingFileAppender
RollingFileAppender将FileAppender的功能进行扩展,提供了切割日志文件的功能。例如,RollingFileAppender可以记录日志到一个名为log.txt的文件,一旦满足一定条件,将其日志目标更改为另一个文件。
在使用时,RollingFileAppender必须同时具有RollingPolicy和TriggeringPolicy设置。但是,如果它的RollingPolicy也实现TriggeringPolicy接口,那么只需要显式地指定前者。
· TimeBasedRollingPolicy
时间基准滚动策略可能是最流行的滚动策略。它定义了一个基于时间的滚动策略,例如每日或每月。时间的滚动策略承担了翻转的责任,同时也承担了触发的滚动。TimeBasedTriggeringPolicy实现了RollingPolicy和TriggeringPolicy接口。
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logFile.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- keep 30 days' worth of history capped at 3GB total size -->
<maxHistory>30</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="FILE" />
</root>
</configuration>
- SizeAndTimeBasedRollingPolicy
有时候可能希望按日期对文件进行存档,但同时限制每人日志文件的大小,这时候可以使用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>Appender详解
<appender>节点本身有两个强制属性,分别是name和class。name属性指定appender的名称,而class属性指定要实例化的appender类的完全限定名。<appender>标签内可能包含0或1 个<layout>标签,0或多个<encoder>、<filter>标签。下图是<appender>的内部结构图:
<configuration> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>myApp.log</file> <encoder> <pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern> </encoder> </appender> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%msg%n</pattern> </encoder> </appender> <root level="debug"> <appender-ref ref="FILE" /> <appender-ref ref="STDOUT" /> </root> </configuration>上面配置定义了两个日志输出器FILE和STDOUT,通过在appender-ref标签中引用名称,将appenders附加到根日志记录器。FILE的作用是输出debug级别的日志到名为myApp.log的文件(文件不存在时自动创建),STDOUT的作用是输出debug级别的日志到控制台。
注意:每个appender都有自己的编码器。编码器通常不设计为由多个appenders共享。布局也是如此。因此,logback配置文件不提供任何用于共享编码器或布局的语法手段。
默认情况下,appenders是累加的:一个日志记录器(logger)采用一个appender的同时会将这个appender传递给根日志记录器(root)。因此,将相同的appender附加到多个日志记录器会导致日志输出被复制。
contextName
每个日志记录器都会附加到日志记录器上下文中。默认情况下,logger上下文被称为“default”。但是,您可以在配置contextName设置不同的名称。注意,一旦设置,日志记录器上下文名称不能更改。通过设置logger上下文名称可以区分多个应用程序日志记录到同一个目标中。示例:
<configuration> <contextName>myAppName</contextName> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d %contextName [%t] %level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="debug"> <appender-ref ref="STDOUT" /> </root> </configuration>- property
变量可以在配置文件本身中定义一次,也可以从外部属性文件或外部资源中加载。由于历史原因,定义变量的XML元素是<property>,但在logback 1.0.7之后,也可以通过<variable>定义变量。示例: <configuration> <property name="USER_HOME" value="/home/sebastien" /> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>${USER_HOME}/myApp.log</file> <encoder> <pattern>%msg%n</pattern> </encoder> </appender> <root level="debug"> <appender-ref ref="FILE" /> </root> </configuration>在内部定义变量
<configuration> <property resource="resource1.properties" /> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>${USER_HOME}/myApp.log</file> <encoder> <pattern>%msg%n</pattern> </encoder> </appender> <root level="debug"> <appender-ref ref="FILE" /> </root> </configuration>filter
有时候,我们需要在特定的appender中只输出特定级别的日志,此时就需要用到filter。过滤器有很多种,这里只介绍LevelFilter和ThresholdFilter
LevelFilter
LevelFilter根据精确的级别匹配过滤事件。如果事件的级别等于配置的级别,则根据onMatch和on属性的配置,过滤器接受或拒绝事件。示例:<configuration> <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> <encoder> <pattern> %-4relative [%thread] %-5level %logger{30} - %msg%n </pattern> </encoder> </appender> <root level="DEBUG"> <appender-ref ref="CONSOLE" /> </root> </configuration>CONSOLE只会输出info级别的日志
- ThresholdFilter
阈值筛选器将事件过滤到指定的阈值之下。对于级别相等或超过阈值的事件,当调用其decide()方法时,阈值筛选器将保持中立。但是,低于阈值的事件将被拒绝。示例:
<configuration>
<appender name="CONSOLE"
class="ch.qos.logback.core.ConsoleAppender">
<!-- deny all events with a level below INFO, that is TRACE and DEBUG -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<encoder>
<pattern>
%-4relative [%thread] %-5level %logger{30} - %msg%n
</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="CONSOLE" />
</root>
</configuration>
CONSOLE会输出info、warn、error级别的日志,除了debug
需要的依赖:
<!-- 日志框架依赖-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
项目启动时会在根目录创建对应的log日志文件。

完整配置示例
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文档如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文档是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。
当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="30 seconds">
<!-- 彩色日志依赖 -->
<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" />
<!-- 日志文件储存地址, 通过application配置文件传入 -->
<springProperty scope="context" name="LOG_PATH" source="logback.logDir" />
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_PATH" value="./logs"/>
<!-- 控制台彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-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}}" />
<!-- 日志文件日志格式 -->
<property name="FILE_LOG_PATTERN" value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%15t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />
<!-- 控制台输出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 按照每天及大小生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_PATH}/my-blog-site.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!--日志文件最大大小-->
<maxFileSize>100MB</maxFileSize>
<!--日志文件保留天数-->
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- 过滤级别,
如果想分类生成日志文件的话(分成debug、info、error等三个日志文件, 每个文件只记录自己级别的日志),
1. 直接把这个 <appender> 复制三分改一下 FileNamePattern 和 name.
2. 把 <filter> 注释去掉改一下 level 就可以了
-->
<!-- <filter class="ch.qos.logback.classic.filter.LevelFilter">-->
<!-- <level>info</level>-->
<!-- <onMatch>ACCEPT</onMatch>-->
<!-- <onMismatch>DENY</onMismatch>-->
<!-- </filter>-->
</appender>
<!-- 日志输出级别
如果使用springProfile, 就需要在application配置文件中通过 spring.profiles.active=dev 来指定环境,
也可以直接去掉 <springProfile> 这个标签或者把它整个注释掉
-->
<springProfile name="dev,prod">
<logger name="org.springframework" level="INFO" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</logger>
<logger name="com.netflix" level="INFO" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</logger>
<logger name="com.pro.test" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</logger>
<logger name="java.sql" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</logger>
<!--项目包的路径-->
<logger name="com.pro" level="DEBUG,INFO" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</logger>
</springProfile>
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</configuration>
边栏推荐
- Pirate OJ 148 String inversion
- Volatile keyword for concurrent programming
- Multipass Chinese document - instructions for use (contents page)
- Block queue - delayedworkqueue Source Analysis
- Philips coo will be assigned to solve the dual crisis of "supply chain and product recall" in the face of crisis due to personnel change
- BGP基础概念及IBGP基本配置
- 图的最短路径问题 详细分解版
- Yii2 ActiveRecord 使用表关联出现的 id 自动去重问题
- Automated test series
- array_column() expects parameter 1 to be array, array given
猜你喜欢

C语言实现设置桌面壁纸
![[network planning] 2.4 DNS: directory service of the Internet](/img/a8/74a1b44ce4d8b0b1a85043a091a91d.jpg)
[network planning] 2.4 DNS: directory service of the Internet
![[no title] 66666](/img/6c/df2ebb3e39d1e47b8dd74cfdddbb06.gif)
[no title] 66666

How to guarantee the quality of real-time data, the cornerstone of the 100 million level search system (Youku Video Search)? v2020

Unable to return to the default page after page Jump

安全培训管理办法

Blocking queue - delayedworkqueue source code analysis

跳转页面后回不去默认页面

浅谈有赞搜索质量保障体系 v2021

双飞翼布局
随机推荐
teterttet
Blog recommendation | building IOT applications -- Introduction to flip technology stack
Canvas drawing line break
Automated test series
负载均衡策略图文详解
How to guarantee the quality of real-time data, the cornerstone of the 100 million level search system (Youku Video Search)? v2020
Kubeflow 1.2.0 installation
Wechat applet to realize OCR scanning recognition
LeetCode 1996. Number of weak characters in the game*
qt程序插件报错plugin xcb
[no title] 4555
The principle and source code interpretation of executor thread pool in concurrent programming
LeetCode 1996. 游戏中弱角色的数量*
Dual wing layout
LeetCode 1673. Find the most competitive subsequence**
Random points in non overlapping rectangles
UUID quick explanation
f‘s‘f‘s‘f‘s‘d
Network Engineer required course firewall security zone and basic operation of security policy
浅谈有赞搜索质量保障体系 v2021