我正在使用log4j在我的Web应用程序中记录信息。我选择了log4j.xml类型的配置而不是log4j.properties。我记得,对于log4j.properties配置,我没有编写Java代码行来查找log4j.property文件位置。但是,对于log4j.xml文件配置,我明确指定它像这样
DOMConfigurator.configure("log4j.xml");//it reads file from classpath, working!
另外,测试我的应用程序从源代码中删除上述语句。它看起来不起作用。除
外,没有打印任何调试语句 System.out.println();
我已经读过log4j默认在类路径中查找log4jproperties文件或log4j.xml文件。我检查了已部署的Web应用程序,log4j.xml文件位于web-inf / classes中。 即使它找不到log4j.xml。
是这样,上面的代码行对于Java中的log4j xml配置是必需的吗? 实际上,如果没有如上所述的显式规范,Java源代码是否不能从类路径中拾取log4j.xml?
答案 0 :(得分:2)
来自log4j manual:
确切的默认初始化算法定义如下:
将log4j.defaultInitOverride系统属性设置为任何其他值 那么“false”将导致log4j跳过默认初始化 程序(本程序)。
将资源字符串变量设置为log4j.configuration系统的值 属性。指定默认初始化文件的首选方法 是通过log4j.configuration系统属性。在系统的情况下 未定义属性log4j.configuration,然后设置字符串变量 资源为其默认值“log4j.properties”。
尝试将资源变量转换为URL。
例如,如果资源变量无法转换为URL 由于MalformedURLException,然后从中搜索资源 classpath通过调用org.apache.log4j.helpers.Loader.getResource(resource,Logger.class) 返回一个URL。请注意字符串“log4j.properties” 构成格式错误的网址。有关搜索位置列表,请参阅Loader.getResource(java.lang.String)。
- 如果找不到URL,则中止默认初始化。否则,请从URL配置log4j。 PropertyConfigurator将用于解析URL以配置log4j,除非URL以“.xml”扩展名结尾, 在哪种情况下将使用DOMConfigurator。您可以选择指定 自定义配置程序。 log4j.configuratorClass系统的值 property被视为自定义的完全限定类名 配置器。您指定的自定义配置程序必须实现 配置器界面。
醇>
因此,如果没有代码,您可以(并且应该!)定义系统属性以告知配置文件的位置。如果没有,默认情况下它将在类路径中搜索log4j.properties。这是它默认搜索的唯一文件。
系统属性通常被定义为应用(app服务器)的启动参数,类似于-Dlog4j.configuration=path/to/your/config.xml
。