logback 的日志路径一般都是写死在配置文件中的,在某些场景中,有可能需要动态获取到日志存储路径在配置

    实现思路:在 logback.xml 中,我们可以通过获取 property 属性来获取动态信息,那么怎么把我们的日志路径放到 property 中就是一个重点了

    创建监听器,在初始化 logback 初始化过程中,将我们需要的日志路径设置到上下文中

    1. import cn.mrcode.Ioc;
    2. import ch.qos.logback.classic.Level;
    3. import ch.qos.logback.classic.Logger;
    4. import ch.qos.logback.classic.LoggerContext;
    5. import ch.qos.logback.classic.spi.LoggerContextListener;
    6. import ch.qos.logback.core.Context;
    7. import ch.qos.logback.core.spi.ContextAwareBase;
    8. import ch.qos.logback.core.spi.LifeCycle;
    9. public class CustomLogContextListener extends ContextAwareBase implements LoggerContextListener, LifeCycle {
    10. /**
    11. * 存储日志路径标识
    12. */
    13. public static final String LOG_PAHT_KEY = "LOG_PATH";
    14. @Override
    15. public boolean isResetResistant() {
    16. return false;
    17. }
    18. @Override
    19. public void onStart(LoggerContext loggerContext) {
    20. }
    21. @Override
    22. public void onReset(LoggerContext loggerContext) {
    23. }
    24. @Override
    25. public void onStop(LoggerContext loggerContext) {
    26. }
    27. @Override
    28. public void onLevelChange(Logger logger, Level level) {
    29. }
    30. @Override
    31. public void start() {
    32. String path = System.getProperty("user.dir") + "/logs";
    33. System.setProperty(LOG_PAHT_KEY, path);
    34. Context context = getContext();
    35. context.putProperty(LOG_PAHT_KEY, path);
    36. }
    37. @Override
    38. public void stop() {
    39. }
    40. @Override
    41. public boolean isStarted() {
    42. return false;
    43. }
    44. }

    classpath 下的 logback.xml 配置

    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <configuration scan="true" scanPeriod="20 seconds" debug="true">
    3. <contextListener class="这里是刚刚创建的监听器类路径.CustomLogContextListener"/>
    4. <property name="COMMON_PATTERN"
    5. value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{80}[%line] %msg%n"/>
    6. <!-- 控制台输出 -->
    7. <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    8. <!-- 日志输出编码 -->
    9. <encoder>
    10. <pattern>${COMMON_PATTERN}</pattern>
    11. <charset>utf8</charset>yu
    12. </encoder>
    13. </appender>
    14. <!-- 文件输出日志 (文件大小策略进行文件输出,超过指定大小对文件备份)-->
    15. <appender name="FILE-ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
    16. <!-- 直接通过 property 的方式获取日志路径 -->
    17. <File>${LOG_PATH}/log.log</File>
    18. <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
    19. <FileNamePattern>
    20. ${LOG_PATH}/log-%d{yyyy-MM-dd}.%i.log
    21. </FileNamePattern>
    22. <!--只保留最近 n天的日志-->
    23. <maxHistory>7</maxHistory>
    24. </rollingPolicy>
    25. <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
    26. <MaxFileSize>200MB</MaxFileSize>
    27. </triggeringPolicy>
    28. <encoder>
    29. <pattern>${COMMON_PATTERN}</pattern>
    30. <charset>utf8</charset>
    31. </encoder>
    32. </appender>
    33. <root level="INFO">
    34. <appender-ref ref="CONSOLE"/>
    35. <appender-ref ref="FILE-ALL"/>
    36. </root>
    37. </configuration>