用slf4j/logback打印日志-2(代码片段)

winner-0715 winner-0715     2022-11-15     217

关键词:

本篇主要介绍logback的输出源配置,logback默认提供了很多输出源,但是用的最多的是这几种:

  1. OutputStreamAppender 日志输出到一个二进制流,可以通过 <encoder/> 配置编码
  2. ConsoleAppender 日志输出到控制台,可以通过 <encoder/>配置编码,通过设置target (System.out or System.err.)来指定输出方向。
  3. FileAppender 日志输出到文件,有下面这些可以配置的属性
    1. append (boolean) 是追加还是覆盖的方式写日志,默认true,追加
    2. encoder (Encoder)
    3. file (String) 指定日志文件的位置
    4. prudent (boolean) 这个模式是用来解决多进程log输出问题的,如果有多个输出源在不同的进程log写入同一份日志,那么会出现文件的问题。打开这种模式,会
      给文件加锁,然后让事件顺序写入,文件锁会导致性能问题,一般情况下每秒20条日志的时候没有什么问题,但是每秒100条日志的时候回出现显著的性能问题。

最后也是用的最多的是RollingFileAppender,最牛逼的输出源!!它可以配置的属性如下:

  1. file(String) 指定日志文件的位置
  2. append(boolean) 是追加还是覆盖的方式写日志,默认true,追加
  3. encoder(Encoder) 控制编码即布局
  4. prudent(boolean) 同FileAppender
  5. rollingPolicy(RollingPolicy)
  6. triggeringPolicy(TriggeringPolicy)

它有两个最核心的属性:RollingPolicy 和 TriggeringPolicy,前者定义滚动的策略,后者定义滚动的时机。这种类型的输出源用的多是因为在后端系统中,日志是持续不断的打印的,单个日志文件的大小受限,所以它提供了一种机制可以根据时间自动归档旧的日志文件,然后创建新的日志文件打印日志,并且可以设置策略删除太旧的日志。一个典型的场景是:我们可以设置logback每天生成一个新的日志文件,并把昨天的日志文件归档,并且最多保存七天的日志,超出七天的自动删除。

滚动策略 - RollingPolicy


1. TimeBasedRollingPolicy 是目前最受欢迎的一种滚动方式,可以设置按天、按月的滚动。它同时实现了 RollingPolicy 和 TriggeringPolicy 接口。它可以配置这些属性:

  1. fileNamePattern (String) 比如:/var/log/%dyyyy/MM, aux/myapplication.%dyyyy-MM-dd.log ,这里最重要的是 %d,用它来格式化一个时间日期,作为一个文件名。

  2. maxHistory (int) 最多保存的日志数量
  3. totalSizeCap (int) 限制日志文件大小,超出之后会先删除较旧的日志
  4. cleanHistoryOnStart (boolean)
注:在RollingFileAppender还是需要设置file属性来表示当前的写入日志的文件,但是当滚动时间到了,会按照fileNamePattern定义的规则来归档当前的日志写入文件。logback会从 
fileNamePattern 中推导出滚动的间隔,上面的例子会按月创建日志目录、日志文件会在每天0点归档。

常用的TimeBasedRollingPolicy策略:

1./wombat/foo.%d 每天0点生成一个文件,默认格式 yyyy-MM-dd, 比如:/wombat/foo.2006-11-23
2./wombat/%dyyyy/MM/foo.txt 每月滚动一次,比如:/wombat/2006/10/foo.txt
3./wombat/foo.%dyyyy-ww.log 每周滚动一次
4./wombat/foo%dyyyy-MM-dd_HH.log 每小时滚动一次
5./wombat/foo%dyyyy-MM-dd_HH-mm.log 每分钟滚动一次

注:如果文件名类似 ‘/wombat/foo.%d.gz‘ 这样,以 ‘gz‘ 或者 ‘zip‘ 结尾,那么会把文件自动进行压缩

