很长时间没有在博客上进行总结了,我还一直在技术的道路上渐行渐远哈哈~,冒个泡,每次进行博客时总是困于,自己的总结太浅显了,所以后面慢慢就变成了在自己本地做做一些笔记没有进行博客输出,最近看到一段话,对我触动很大:总结的过程是一种脑波的逻辑性输出,可以提升知识结构的沉淀,加深印象和理解,重新思考,梳理再用文字呈现,在这个过程中能够更加清晰地明白自己的思路与想法.所以今天又拾起来,在技术深度方向慢慢钻研
先贴一篇官网:logback:http://www.logback.cn/
什么是日志
简单的说,日志就是记录程序的运行轨迹,方便查找关键信息,便于我们快速的定位解决问题
常见的日志框架
什么是logback
简单的来说就是用来进行日志输出,官方定义:logback 继承自 log4j,它建立在有十年工业经验的日志系统之上。它比其它所有的日志系统更快并且更小
项目应用案例
案例1
文件按以下方式输出:
info.log_2020-10-14_14.0.log 按小时切割
info.log.2020-10-14.0.log 按天切割
info.log.2020-09-23_20.0.log.zip 日志压缩
<!--这里放公共变量 -->
<property name="iot.log.dir" value="logs"/>
<property name="INFO_FILE" value="${iot.log.dir}/info.log}"/>
<property name="FILESIZE" value="50MB"/>
<property name="MAXHISTORY" value="100"/>
<timestamp key="DATETIME" datePattern="yyyy-MM-dd HH:mm:ss"/>
<property name="BASE_PATTERN" value="[%-5level] %d{${DATETIME}} [%thread] %logger{36} - %m%n"/>
<!--例1: 日志文件名称: info.log_2020-10-14_14.0.log -->
<appender name="INFO-OUT" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${BASE_PATTERN}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${INFO_FILE}_%d{yyyy-MM-dd_HH}.%i.log</fileNamePattern>
<maxHistory>30</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>1GB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>-->
<!--例2: 日志文件名称: info.log.2020-10-14.0.log 按天切割-->
<appender name="INFO-OUT" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${BASE_PATTERN}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${INFO_FILE}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxHistory>30</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>1GB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<!--例3: 日志文件名称: info.log.2020-10-14.0.log 按天切割 达到1GB则进行压缩 info.log.2020-09-23_20.0.log.zip -->
<appender name="INFO-OUT" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${BASE_PATTERN}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${INFO_FILE}.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
<maxHistory>30</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>1GB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<root level="INFO">
<appender-ref ref="INFO-OUT"/>
</root>
案例2
文件输出格式为:
<property name="log.dir" value="../"/>
<property name="ROOT" value="${log.dir}/"/>
<appender name="INFO-OUT" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>[%-5level] %d{${DATETIME}} [%thread] %logger{36} - %m%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${ROOT}%d/info.%i.log</fileNamePattern>
<maxHistory>10</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>1GB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
案例3
指定输出文件,自定义输出文件
<appender name="**LogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
</appender>
<logger name="***logname" additivity="false">
<appender-ref ref="**LogAppender"/>
</logger>
项目中调用时使用 private static final ILog LOGGER = LogFactory.getLog("***logname");
背景
- 随着业务的增长,日志的不规范问题逐步暴露出来,一方面日志非常大(个别日志,几十G~上百G).我们在grep日志的时候如果日志量过大,cpu 也会飙升.
- 多个服务混合部署在一台服务器上,尽管磁盘比较大,也会出现磁盘不足的报警
解决方案:
1. 对日志进行切割
2. 对日志进行压缩,减少磁盘占用量
日志按天/小时切割
<property name="project.log.dir" value="/windows/c/users/logs/project"/>
<property name="INFO_FILE" value="${project.log.dir}/info.log"/>
<property name="BAMAI_PATTERN" value="[%p][%date{yyyy-MM-dd'T'HH:mm:ss.SSSZ}][%thread-%logger{0}] %m%n"/>
<appender name="infoAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${BAMAI_PATTERN}</pattern>
</encoder>
<file>${INFO_FILE}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${INFO_FILE}.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 按天做切割,最多存储多少天的日志-->
<maxHistory>10</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
</appender>
<root level="INFO">
<appender-ref ref="infoAppender"/>
</root>
有时你希望按时轮转,但同时又想限制每个日志文件的大小。特别是如果后期处理工具需要对日志进行大小限制。
TimeBasedRollingPolicy 可以限制归档文件总的大小。所以如果你想要这个限制,你可以通过设置 totalSizeCap 来达到这个目的.除了 %d 之外还有 %i。这两个占位符都是强制要求的。在当前时间还没有到达周期轮转之前,日志文件达到了 maxFileSize 指定的大小,会进行归档,递增索引从 0 开始
日志压缩
在服务器上每天要产生上百G的日志文件,这样占用磁盘空间很大,需要进行日志压缩来减少磁盘空间占用.
<property name="project.log.dir" value="/windows/c/users/logs/project"/>
<property name="propertyname" value="@iot.log.dir@logname.log" />
<appender name="**LogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>[%p][%d{yyyy-MM-dd'T'HH:mm:ss.SSSZ}] %m%n</pattern>
<charset>UTF-8</charset>
</encoder>
<file>${propertyname}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${propertyname}.%d{yyyy-MM-dd}</fileNamePattern>
<!-- 按天做切割,最多存储多少天的日志-->
<maxHistory>20</maxHistory>
<!-- 存储的日志总量 -->
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
</appender>
<logger name="***logname" additivity="false">
<appender-ref ref="**LogAppender"/>
</logger>
TimeBasedRollingPolicy 支持文件自动压缩。如果 fileNamePattern 以 .gz 或者 .zip 结尾,将会启动这个特性。
小结
日志输出是我们在项目输出时