log4j - 如何基于多个动态参数在 Log4j2 中以编程方式创建多个日志文件?
问题描述
有没有办法基于多个动态参数在 Log4j2 中以编程方式创建多个日志文件?例如,对于输入参数“abc”,程序应该创建“abc.log”,对于输入参数“xyz”,它应该创建“xyz.log”。动态参数的数量是事先不知道的。动态参数的数量也没有限制。
例如,以下动态方法适用于较旧的 Log4j 1.2。需要您的帮助才能在 Log4j2 中提出一个简单的等效方法。谢谢。
/**
* Equivalent Log4j 1.2 code for REFERENCE PURPOSES ONLY
*/
public static Logger getDynamicLogger(String parameter){
Logger logger = null;
try {
SimpleLayout layout = new SimpleLayout();
RollingFileAppender appender = null;
logger = Logger.getLogger(parameter);
String path = "/opt/logs/";
appender = new RollingFileAppender(layout, path + parameter+".log", true);
logger.addAppender(appender);
appender.setImmediateFlush(true);
appender.setMaxBackupIndex(1);
appender.setMaximumFileSize(1000000);
logger.setAdditivity(false);
}
catch(IOException e) {
throw new RuntimeException("Error while creating dynamic logger",e);
}
return logger;
}
解决方案
有一个RoutingAppender为Log4j 2.x FAQ中记录的动态日志记录要求提供支持。但是,鉴于要求不同,以下方法很有用。
public static Logger getLogger(String parameter){
String path = "/opt/logs/";
final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
final Configuration config = ctx.getConfiguration();
SizeBasedTriggeringPolicy policy = SizeBasedTriggeringPolicy.createPolicy("10MB");
DefaultRolloverStrategy strategy = DefaultRolloverStrategy.createStrategy("20", "1", null, null, null, false, config);
PatternLayout layout = PatternLayout.newBuilder().withConfiguration(config).withPattern(PatternLayout.SIMPLE_CONVERSION_PATTERN).build();
Appender appender = RollingFileAppender.createAppender(path+parameter+".log", path+parameter+"-%i.log",
"true", parameter, "true", "128", "true", policy, strategy, layout, (Filter) null, "false", "false", (String) null, config);
appender.start();
config.addAppender(appender);
AppenderRef ref = AppenderRef.createAppenderRef(parameter, null, null);
AppenderRef[] refs = new AppenderRef[] {ref};
LoggerConfig loggerConfig = LoggerConfig.createLogger(false, Level.INFO, parameter, "true", refs, null, config, null );
loggerConfig.addAppender(appender, null, null);
config.addLogger(parameter, loggerConfig);
ctx.updateLoggers();
return LogManager.getLogger(parameter);
}
推荐阅读
- xml - 如何给边界直到身体区域的末端?
- session - ZAP 运行并行会话
- python - python:如何通过鼠标事件删除部分等高线图(matplotlib)
- php - 维护 MySQL WooCommerce 客户表的问题
- php - 将 PHP 数组传输到 PowerShell 函数
- node.js - NodeJS Selenium Chrome Headless Driver 挂起从 url 获取网站
- javascript - 如何在运行另一个或其余代码之前等待函数完成?
- gridview - 我在 yii2 中的可搜索下拉列表不起作用
- wpf - 基于条件的 wpf 可见性
- java - 重新排列 ListView 单元格