spring boot 使用代码配置 logback 并动态输出到不同文件

1.用于存放log的参数

@Data
public class CommonLogConfigEntity {

    private String baseDir;

    private Integer maxHistory;

    private String maxFileSize;
}

 

@Data
public class CommonLogProperties {

    private static final String baseDir = "logs";

    private static final Integer maxHistory = 30;

    private static final String maxFileSize = "50MB";

    private static final Map<String, CommonLogConfigEntity> config = new HashMap<>();

    public static CommonLogConfigEntity get(String loggerName) {

        CommonLogConfigEntity configEntity = config.get(loggerName);

        if (configEntity == null) {
            configEntity = new CommonLogConfigEntity();
            configEntity.setBaseDir(baseDir);
            configEntity.setMaxFileSize(maxFileSize);
            configEntity.setMaxHistory(maxHistory);
        }

        return configEntity;
    }

    public static void put(String loggerName, String baseDir, Integer maxHistory, String maxFileSize) {

        CommonLogConfigEntity configEntity = new CommonLogConfigEntity();
        configEntity.setBaseDir(baseDir);
        configEntity.setMaxFileSize(maxFileSize);
        configEntity.setMaxHistory(maxHistory);

        config.put(loggerName, configEntity);
    }
}

 

2.自定义LoggerFactory

public class CommonLoggerFactory {

    private static final Map<String, Logger> loggers = new HashMap<>();

    public static Logger getLogger(String name) {

        Logger logger = loggers.get(name);
        if (logger != null) {
            return logger;
        }

        synchronized (CommonLoggerFactory.class) {
            logger = loggers.get(name);
            if (logger != null) {
                return logger;
            }
            logger = createLogger(name);
            loggers.put(name, logger);
        }

        return logger;
    }

    public static Logger createLogger(String loggerName) {

        CommonLogConfigEntity configEntity = CommonLogProperties.get(loggerName);

        LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();

        RollingFileAppender<ILoggingEvent> rollingFileAppender = new RollingFileAppender<>();
        rollingFileAppender.setContext(loggerContext);
        rollingFileAppender.setAppend(true);
        rollingFileAppender.setName(loggerName + "LogAppender");
        rollingFileAppender.setFile(configEntity.getBaseDir() + "/" + loggerName + ".log");

        SizeAndTimeBasedRollingPolicy rollingPolicy = new SizeAndTimeBasedRollingPolicy<>();
        rollingPolicy.setFileNamePattern(configEntity.getBaseDir() + "/" + loggerName + ".%d{yyyy-MM-dd}.%i.log");
        rollingPolicy.setMaxHistory(configEntity.getMaxHistory());
        rollingPolicy.setContext(loggerContext);
        rollingPolicy.setParent(rollingFileAppender);
        rollingPolicy.setMaxFileSize(FileSize.valueOf(configEntity.getMaxFileSize()));
        rollingPolicy.setCleanHistoryOnStart(true);
        rollingPolicy.start();
        rollingFileAppender.setRollingPolicy(rollingPolicy);

        PatternLayoutEncoder encoder = new PatternLayoutEncoder();
        encoder.setPattern("%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %logger{50} %msg%n");
        encoder.setCharset(Charset.forName("UTF-8"));
        encoder.setContext(loggerContext);
        encoder.start();
        rollingFileAppender.setEncoder(encoder);
        rollingFileAppender.start();

        Logger logger = loggerContext.getLogger(loggerName);
        logger.addAppender(rollingFileAppender);

        return logger;
    }

    public static void registerLogger(String loggerName, String baseDir, Integer maxHistory, String maxFileSize) {
        CommonLogProperties.put(loggerName, baseDir, maxHistory, maxFileSize);
    }
}

 

3.初始化Logger对象

在CommonLogProperties 中预设了日志的三个参数,切割日志的大小(KB,MB,GB),保存的时间和保存的目

    private static final String baseDir = "logs";

    private static final Integer maxHistory = 30;

    private static final String maxFileSize = "50MB";

 

当有需要自定这些参数时,可以重新注册一个自定义参数的logger

  CommonLoggerFactory.registerLogger("api","logs/",1,"50MB");

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值