当前位置: 首页 > 知识库问答 >
问题:

log4j-找不到附加器,自定义配置文件

赫连晋
2023-03-14

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

建造商:

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

第一次调用记录器的方法:

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")能做到这一点。

共有2个答案

苍和裕
2023-03-14

阅读完整的log4j手册似乎已经成功了——在配置文件中,记录器名称必须以log4j.logger.作为前缀。下面的配置文件为我工作:

log4j.logger.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
束研
2023-03-14

在实例化记录器之前,应配置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代码中这样做)。

 类似资料:
  • 我正在将log4j1升级到log4j2。我在log4j1中创建了一个自定义appender,并在append(LoggingEvent事件)方法中使用事件检索错误堆栈跟踪。getThrowableStrRep()并为每行追加'\t'。 我在log4j2中没有看到getThrowableStrRep。你能帮我解决我们如何在log4j2中做到这一点吗?

  • 我尝试使用第二个日志文件与我的默认日志文件在servlet我有这个log4j.xml配置。 现在在servlet中,我将记录器设置为: 但在运行时:错误日志。调试(“启动应用程序”);我得到: log4j和log4j.xml在类路径我做错了什么?

  • 我已经将log4j放入了buildpath中,但在运行应用程序时会收到以下消息: 这些警告意味着什么?这里的附加符是什么?

  • 我有一个非常简单的scala应用程序。它所做的只是初始化记录器并logger.info(“你好”)。我在类路径中有一个log4j.properties文件,它具有以下设置 但是,当我尝试运行应用程序时。我得到的错误是log4j:WARN找不到记录器的appender(app.TestApp$)。log4j:警告请正确初始化log4j系统。 我错过了什么?但是,如果我有hadoop core,我会打

  • 问题内容: 我已经将log4j放到了我的构建路径中,但是在运行应用程序时收到以下消息: 这些警告是什么意思?这里的追加器是什么? 问题答案: 这个log4j指南的简短介绍有些陈旧,但仍然有效。 该指南将为你提供有关如何使用记录器和附加器的信息。 为了让你步入正轨,你可以采用两种简单的方法。 首先是将这一行添加到你的main方法中: 第二种方法是将这个标准文件log4j.properties(来自上

  • 我已经把我的log4j放好了。我的webapp的lib文件夹中的properties文件我还尝试在META-INF中输入如下内容: 这是我的log4j.properties.我得到以上警告和记录器是不写任何文件。我也创建了文件夹结构,如上所述。