温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2023-03-10 10:30:08 来源:亿速云 阅读:154 作者:iii 栏目:开发技术

这篇文章主要介绍“logback怎么自定义指定日志文件存储目录”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“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文件,引入了基础的日志输出格式。

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

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

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

    自定义logback配置文件

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

    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>

    配置文件描述:

    • ①配置文件有变动自动扫描,扫描周期是60秒。

    • ②输出的根目录日志级别是info,日志文件配置了控制台输出,滚动日志输出,错误日志输出。

    • ③根据spring不同的激活环境,日志的输出目录配置为不同的值;开发环境控制台出入的级别为info(与根目录保持一致),线上环境和测试环境为off(不输出日志,因为控制台输出的日志与发布的jar包在同一目录下,没法进行删除,造成日志文件冗余)。

    • ④以日期为滚动文件的存储策略,设置日志最大存储量为30,大于30时,自动删除创建是时间最早的日志。

    configuration

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

    • scan:当配置文件发生变动时,是否自动扫描配置信息,true:自动扫描,false:不扫描。

    • scanPeriod:自动扫描的时间周期,默认是毫秒,当scan为true时才有效。

    • debug:是否打印logback内部日志信息,默认是false。

    springProfile

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

    • name:用于指定激活的配置文件,例如测试环境spring.profiles.active为dev,线上环境为pro,此时可以给不同的环境下同一变量设置不同的属性值。

    • property:定义变量,name为后续引用的名称,value为变量的值,后续可以使用${}引用此变量。

    root

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

    • level:日志级别。

    • appender-ref:日志追加的引用,配置ref值与appender标签关联使用。

    appender

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

    ConsoleAppender

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

    RollingFileAppender

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

    RollingPolicy

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

    • fileNamePattern:滚动文件名的表达式。

    • maxHistory:最大历史记录,当大于最大历史记录时,会删除创建时间最早的一份日志记录

    encoder

    • 把事件转化成byte数组,并把数组输出为文本。

    pattern

    • 输出日志的格式表达式,例:

    <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{20} -%msg%n</pattern>
    • %d:日期格式表达式,语法与SimpleDataFormat相同。

    • %thread:线程名。

    • %-5level:日志级别的前五位字符。

    • %logger{20}:输出类名(从左开始缩短 ,每个层级至少保留1位),20位,例:

    完整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
    • msg:日志信息。

    level级别

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

    • Trace:追踪,就是程序推进一下,你就可以写个trace输出。

    • Debug:指出细粒度信息事件,对调试程序非常有帮助。

    • Info:粗粒度级别上突出强调应用程序的运行过程。

    • Warn:输出警告及warn以下级别的日志。

    • Error:输出错误信息日志。

    • Off:关闭全部日志输出。

    • All:开启全部日志输出。

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

    关于“logback怎么自定义指定日志文件存储目录”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注亿速云行业资讯频道,小编每天都会为大家更新不同的知识点。

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI