Java动态批量生成logback日志文件
public void initLogger(Set<Integer> keySet) {
// 获取 Logback 的 LoggerContext
LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
for (Integer port : keySet) {
Logger logger = null;
try {
String currPath = bsePath + "/" + port + "/";
// 创建 Logger
logger = context.getLogger("LOGGER-" + port);
logger.setLevel(Level.ALL);
logger.setAdditive(false); // 禁止继承父 Logger 的 Appender
// 创建 Appender
RollingFileAppender<ILoggingEvent> appender = new RollingFileAppender<>();
appender.setContext(context);
appender.setName("DYNAMIC_APPENDER_" + port);
appender.setFile(currPath + "app.log");
// 配置滚动策略
TimeBasedRollingPolicy<ILoggingEvent> rollingPolicy = new TimeBasedRollingPolicy<>();
rollingPolicy.setContext(context);
rollingPolicy.setParent(appender);
rollingPolicy.setFileNamePattern(currPath + "log-%d{yyyy-MM-dd}.%i.log");
rollingPolicy.setMaxHistory(3);
rollingPolicy.setTotalSizeCap(FileSize.valueOf("7GB"));
// 配置 SizeAndTimeBasedFNATP
SizeAndTimeBasedFNATP<ILoggingEvent> triggeringPolicy = new SizeAndTimeBasedFNATP<>();
triggeringPolicy.setContext(context);
triggeringPolicy.setMaxFileSize(FileSize.valueOf("100MB"));
triggeringPolicy.setTimeBasedRollingPolicy(rollingPolicy);
rollingPolicy.setTimeBasedFileNamingAndTriggeringPolicy(triggeringPolicy);
try {
rollingPolicy.start(); // 启动滚动策略
} catch (Exception e) {
log.error("Failed to start rolling or triggering policy:", e);
}
// 配置编码器
PatternLayoutEncoder encoder = new PatternLayoutEncoder();
encoder.setContext(context);
encoder.setPattern("%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n");
encoder.start();
// 设置 Appender
appender.setRollingPolicy(rollingPolicy);
appender.setEncoder(encoder);
try {
appender.start();
} catch (Exception e) {
log.error("Failed to start appender: ", e);
}
// 将 Appender 添加到 Logger
logger.addAppender(appender);
// 输出日志
logger.info("测试日志,输出到动态路径文件:{}", currPath);
} catch (Exception e) {
log.error("初始化logger失败:{}", port);
throw new RuntimeException(e);
}
LightManagerBo lightManagerBo = port2ManagerMap.computeIfAbsent(port, k -> new LightManagerBo());
lightManagerBo.setLogger(logger);
}
}