[英]Log to different files based on logger name
我有以下問題。 我正在開發一個對所有記錄器使用文件追加器的應用程序(log4j 1.2版)。 一切正常,但是現在我需要根據一些運行時參數登錄到其他文件。
作為限制,我還需要限制log4j.xml配置信息的數量,因為我事先不知道此參數將采用多少值,因此,我無法配置指向該參數的其他附加程序(FileAppenders) log4j配置文件中的其他文件。 我還需要限制添加的新代碼的數量,例如,可以將運行時參數作為記錄器名稱的一部分傳遞(LoggerFactory.getLogger(runtimeParameter + getClass)等),但是我不願意創建通過代碼創建一個新的FileAppender,然后將該新的Appender添加到最近創建的記錄器中(附帶的問題,這種替代方法可行嗎?)。
我認為也許可以創建一個新的附加程序,根據他提供的名稱(基於運行時參數)打開不同的文件,但是我不知道該怎么做,我也不知道它在執行時的行為同時(因為它將是所有記錄器的單個追加程序)。
謝謝您,請原諒我的英語!
聽起來,最簡單的解決方法是實時以編程方式配置和創建記錄器對象。
是的,它有效。 幸運的是,我剛剛解決了這個問題,並提供了示例代碼。 但是,這用於log4j2。 我相信它在1.2中會更容易和直接
/**
* Dynamically creates an instance of a Logger.
*
* @param appenderName
* most often will be the name of the class this logger will
* belong to.
* @param logFileName
* the file name to save the logs to
* @return
*/
public static org.apache.logging.log4j.Logger createInstanceLogger(String appenderName,
String logFileName) {
//call getLogger() which will create and load a logger with a default configuration
org.apache.logging.log4j.Logger logger = org.apache.logging.log4j.LogManager
.getLogger(String.format("DynamicLogger%s",
String.valueOf(DynamicLogManager.loggerCount++)));
org.apache.logging.log4j.core.Logger coreLogger = (org.apache.logging.log4j.core.Logger) logger; // cast logger to core logger to access protected methods
org.apache.logging.log4j.core.LoggerContext context = coreLogger.getContext();
org.apache.logging.log4j.core.config.BaseConfiguration configuration = (org.apache.logging.log4j.core.config.BaseConfiguration) context
.getConfiguration();
TriggeringPolicy compositePolicy = CompositeTriggeringPolicy.createPolicy(
SizeBasedTriggeringPolicy.createPolicy("5mb"),
TimeBasedTriggeringPolicy.createPolicy("1", "true"));
String fileName = String.format("%1$s/%2$s", appenderName, logFileName);
String filePattern = String.format("%1$s/%2$s.%%d{yyyy-MM-dd}",
appenderName, logFileName);
Layout<String> layout = PatternLayout.createLayout(DynamicLogManager._conversionPattern,
configuration, RegexReplacement.createRegexReplacement("a^", "."), //empty regex replacement
"utf-8", "false");
Filter f = ThresholdFilter.createFilter("trace", "accept", "accept");
Appender a = RollingFileAppender.createAppender(fileName, //fileName
filePattern, //filePattern
"true", //append
appenderName, //appender name
"true", //bufferred io
"true", //immediate flush
compositePolicy, //policy
null, //strategy default
layout, //layout
f, //filter none
"true", //ignore exceptions
"false", //advertise
"null", //advertise uri
configuration //configuration
);
a.start();
coreLogger.addAppender(a);
//this is where we would figure out how to configure the logger to listen on a configuration file
coreLogger.setLevel(Level.ALL); //set the log level of the logger that we are returning to Level.ALL
return coreLogger; //cast logger back to Logger interface
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.