通过环境变量动态指定logback的日志文件位置

背景

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来动态指定每个任务的日志存储位置,一下是效果图:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值