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的人,请查看标题默认初始化过程 ,您将在其中找到以下内容:
确切的默认初始化算法定义如下:
- 将
log4j.defaultInitOverride
系统属性设置为除“false
”之外的任何其他值将导致log4j跳过默认初始化过程(此过程)。- 将资源字符串变量设置为
log4j.configuration
系统属性的值。 指定默认初始化文件的首选方法是通过log4j.configuration
系统属性。 如果未定义系统属性log4j.configuration,则将字符串变量资源设置为其默认值 “log4j.properties
”。- 尝试将资源变量转换为URL。
- 如果资源变量无法转换为URL,例如由于MalformedURLException,则通过调用返回URL的org.apache.log4j.helpers.Loader.getResource(resource,Logger.class)从类路径中搜索资源。 。 请注意,字符串“
log4j.properties
”构成格式错误的URL。 有关搜索位置的列表,请参阅Loader.getResource(java.lang.String) 。- 如果找不到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类路径的精细性,因此可以避免它出现错误。