一个典型的配置(每天滚动一次,最多存30天,所有log大小不能超过3GB):

<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.%dyyyy-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 %logger35 - %msg%n</pattern>
    </encoder>
</appender>

2. SizeAndTimeBasedRollingPolicy 典型配置如下:

<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-%dyyyy-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>

唯一需要注意的是 %i 标记,它的使用场景是这样的,如果log文件的大小达到了maxFileSize,但是时间还没有达到滚动点,那么会创建新的log文件,并用一个递增的 %i 索引。

3. FixedWindowRollingPolicy 要求文件 fileNamePattern 必须包含 %i标示,这是一个递增字段,受到 minIndex 和 maxIndex 限制。

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>test.log</file>

    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
      <fileNamePattern>tests.%i.log.zip</fileNamePattern>
      <minIndex>1</minIndex>
      <maxIndex>3</maxIndex>
    </rollingPolicy>

    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
      <maxFileSize>5MB</maxFileSize>
    </triggeringPolicy>
    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger35 - %msg%n</pattern>
    </encoder>
</appender>

这种方式利用到了 triggeringPolicy,因为它本身无法判断什么时候应该产生一个新的文件,所以通过triggeringPolicy来约束。上面的
例子中,当文件大小超过5MB的时候就会触发一次滚动。

远端的数据源,比如 SocketAppender and SSLSocketAppender 、SMTPAppender等暂时用不到,不再记录。

在阅读官方文档的时候看到一句话:

"For various technical reasons, rollovers are not clock-driven but depend on the arrival of logging events."

这种方式和友盟的log文件记录是一样的,看完之后心有同感!

Refer:

springbootlogback日志组件使用(代码片段)

一logback简介    Logback是一个开源日志组件。Logback一般和SLF4结合起来使用。外层使用SLF4J,里面的实现是logback。什么意思,简单来说我们使用层看到的是SLF4J。我们使用的时候就是和SLF4J提供的一些api打交道。    我们可能... 查看详情

springboot2.x整合slf4j+logback日志框架(代码片段)

目录1、Slf4j及Logback简介2、日志级别3、maven依赖3.1springboot2maven配置文件3.2普通maven项目的配置文件4、logback、springboot配置说明4.1 logback.xml 和logback-spring.xml的区别4.2logback.xml配置文件的加载机制4.3SpringBoot结合logback配置说明4.3.1logb... 查看详情

[slf4j+log]源码解析(代码片段)

...列的日志接口,使用户可以使用统一的接口来记录日志。logback,log4j等框架都实现了这些接口,启动时动态地决定真正的日志框架。本文以slf4j+logback的源码来讲解整个绑定和打印日志的流程。手动阅读目录如下:绑定日志框架解... 查看详情

slf4j+logback实现日志输出和记录(代码片段)

一、SLF4J   SLF4J,即简单日志门面(SimpleLoggingFacadeforJava),不是具体的日志解决方案,它只服务于各种各样的日志系统。在使用SLF4J的时候,不需要在代码中或配置文件中指定你打算使用那个具体的日志系统。   使用... 查看详情

springboot2.x整合slf4j+logback日志框架(代码片段)

目录1、Slf4j及Logback简介2、日志级别3、maven依赖3.1springboot2maven配置文件3.2普通maven项目的配置文件4、logback、springboot配置说明4.1 logback.xml 和logback-spring.xml的区别4.2logback.xml配置文件的加载机制4.3SpringBoot结合logback配置说明4.3.1logb... 查看详情

java#在项目中使用slf4j+logback来记录日志(代码片段)

