【问题标题】:Why I obtain this error when I try to use log4j?为什么我在尝试使用 log4j 时会出现此错误?
【发布时间】:2015-02-24 16:19:34
【问题描述】:

我是 log4j 的新手,遇到以下问题。

在一个名为 Mailer 的类中,我声明了我的 log4j Logger 对象,以这种方式:

private static final org.apache.log4j.Logger logger = Logger.getLogger(Mailer.class);

然后我在类构造函数中添加了一个日志记录(以测试记录器是否正常工作),以这种方式:

public Mailer() {
    super();
    logger.debug("LOGGER IN ACTION !!! INTO Mailer CONSTRUCTOR !!!");
    setTimeoper();
}

问题是当进入类构造器时,记录器似乎不能正常工作并且不打印我的消息,而是我得到这个记录器错误(进入控制台):

log4j:WARN No appenders could be found for logger (utility.Mailer).
log4j:WARN Please initialize the log4j system properly.

在我的项目中,我有一个 config 包,其中包含 log4j.properties 文件,其中包含显示 DEBUG 的简约内容log4j 语句进入控制台:

定义控制台附加程序

log4j.appender.consoleAppender = org.apache.log4j.ConsoleAppender

# now define the layout for the appender
log4j.appender.consoleAppender.layout = org.apache.log4j.PatternLayout
log4j.appender.consoleAppender.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

# now map our console appender as a root logger, means all log messages will go to this appender
log4j.rootLogger = DEBUG, consoleAppender

我认为这是正确的,但我从未指定 log4j 必须这样做(我不知道我必须如何以及必须做什么)

我错过了什么?如何解决这个问题并正确配置 log4j?

Tnx

【问题讨论】:

  • log4j.properties 如果未设置显式位置,则必须位于类路径的根目录。
  • @BoristheSpider 好的,如果我想将它放入配置包中,我该如何指定它?

标签: java logging log4j


【解决方案1】:

log4j documentation 状态

确切的默认初始化算法定义如下:

  1. 将 log4j.defaultInitOverride 系统属性设置为任何其他值然后“false”将导致 log4j 跳过默认初始化 程序(本程序)。
  2. 将资源字符串变量设置为 log4j.configuration 系统属性的值。指定的首选方式 默认初始化文件是通过log4j.configuration系统 财产。 如果系统属性 log4j.configuration 不是 已定义,然后将字符串变量资源设置为其默认值 “log4j.properties”
  3. 尝试将资源变量转换为 URL。
  4. 如果资源变量无法转换为 URL,例如由于 MalformedURLException,则从 通过调用类路径 org.apache.log4j.helpers.Loader.getResource(resource, Logger.class) 它返回一个 URL。注意字符串“log4j.properties” 构成格式错误的网址。
  5. 如果找不到 URL,则中止默认初始化。 否则,从 URL 配置 log4j。

由于您没有指定这样的属性,log4j 将在类路径的根目录中查找 log4j.properties。您的属性文件包含config,因此 log4j 找不到它。移动它或提供一个系统属性及其位置。

【讨论】:

  • 如果我把它放在类路径的根目录下可以正常工作,但是如果 log4j.properties 文件在配置包中,我该怎么做呢?
  • @AndreaNobili 请参阅引文中的第 2 点及其后的段落。
  • 我读过,但我不知道具体是怎么做的。能给我看个代码 sn-p 吗?
  • @AndreaNobili 没有代码 sn-p。在启动 Java 进程时提供系统属性。 java -Dlog4j.configuration=/path/to/config MyMain.
猜你喜欢
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
  • 2013-08-14
  • 2020-10-18
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
  • 2021-06-27
相关资源
最近更新 更多