我想知道如何通過log4j的LogManger.getLogger()方法獲得自定義記錄器 。通過LogManger.getLogger()獲取自定義記錄器
我幾乎可以肯定我的項目不需要自定義記錄器,並使用默認的log4j記錄器。
但是,如果有必要,我想用我的自定義記錄器更改源代碼中的所有記錄器。
只需更改設置文件或LoggerFactory源代碼即可嗎?
如果這篇文章重複,請把鏈接引導到那裏。
謝謝。
我想知道如何通過log4j的LogManger.getLogger()方法獲得自定義記錄器 。通過LogManger.getLogger()獲取自定義記錄器
我幾乎可以肯定我的項目不需要自定義記錄器,並使用默認的log4j記錄器。
但是,如果有必要,我想用我的自定義記錄器更改源代碼中的所有記錄器。
只需更改設置文件或LoggerFactory源代碼即可嗎?
如果這篇文章重複,請把鏈接引導到那裏。
謝謝。
推薦的方法是修改配置文件並將watch標誌設置爲true。如果你想推進做源代碼的方法,請參閱下文。
這是一個相當複雜的過程,其中包括轉換爲log4j.core.logger類型以公開被Logger界面隱藏的受保護方法。我還應該聲明,這涉及到core.logger中的受保護方法,這些方法隨時都可能發生變化。
爲你幸運我剛剛解決了這個問題,並有示例代碼。
/**
* 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
編輯您的評論如下:
好像你只是想你的記錄添加到您的xml配置,並從Java代碼抓住它,這是很容易做到的...
<Loggers>
<Logger name="com.foo.Bar" level="trace" additivity="false">
<AppenderRef ref="whateverAppenderName"/>
</Logger>
<Root level="error">
<AppenderRef ref="whateverOtherAppenderName"/>
</Root>
</Loggers>
然後在Java代碼:
package com.foo;
class Bar{
private static final Logger log = LogManager.getLogger(); //qualified class name is com.foo.Bar
}
登錄log4j也是層次結構。這意味着如果你定義了一個名爲「com.foo」的記錄器,它將被該包的所有孩子抓住,如果它是最容易到達的記錄器(這意味着,你沒有針對該特定類的更具體的記錄器名稱)
閱讀本文... http://logging.apache.org/log4j/2.x/manual/configuration.html#XML
請看看https://issues.apache.org/jira/browse/LOG4J2-519
注意,附加到票證上的密碼生成器與此工具的log4j-2.0的未來版本可能會破壞產生的試驗和定製/擴展記錄儀。
謝謝rpg711。但我想知道更改配置文件的方法。你能告訴我更多關於它的細節嗎? – Takeshinho
@Takeshinho哦。你只是想添加另一個記錄器到你的XML配置?這是一件非常微不足道的事情......請參閱log4j2文檔。您只需將您的記錄器添加到''節點並使用您定義的記錄器名稱調用'getLogger()'(默認使用您的類的合格類名稱) –
rpg711