本篇主要介绍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/%d{yyyy/MM, aux}/myapplication.%d{yyyy-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/%d{yyyy/MM}/foo.txt 每月滚动一次,比如:/wombat/2006/10/foo.txt
3./wombat/foo.%d{yyyy-ww}.log 每周滚动一次
4./wombat/foo%d{yyyy-MM-dd_HH}.log 每小时滚动一次
5./wombat/foo%d{yyyy-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.%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>

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

唯一需要注意的是 %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 %logger{35} - %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:

https://www.jianshu.com/p/09f55766088d

转载于:https://www.cnblogs.com/winner-0715/p/9063495.html

用SLF4j/Logback打印日志-2相关推荐

  1. 用 SLF4j/ Logback打印日志

    本篇主要介绍logback的输出源配置,logback默认提供了很多输出源,但是用的最多的是这几种: OutputStreamAppender 日志输出到一个二进制流,可以通过 <encoder ...

  2. slf4j没有在linux中生成日志,logback+SLF4J 没打印日志

    logback+SLF4J 没打印日志 为什么?启动时正常,但调用logger.info没打印日志,控制台和文件都没有输出. jar: logback-ext-spring-0.1.3-SNAPSHO ...

  3. java通过maven构建项目实现日志生成模拟(三)通过logback 打印日志

    安装配置好需要的jar包后 通常使用logback打印日志的时候需要在类的前面加上 private final static Logger logger =LoggerFactory.getLogge ...

  4. slf4j+log4j打印日志,控制台无日志输出

    slf4j+log4j 实现日志打印 项目场景: 今天看以前的项目,运行起来报错,项目日志对于项目是很重要的,但是控制台没有打印出来日志,运行起来报错的问题先放一放,先把日志的问题解决了,我项目中有l ...

  5. SpringBoot 项目使用 SLF4J+logback 进行日志记录,来增强可维护性

    点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达 今日推荐:推荐19个github超牛逼项目!个人原创100W +访问量博客:点击前往,查看更多 作者:云深不知处 blog. ...

  6. logback打印日志不显示具体的信息,显示问号

    目录 表象: 原因:日志打印的Appender是使用的ch.qos.logback.classic.AsyncAppender 正确配置 表象: 配置:<Pattern>%d{yyyy-M ...

  7. slf4j + logback 输出日志:mybatis sql语句

    1 引入jar包:maven resposity 中 选择logback classic module <dependency> <groupId>ch.qos.logback ...

  8. fastreport调用frf文件直接打印_打印日志时 Logback 内部都做了些什么

    文 | 百川 on 资产管理 一.引言 Logback 是一个优秀的开源日志框架,我们很多项目都使用它来记录日志.实际使用时,通常仅需要一行语句即可记录相应的日志信息,如 logger.info(&q ...

  9. SpringBoot+logback实现日志打印

    SpringBoot+logback 一.日志简介 1.SLF4J介绍 二.SpringBoot集成logback 1.配置文件详解 1.彩色日志 2.appender 3.root和logger详解 ...

最新文章

  1. zabbix 3.2.1 升级3.4.1
  2. 年终总结 | 2021红包点赞?(文末有刺激的福利哦)
  3. 最值得程序员get的30本行业干货
  4. 基于Maven的SSH框架搭建
  5. 树,森林,二叉树之间的转换
  6. 《C和指针》——C语言字符串操作
  7. Windows下设置开机自启动的方式(手动/C++代码的形式)
  8. 调试阶段 获取微信小程序openid
  9. ASP.NET读取POP3邮件的操作
  10. ASP中Application与Sesstion对象的使用实例
  11. JAVA求n个数里最小的k个_n个数 找到最小的k个数 几种解法 和java实现
  12. python移动文件(非文件夹)
  13. 离线安装selenium
  14. 斑马标签打印机蛋疼的打印错误处理方法
  15. 运动步数已更新,方法教程来了!
  16. 巨高兴,自己的“万能数据库查询分析器”中英文 3.01版本 已经在国内6大软件下载网站发布
  17. VMware教程(二):CentOS 7 网络配置
  18. java图片合成视频_使用JAVACV把图片合成视频
  19. python:list能像数值一样做运算么?
  20. 浏览器设置跨域及允许携带cookie

热门文章

  1. vue3.0新特性及用法
  2. 【动态规划笔记】背包方案数量
  3. 最简单的基于FFmpeg的内存读写的例子:内存播放器
  4. java 字符串 float_Java 字符串转float运算 float转字符串
  5. python在类内部使用装饰器_python – 如何在类中使用装饰器
  6. oracle dba 命令行,Oracle DBA常用命令
  7. IE8的的文本模式怎么固定
  8. 软件设计之UML的几种关系
  9. 【编译器】G++相关编译命令
  10. linux的manual手册不存在,Linux笔记