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

Mar*_*oft 25 java logging log4j

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

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

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

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

cro*_*wne 37

对于那些没有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除非URL与"结束到配置log4j .xml"扩展,在这种情况下 DOMConfigurator 将被使用.您可以选择指定自定义配置程序.该值log4j.configuratorClass系统属性作为您的自定义配置的完全限定类名.您指定的自定义配置程序必须实现该Configurator接口.

  • FM有点过时了.查看1.2.17中"LogManager.java"的源代码,默认情况下,它在查找"log4j.properties"之前查找"log4j.xml"(该文档中未提及),定义属性文件的常量为声明`@ deprecated`(尽管似乎只是为了防止外部使用常量). (9认同)
  • 一种有用的(即使不粗鲁的)响应。您可以直接参考答案而不必谦虚。+1代表答案,-2代表风格。 (3认同)
  • 羞辱那些没有 RTFM 的人是没有帮助的。 (2认同)

Mar*_*oft 8

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


Jas*_*Day 7

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

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

另见:这个问题.


use*_*861 5

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

无法加载的原因(在我的情况下):log4j.properties我的一个jar中有一个冲突的文件,并且它使我的jar中的文件超载classpath

简而言之,如果您的log4j.properties文件没有加载,则可能会有其他文件覆盖它。

只是以为我也会把这个扔进去,以防其他人碰到这个。我刚刚花了最后5个小时来弄清楚为什么我的默认设置log4j.properties无法加载。