Log4j getAllAppenders() returns 空枚举
Log4j getAllAppenders() returns null enumeration
我正在尝试获取我的 log4j 日志文件的文件名。我尝试了以下答案中给出的解决方案。
Enumeration e = Logger.getRootLogger().getAllAppenders();
while ( e.hasMoreElements() ){
Appender app = (Appender)e.nextElement();
if ( app instanceof FileAppender ){
System.out.println("File: " + ((FileAppender)app).getFile());
}
}
但是,Logger.getRootLogger().getAllAppenders()
returns 一个空枚举。 (我小心使用了答案中提到的 rootLogger
)
以下是我的log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="DEBUG">
<Properties>
<!-- This will be used if LOG_FILE_NAME env variable is not set -->
<Property name="LOG_FILE_NAME">my_app_log</Property>
</Properties>
<Appenders>
<RollingFile name="RollingFile-${web:contextPath}"
fileName="${sys:catalina.base}/logs/${env:LOG_FILE_NAME}.log" immediateFlush="true"
filePattern="${sys:catalina.base}/logs/${env:LOG_FILE_NAME}.log.%d{yyyy_MM_dd.HH_mm_ss}">
<PatternLayout pattern="%d{yyyyMMdd-HHmmss.SSS}|%-5p|%t| %-100m (%c{1})%n"/>
<Policies>
<OnStartupTriggeringPolicy/>
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Root level="DEBUG" includeLocation="false">
<AppenderRef ref="RollingFile-${web:contextPath}"/>
</Root>
</Loggers>
</Configuration>
知道为什么吗?
我刚刚 grep
对 getAllAppenders
的 apache-log4j-2.3-src
的整个源代码进行了处理,我发现只有一个地方正在实施。
在Category.java
@SuppressWarnings("rawtypes")
public Enumeration getAllAppenders() {
return NullEnumeration.getInstance();
}
上述方法returns枚举中没有元素。
另一个在 LoggerTest.java,执行测试用例。
/**
* Add an appender and see if it can be retrieved.
* Skipping this test as the Appender interface isn't compatible with legacy Log4j.
public void testAppender1() {
logger = Logger.getLogger("test");
a1 = new ListAppender("testAppender1");
logger.addAppender(a1);
Enumeration enumeration = logger.getAllAppenders();
Appender aHat = (Appender) enumeration.nextElement();
assertEquals(a1, aHat);
} */
/**
* Add an appender X, Y, remove X and check if Y is the only
* remaining appender.
* Skipping this test as the Appender interface isn't compatible with legacy Log4j.
public void testAppender2() {
a1 = new FileAppender();
a1.setName("testAppender2.1");
a2 = new FileAppender();
a2.setName("testAppender2.2");
logger = Logger.getLogger("test");
logger.addAppender(a1);
logger.addAppender(a2);
logger.removeAppender("testAppender2.1");
Enumeration enumeration = logger.getAllAppenders();
Appender aHat = (Appender) enumeration.nextElement();
assertEquals(a2, aHat);
assertTrue(!enumeration.hasMoreElements());
} */
看到上面的注释,好像是弃用了,连测试用例都注释掉了。但是我不确定,我试图找出他们实际上是否在任何地方声明过,但找不到。
所以我认为这会有所帮助,除非现在浪费时间进行调试。
如本 answer 中所述,使用 getAppenders api 就像
Logger logger = LogManager.getLogger();
Map<String, Appender> appenderMap =
((org.apache.logging.log4j.core.Logger) logger).getAppenders();
您将 Log4j 1 构造与 Log4j 2 混合使用。您无法使用 Log4j 1 查询 Log4j 2 配置API。
要打印出 FileAppender 的文件名,请执行以下操作:
final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
final Configuration config = ctx.getConfiguration();
for (Map.Entry<String, Appender> entry : config.getAppenders().entrySet()) {
if (entry.getValue() instanceof FileAppender) {
System.out.println("File: " + ((FileAppender)entry.getValue()).getFileName());
}
}
我正在尝试获取我的 log4j 日志文件的文件名。我尝试了以下答案中给出的解决方案。
Enumeration e = Logger.getRootLogger().getAllAppenders();
while ( e.hasMoreElements() ){
Appender app = (Appender)e.nextElement();
if ( app instanceof FileAppender ){
System.out.println("File: " + ((FileAppender)app).getFile());
}
}
但是,Logger.getRootLogger().getAllAppenders()
returns 一个空枚举。 (我小心使用了答案中提到的 rootLogger
)
以下是我的log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="DEBUG">
<Properties>
<!-- This will be used if LOG_FILE_NAME env variable is not set -->
<Property name="LOG_FILE_NAME">my_app_log</Property>
</Properties>
<Appenders>
<RollingFile name="RollingFile-${web:contextPath}"
fileName="${sys:catalina.base}/logs/${env:LOG_FILE_NAME}.log" immediateFlush="true"
filePattern="${sys:catalina.base}/logs/${env:LOG_FILE_NAME}.log.%d{yyyy_MM_dd.HH_mm_ss}">
<PatternLayout pattern="%d{yyyyMMdd-HHmmss.SSS}|%-5p|%t| %-100m (%c{1})%n"/>
<Policies>
<OnStartupTriggeringPolicy/>
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Root level="DEBUG" includeLocation="false">
<AppenderRef ref="RollingFile-${web:contextPath}"/>
</Root>
</Loggers>
</Configuration>
知道为什么吗?
我刚刚 grep
对 getAllAppenders
的 apache-log4j-2.3-src
的整个源代码进行了处理,我发现只有一个地方正在实施。
在Category.java
@SuppressWarnings("rawtypes")
public Enumeration getAllAppenders() {
return NullEnumeration.getInstance();
}
上述方法returns枚举中没有元素。
另一个在 LoggerTest.java,执行测试用例。
/**
* Add an appender and see if it can be retrieved.
* Skipping this test as the Appender interface isn't compatible with legacy Log4j.
public void testAppender1() {
logger = Logger.getLogger("test");
a1 = new ListAppender("testAppender1");
logger.addAppender(a1);
Enumeration enumeration = logger.getAllAppenders();
Appender aHat = (Appender) enumeration.nextElement();
assertEquals(a1, aHat);
} */
/**
* Add an appender X, Y, remove X and check if Y is the only
* remaining appender.
* Skipping this test as the Appender interface isn't compatible with legacy Log4j.
public void testAppender2() {
a1 = new FileAppender();
a1.setName("testAppender2.1");
a2 = new FileAppender();
a2.setName("testAppender2.2");
logger = Logger.getLogger("test");
logger.addAppender(a1);
logger.addAppender(a2);
logger.removeAppender("testAppender2.1");
Enumeration enumeration = logger.getAllAppenders();
Appender aHat = (Appender) enumeration.nextElement();
assertEquals(a2, aHat);
assertTrue(!enumeration.hasMoreElements());
} */
看到上面的注释,好像是弃用了,连测试用例都注释掉了。但是我不确定,我试图找出他们实际上是否在任何地方声明过,但找不到。
所以我认为这会有所帮助,除非现在浪费时间进行调试。
如本 answer 中所述,使用 getAppenders api 就像
Logger logger = LogManager.getLogger();
Map<String, Appender> appenderMap =
((org.apache.logging.log4j.core.Logger) logger).getAppenders();
您将 Log4j 1 构造与 Log4j 2 混合使用。您无法使用 Log4j 1 查询 Log4j 2 配置API。
要打印出 FileAppender 的文件名,请执行以下操作:
final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
final Configuration config = ctx.getConfiguration();
for (Map.Entry<String, Appender> entry : config.getAppenders().entrySet()) {
if (entry.getValue() instanceof FileAppender) {
System.out.println("File: " + ((FileAppender)entry.getValue()).getFileName());
}
}