背景
logback的基本使用就不说了,说说写这片文章的背景,之前做过一个分布式离线调度平台,简单来讲就是跑定时任务的,但是支持的任务类型有多种,不仅仅是Java定时任务,每个任务在跑的时候都会产生一些日志,这些日志要展现在页面给用户看,以便查看任务运行时的一些信息,方便排错,一般的我们可能会想到吧日志采集上来存到es里面,然后页面直接查询es,但是这样会增加依赖,于是就想到把日志存在机器上,页面访问的时候直接去读取这个文件
问题
1、因为支持的任务类型有多种,包括python,shell,hive,java等等,并且每个人的开发习惯不一样,没有办法统一一种日志框架
2、每个任务运行时的日志应该存放在不同的目录和不同的文件,而不是都放在一个目录下,更不能是同一个日志文件
解决思路
对于问题1,与任务开发者约定好,任务内部的日志统一输出到标准输出流中,这样对我们的离线调度平台在调起这些任务的时候只需要通过标准输入流来获取任务内部的日志
对于问题2,在获取到任务运行的内部日志之后,通过动态指定logback的日志路径来记录日志,比如:/app/logs/${task}/${date}/info.log,logkback刚好也支持动态读取java启动程序里-D后面的参数值,于是我们就采用如下logback的配置来记录日志文件:
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<property name="logPath" value="${LOG_HOME}/${task}/logs"/>
<!-- 日志打印的格式 -->
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} %10logger [%thread] : %msg%n
</pattern>
</layout>
</appender>
<!-- info 状态下的日志 -->
<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>DENY</onMatch>
<onMismatch>ACCEPT</onMismatch>
</filter>
<encoder>
<pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} %10logger [%thread] : %msg%n
</pattern>
</encoder>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${logPath}/info.%d.log</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
</appender>
<!-- 错误级别的日志文件 -->
<appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<encoder>
<pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} %10logger [%thread] : %msg%n
</pattern>
</encoder>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${logPath}/error.%d.log</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
</appender>
<root level="info">
<appender-ref ref="consoleLog"/>
<appender-ref ref="fileInfoLog"/>
<appender-ref ref="fileErrorLog"/>
</root>
</configuration>
这样我们就可以在启动的时候通过-D来动态指定每个任务的日志存储位置,一下是效果图: