java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > logback自定义指定日志文件存储目录

logback之自定义指定日志文件存储目录方式

作者:cwh056056

这篇文章主要介绍了logback之自定义指定日志文件存储目录方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

logback自定义指定日志文件存储目录

1、正常使用

定义一个logback.xml配置文件即可:

<?xml version="1.0" encoding="UTF-8" ?>
 
<configuration>
 
    <!-- 指定日志文件路径(与当前程序jar包同一目录下) -->
    <property name="LOG_HOME" value="logs" />
 
    <!--每天生成日志的类-->
    <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>   <!--过滤掉error的级别-->
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
        <encoder>
            <pattern>
                %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger - %msg%n
            </pattern>
        </encoder>
        <!--滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--路径-->
            <fileNamePattern>${LOG_HOME}/mds-tool-box-info.%d.log</fileNamePattern>
        </rollingPolicy>
    </appender>
 
 
    <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>  <!--//打印error-->
        </filter>
        <encoder>
            <pattern>
                %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger - %msg%n
            </pattern>
        </encoder>
        <!--滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--路径-->
            <fileNamePattern>${LOG_HOME}/mds-tool-box-error.%d.log</fileNamePattern>
        </rollingPolicy>
    </appender>
 
    <root level="info">
<!--        <appender-ref ref="consoleLog" />-->
        <appender-ref ref="fileInfoLog" />
        <appender-ref ref="fileErrorLog" />
    </root>
 
</configuration>

2、自定义指定日志文件存储目录

2.1 定义监听器

/**
 * @version 1.0
 * @class: CustomLogContextListener
 * @author: carlo
 * @mail: carlo_cwh@qq.com
 * @date: 2021/8/25 10:01
 * @description: 定义logback 日志监听器,指定日志文件存放目录
 */
public class CustomLogContextListener extends ContextAwareBase implements LoggerContextListener, LifeCycle {
 
    /** 存储日志路径标识 */
    public static final String LOG_PAHT_KEY = "LOG_PATH";
 
    @Override
    public boolean isResetResistant() {
        return false;
    }
 
    @Override
    public void onStart(LoggerContext loggerContext) {
 
    }
 
    @Override
    public void onReset(LoggerContext loggerContext) {
 
    }
 
    @Override
    public void onStop(LoggerContext loggerContext) {
 
    }
 
    @Override
    public void onLevelChange(Logger logger, Level level) {
 
    }
 
    @Override
    public void start() {
        // "user.dir"是指用户当前工作目录
        String s = System.getProperty("user.dir") + "/logs/";
        System.setProperty(LOG_PAHT_KEY, s);
        Context context = getContext();
        context.putProperty(LOG_PAHT_KEY,  s);
    }
 
    @Override
    public void stop() {
 
    }
 
    @Override
    public boolean isStarted() {
        return false;
    }
}

2.2 在logback.xml日志文件中指定监听器

<?xml version="1.0" encoding="UTF-8" ?>
 
<configuration>
 
    <!-- 监听器,指定日志文件存放目录 -->
    <contextListener class="com.hh.listener.CustomLogContextListener" />
 
    <!--每天生成日志的类-->
    <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>   <!--过滤掉error的级别-->
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
        <encoder>
            <pattern>
                %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger - %msg%n
            </pattern>
        </encoder>
        <!--滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--路径-->
            <fileNamePattern>${LOG_PATH}/mds-tool-box-info.%d.log</fileNamePattern>
        </rollingPolicy>
    </appender>
 
 
    <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>  <!--//打印error-->
        </filter>
        <encoder>
            <pattern>
                %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger - %msg%n
            </pattern>
        </encoder>
        <!--滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--路径-->
            <fileNamePattern>${LOG_PATH}/mds-tool-box-error.%d.log</fileNamePattern>
        </rollingPolicy>
    </appender>
 
    <root level="info">
<!--        <appender-ref ref="consoleLog" />-->
        <appender-ref ref="fileInfoLog" />
        <appender-ref ref="fileErrorLog" />
    </root>
 
</configuration>

其中  ${LOG_PATH} 为我们在监听器中定义的 key 值

logback基本配置说明

logback继承自log4j,它是spring boot默认的日志集成框架,官网地址:https://logback.qos.ch/

spring boot默认日志框架

当我们启动spring boot项目的时候,没有进行任何日志的配置,控制台能输出日志,原因是spring boot内置了org.springframework.boot.logging.logback日志,里面配置了base.xml文件,引入了基础的日志输出格式。

当我们项目部署到服务器后,会在与jar同级的目录下生成一个默认日志文件,文件名为jar包的名称。

自定义logback配置文件

默认的日志文件,生成的日志格式配置不是我们所希望的,默认日志输出格式:

此时我们可以自定义logback配置文件,默认的日志文件名为logback.xml,spring官方首推的默认日志文件名为logback-spring.xml;若是我们想命名为其他的名称,也是可以的,在properties或者yml配置文件中指明下日志路径和名称即可:

logging:
  config: classpath:logback-xxx.xml

日志文件统一放在目录:src/resources之下。

配置文件说明

先来看一个完整的配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<!--自动扫描配置文件,间隔周期是60秒,不打印logback的内部日志信息-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!--根据spring激活的配置文件定义不同的属性-->
    <springProfile name="local">
        <!--local环境,日志的存放位置-->
        <property name="LOG_HOME" value="/Users/work/tools/logs/xxx" />
        <!--local环境,控制台输出的日志级别-->
        <property name="CONSOLE_LEVEL" value="INFO" />
    </springProfile>
    <springProfile name="dev">
        <!--dev环境,日志的存放位置-->
        <property name="LOG_HOME" value="/u01/logs/xxx" />
        <!--pro环境,控制台输出的日志级别-->
        <property name="CONSOLE_LEVEL" value="OFF" />
    </springProfile>
    <springProfile name="pro">
        <!--pro环境,日志的存放位置-->
        <property name="LOG_HOME" value="/u01/logs/xxx" />
        <!--pro环境,控制台输出的日志级别-->
        <property name="CONSOLE_LEVEL" value="OFF" />
    </springProfile>
    <!--日志存放最大数量-->
    <property name="maxHistory" value="30"/>

    <!--定义控制台输出的日志信息-->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!--把事件转化成byte数组,并把数组输出为文本-->
        <encoder>
            <!--定义输出的日志格式-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{20} -%msg%n</pattern>
        </encoder>
        <!--过滤输出的日志-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <!--定义日志的级别,大于此级别才输出日志-->
            <level>${CONSOLE_LEVEL}</level>
        </filter>
    </appender>
    
    <!--定义滚动日志-->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--日志的存放名:目录+文件名-->
        <file>${LOG_HOME}/auth-open.info.log</file>
        <encoder>
            <!--日志输出格式-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{20} -%msg%n</pattern>
        </encoder>
        <!--基于时间滚动的日志-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--文件名的定义规则-->
            <fileNamePattern>${LOG_HOME}/auth-open.info.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!--保存文件的最大记录-->
            <maxHistory>${maxHistory}</maxHistory>
        </rollingPolicy>
    </appender>
    <!--错误文件的滚动配置-->
    <appender name="FILE-ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/auth-open.error.log</file>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{20} -%msg%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/auth-open.error.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>${maxHistory}</maxHistory>
        </rollingPolicy>
    </appender>

    <!--根目录日志级别是info-->
    <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
        <appender-ref ref="FILE-ERROR" />
    </root>

</configuration>

配置文件描述:

configuration

configuration是最外层的配置,在其内包含所有的配置信息。

springProfile

根据spring boot项目激活的文件,定义对应的配置信息,用于区分同一变量在不同环境下的值。

root

root为配置文件的根节点,可以配置日志的级别和日志输出的引用。

appender

定义日志追加的相关信息,name的值与appender-ref中的ref值对应。

ConsoleAppender

控制台输出日志的类,存在于包ch.qos.logback.core.ConsoleAppender下,可以配置控制台输出的格式,日志级别。

RollingFileAppender

滚动日志的类,存在于包ch.qos.logback.core.rolling.RollingFileAppender,可以滚动存放日志信息。

RollingPolicy

滚动日志的策略,可以根据时间滚动TimeBasedRollingPolicy,时间和文件大小滚动SizeAndTimeBasedRollingPolicy。

encoder

pattern

<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{20} -%msg%n</pattern>
完整logger名 : cn.xbz.test.HelloController
%logger : cn.xbz.test.HelloController
%logger{0}: HelloController
%logger{5}: c.x.t.HelloController
%logger{20}: c.x.test.HelloController

level级别

logback有5种级别,分别是Trace<Debug<Info<Warn<Error。

如果logger没有分配日志级别,会从被分配级别最近的父类那里继承级别,root logger默认级别是Debug。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文