...ACE有关系统流程的更多详细信息SLF4J和Log4j的关系:1.2Logback概述Logback分为三个不同的模块,logback-core(核心代码模块),logback-classic(log4j的一个改良版本,同时实现了slf4j的接口,这样如果之后要... 查看详情

logback最佳实践

参考技术ALogback是由log4j创始人设计的一个开源日志组件。LogBack被分为3个组件,logback-core,logback-classic和logback-access。Logback是要与SLF4J结合起来。这两个组件的官方网站如下:logback官方网站:logback官方网站SLF4J官方网站:SLF4J官方... 查看详情

源码详解系列------全面讲解logback的使用和源码(代码片段)

什么是logbacklogback用于日志记录,可以将日志输出到控制台、文件、数据库和邮件等,相比其它所有的日志系统,logback更快并且更小,包含了许多独特并且有用的特性。logback被分成三个不同的模块:logback-core,logback-classic,logba... 查看详情

踩坑记——使用slf4j+logback记录日志

 jar包版本:<spring.version>3.1.0.RELEASE</spring.version><slf4j.version>1.7.25</slf4j.version><logback.version>1.2.3</logback.version><logback.ext.version>0 查看详情

logback的使用和logback.xml详解(代码片段)

一、logback的介绍Logback是由log4j创始人设计的另一个开源日志组件,官方网站:http://logback.qos.ch。它当前分为下面下个模块:logback-core:其它两个模块的基础模块logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4jAPI使你... 查看详情

springboot与日志框架2(日志内斗)(代码片段)

一、SpringBoot如何引入slf4j+logback框架的呢?在POM文件中<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>依赖<d 查看详情

java项目日志系统的总结(代码片段)

...使用例子日志系统归类以及关系常用的日志框架:slf4j、logback、log4j、log4j2、JUL(javautillogging)、jboss-logging、JCL(jakartacommonlogging)log4j:最开始的一个日志系统。JUL:jdk自带的日志系统jboss-logging:jboss公司的日志系统JCL:apache开源的日志框... 查看详情

slf4j+logback搭建超实用的日志管理模块

文章转自http://www.2cto.com/kf/201702/536097.htmlslf4j+logback搭建超实用的日志管理模块(对日志有编号管理):日志功能在服务器端再常见不过了,我们非常有必要记录下发生在服务器上的活动,这些日志将用于debug、统计等各种用途。s... 查看详情

springboot整合slf4j+logback日志框架

一、Slf4j简单介绍与优势1、介绍  Slf4j的全称是SimpleLogingFacadeForJava(Java简单日志门面),它仅仅是一个为Java程序提供日志输出的统一接口,并不是一个具体的日志实现方案,就比如JDBC一样,只是一种规则而已。所以单独的Slf4j... 查看详情

SLF4J + Logback 不登录 WildFly

】SLF4J+Logback不登录WildFly【英文标题】:SLF4J+LogbackdoesnotloginWildFly【发布时间】:2014-05-2913:23:37【问题描述】:我在WildFly8中运行Web应用程序,但由于某种原因它没有记录。我将SLF4J与LOGBACK一起使用。日志文件是在部署时创建的,... 查看详情

java#在项目中使用slf4j+logback来记录日志

1.简介1.1SLF4J概述SLF4J代表SimpleLoggingFacadeforJava。相当于一个门面,提供了Java中所有日志框架的简单抽象。使用SLF4J框架,可以在部署时,迁移到所需的日志记录框架(如Log4j,JUL,Simplelogging,NOP等)SLF4J... 查看详情

如何使用 Java 代码配置 Logback 以设置日志级别?

】如何使用Java代码配置Logback以设置日志级别?【英文标题】:HowtoconfigureLogbackwithJavacodetosetloglevel?【发布时间】:2011-12-1912:15:49【问题描述】:我想使用默认的SLF4J+Logback配置,除了将org.springframework.data.document.mongodb日志级别设... 查看详情

最强最全常用开发库-日志类库详解(代码片段)

...即可,否则会陷入JUL(JavaUtilLog),JCL(CommonsLogging),Log4j,SLF4J,Logback,Log4j2傻傻分不清楚的境地。@pdai日志库简介我认为全面理解日志库需要从下面三个角度去理解:@pdai最重要的一点是区分日志系统和日志门面;其次是日志库的使用,包... 查看详情