java - log4j - 找不到附加程序,自定义配置文件

标签 java log4j

我是第一次在项目中使用 log4j,并且尝试使用自定义配置来输出日志。我希望记录器配置位于自定义文件中,而不是 log4j.xml 或 log4j.properties 中。这就是我现在所拥有的:

构造函数:

public Manager(int managerID, String loggerConfigFile) {
    this.MANAGER_ID = managerID;
    logger = Logger.getLogger("testLogger" + MANAGER_ID);
    PropertyConfigurator.configure(loggerConfigFile);
}

第一次调用logger的方法:

public void getPacketsFromStream(InputStream inputStream) {
    logger.info("Manager " + MANAGER_ID + " started.");

(稍后还有更多,但这并不重要)

test1.config 的内容(即构造函数中 loggerConfigFile 的值)

testLogger1=DEBUG,A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n

我已经检查过,配置文件位于类路径中。

我希望这会导致记录器将该一条语句写入控制台。相反,我得到(使用 -Dlog4j.debug 标志)以下输出:

log4j: Trying to find [log4j.xml] using context classloader sun.misc.Launcher$AppClassLoader@1f12c4e.
log4j: Trying to find [log4j.xml] using sun.misc.Launcher$AppClassLoader@1f12c4e class loader.
log4j: Trying to find [log4j.xml] using ClassLoader.getSystemResource().
log4j: Trying to find [log4j.properties] using context classloader sun.misc.Launcher$AppClassLoader@1f12c4e.
log4j: Trying to find [log4j.properties] using sun.misc.Launcher$AppClassLoader@1f12c4e class loader.
log4j: Trying to find [log4j.properties] using ClassLoader.getSystemResource().
log4j: Could not find resource: [null].
log4j: Could not find root logger information. Is this OK?
log4j: Finished configuring.
log4j:WARN No appenders could be found for logger (testLogger1).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

我做错了什么?

编辑:

我按照第一个答案的建议做了 - 之前移动了 log4j 配置并将 rootLogger 添加到配置文件 log4j.rootLogger=DEBUG,A1 中,并获得了预期的输出。然后我尝试进一步修改配置文件,最终得到以下结果:

log4j.rootLogger=DEBUG,A0
testLogger1=DEBUG,A1

log4j.appender.A0=org.apache.log4j.ConsoleAppender
log4j.appender.A1=org.apache.log4j.ConsoleAppender

log4j.appender.A0.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout=org.apache.log4j.PatternLayout

log4j.appender.A0.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x --- %m%n
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n

请注意,A0 和 A1 的输出格式略有不同。 这是我在输出中得到的:

log4j: Trying to find [log4j.xml] using context classloader sun.misc.Launcher$AppClassLoader@1f12c4e.
log4j: Trying to find [log4j.xml] using sun.misc.Launcher$AppClassLoader@1f12c4e class loader.
log4j: Trying to find [log4j.xml] using ClassLoader.getSystemResource().
log4j: Trying to find [log4j.properties] using context classloader sun.misc.Launcher$AppClassLoader@1f12c4e.
log4j: Trying to find [log4j.properties] using sun.misc.Launcher$AppClassLoader@1f12c4e class loader.
log4j: Trying to find [log4j.properties] using ClassLoader.getSystemResource().
log4j: Could not find resource: [null].
log4j: Parsing for [root] with value=[DEBUG,A0].
log4j: Level token is [DEBUG].
log4j: Category root set to DEBUG
log4j: Parsing appender named "A0".
log4j: Parsing layout options for "A0".
log4j: Setting property [conversionPattern] to [%-4r %-5p [%t] %37c %3x --- %m%n].
log4j: End of parsing for "A0".
log4j: Parsed "A0" options.
log4j: Finished configuring.
0    INFO  [main]                           testLogger1     --- Manager 1 started.

如何让 log4j 使用 testLogger1 及其附加程序 A1,而不是 rootLogger 和 A0?我希望 getLogger("testLogger1") 能够做到这一点。

最佳答案

您应该在实例化 Logger 之前配置 Log4J:

public Manager(int managerID, String loggerConfigFile) {
    PropertyConfigurator.configure(loggerConfigFile);
    this.MANAGER_ID = managerID;
    logger = Logger.getLogger("testLogger" + MANAGER_ID);
}

您还应该在配置中定义根记录器以避免“无法找到根记录器信息”;例如:

log4j.rootLogger=DEBUG, A1

参见http://logging.apache.org/log4j/1.2/manual.html更多细节。例如,您可以使用 Java 环境变量来指定包含 Log4J 配置的文件名/路径(而不是在 Java 代码中执行此操作)。

关于java - log4j - 找不到附加程序,自定义配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24308793/

相关文章:

c# - 如何用java或C#解析包含utf-8字符的pdf文件

java - XSLT 与 Saxon 和 EXSLT.org 的 RegEx

postgresql - 尝试执行sql时出错

java - 在部署时覆盖 log4j 设置

java - Apache Solr 客户端 = 如何启用 "wire"日志记录(使用 log4j)

java - Kafka Consumer输出过多的DEBUG语句到console(eclipse)

java - 如何在java中复制粘贴和剪切粘贴文件或文件夹?

java - 为什么在装饰器中调用安全认证属性 `principal.displayName`会抛出异常?

java - 错误 400 : Bad Request involving Timestamp within JSON object

exception - 如何拦截Tomcat 上未捕获的异常?