XML構成の仕様を使用してプログラムでLog4J2アペンダーを追加することは可能ですか?
log4j2.xml ですべてを定義し、次のように状況に応じてアペンダーを選択する予定です (コンパイルされません)。
if (arg[0].equals("log") ) {
Logger.getLogger("loggerNameFromXMLConfig").addAppender("appenderNameFromXMLConfig");
} else {
//...
}
Log4j 2 のより良いプログラム構成をサポートするための多くの要求がありました。申し訳ありませんが、時間がかかりました。Log4j 2.4 の時点で、API が log4j-core に追加され、プログラムによる構成が容易になりました。
新しいConfigurationBuilder
API により、ユーザーはコンポーネント定義を作成できます。この API を使用すると、Log4j が内部でどのように機能するかについて多くの知識を必要とする実際の構成オブジェクト (LoggerConfig や FileAppender など) を直接操作する必要がなくなります。コンポーネント定義が ConfigurationBuilder に追加され、すべての定義が収集されると、すべての実際の構成オブジェクト (Logger や Appender など) が構築されます。Java コードを記述していることを除いて、XML 構成構文に少し似ています。
ConfigurationBuilder
新しいAPI を使用すると、ユーザー コードで新しい構成を作成したり、既存の構成を完全に置き換えたりできることに注意してください。ユース ケースが異なり、Log4j の起動後に既存の構成を (置き換えるのではなく) プログラムで変更する場合は、実際の構成オブジェクトを操作する必要があります。その場合は、マニュアルの「初期化後に現在の構成をプログラムで変更する」セクションを参照してください。
編集: log4j2 の最新バージョンについては、代わりにhttps://stackoverflow.com/a/33472893/1899566を参照してください。
彼らはあなたにこれをしてほしくないという印象を受けますが、これは私にとってはうまくいきます:
if (arg[0].equals("log") ) {
org.apache.logging.log4j.Logger logger
= org.apache.logging.log4j.LogManager.getLogger("loggerNameFromXMLConfig");
org.apache.logging.log4j.core.Logger coreLogger
= (org.apache.logging.log4j.core.Logger)logger;
org.apache.logging.log4j.core.LoggerContext context
= (org.apache.logging.log4j.core.LoggerContext)coreLogger.getContext();
org.apache.logging.log4j.core.config.BaseConfiguration configuration
= (org.apache.logging.log4j.core.config.BaseConfiguration)context.getConfiguration();
coreLogger.addAppender(configuration.getAppender("appenderNameFromXMLConfig"));
} else {
//...
}
役に立つかどうかはわかりません。現在の Configuration の addLoggerAppender メソッドを呼び出すことで、Appender を Logger に追加できます。参照: http://logging.apache.org/log4j/2.x/manual/architecture.html