log4j在哪里/如何查找log4j.properties文件?

我正在一个简单的测试应用程序中尝试log4j。 我在eclipse中创建了一个新的Java项目,并将log4j JAR(v1.2.16)添加到我的构建路径中。 然后我创建一个打印Hello World的简单类。 然后我使用log4j Logger类来记录信息消息。 当我运行应用程序时,我看到了日志消息,使用我认为是默认的appender和布局。 大。 我遇到的麻烦是添加我自己的配置。 这就是我所做的:

创建了一个带有自定义appender和日志级别的log4j.properties文件,并将其放入src文件夹(在编译时将其复制到bin文件夹中)。 运行应用程序 – 没有变化。

我尝试添加PropertyConfigurator.configure("log4j.properties") 。 运行应用程序 – 没有变化。 没有错误,但没有变化。

我需要做什么才能让log4j加载我的配置文件?

对于那些没有RTFM的人,请查看标题默认初始化过程 ,您将在其中找到以下内容:

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

  1. log4j.defaultInitOverride系统属性设置为除“ false ”之外的任何其他值将导致log4j跳过默认初始化过程(此过程)。
  2. 将资源字符串变量设置为log4j.configuration系统属性的值。 指定默认初始化文件的首选方法是通过log4j.configuration系统属性。 如果未定义系统属性log4j.configuration,则将字符串变量资源设置为其默认值log4j.properties ”。
  3. 尝试将资源变量转换为URL。
  4. 如果资源变量无法转换为URL,例如由于MalformedURLException,则通过调用返回URL的org.apache.log4j.helpers.Loader.getResource(resource,Logger.class)从类路径中搜索资源。 。 请注意,字符串“ log4j.properties ”构成格式错误的URL。 有关搜索位置的列表,请参阅Loader.getResource(java.lang.String) 。
  5. 如果找不到URL,则中止默认初始化。 否则,请从URL配置log4j。 PropertyConfigurator将用于解析URL以配置log4j,除非URL以“ .xml ”扩展名结尾,在这种情况下将使用DOMConfigurator 。 您可以选择指定自定义配置程序。 将log4j.configuratorClass系统属性的值作为自定义配置程序的完全限定类名。 您指定的自定义配置程序必须实现Configurator接口。

哎呀。 我发现问题是eclipse导入了错误的Logger类。 它导入了java.util.logging.Logger,当然它有自己的配置,与log4j不同。 哦,希望其他人这样做并通过阅读这个问题解决它。

您可以通过设置log4j.debug系统属性来启用log4j内部调试。 除此之外,这将导致log4j显示它自己如何配置。

您可以尝试使用log4j.configuration系统属性显式设置配置文件的URL。

另见: 这个问题 。

如果定义了classpath ,则问题可能出在classpath classpath中。

它没有加载的原因(在我的情况下):我的一个jar子里有一个冲突的log4j.properties文件,它在我的classpath重载了一个。

简而言之,如果你的log4j.properties文件没有加载,那么在其他地方可能会有另一个文件覆盖它。

我以为我也会把它扔掉,万一其他人遇到这个问题。 我花了最近5个小时试图弄清楚为什么我的默认log4j.properties不会加载。

log4j.properties应该在您的类路径中。 复制到“bin文件夹”的“src文件夹”(我假设你在这里讲的是Eclipse设置),通常属于你的类路径,所以应该找到它(你把它放在“src”的顶部吗? “文件夹,对吗?)

我知道这已经有几个月了,但我觉得有必要指出scr文件夹没有“复制”到bin文件夹,也不是你运行时类路径的一部分….(构建路径不是运行时类路径!)。 Eclipse将src文件夹中的源文件编译为bin(或任何你喜欢的)文件夹。 它是bin文件夹,它是运行时类路径的一部分。

只是想指出这一点,因为这些线程经常被非常初级的程序员读取,而且我总是感到沮丧的是,他们中的大多数都没有掌握Java类路径的精细性,因此可以避免它出现错误。