Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Log4j:从它自身初始化的位置_Java_Log4j - Fatal编程技术网

Java Log4j:从它自身初始化的位置

Java Log4j:从它自身初始化的位置,java,log4j,Java,Log4j,我们将Log4j 1.2.15与普通Swing应用程序捆绑在一起,并在启动时从文件系统加载我们自己的属性文件: import org.apache.log4j.*; ... System.setProperty("log4j.defaultInitOverride", "true"); ... File log4jPropertiesFile = ... PropertyConfigurator.configure(log4jPropertiesFile.getAbsolutePath());

我们将Log4j 1.2.15与普通Swing应用程序捆绑在一起,并在启动时从文件系统加载我们自己的属性文件:

import org.apache.log4j.*;

...
System.setProperty("log4j.defaultInitOverride", "true");
...
File log4jPropertiesFile = ...
PropertyConfigurator.configure(log4jPropertiesFile.getAbsolutePath());
...
在我们从客户那里获得的日志中,输出看起来不像我们在属性文件中定义的那样,我们确信只有极少数人自己编辑了该文件

如果用户机器上存在另一个可用的配置文件,Log4j是否会以某种方式覆盖我们的设置?我们如何防止使用它?

有一整段详细介绍了Log4j如何初始化自己:

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

  • 将log4j.defaultInitOverride系统属性设置为任何其他值,则“false”将导致log4j跳过默认初始化过程(此过程)
  • 将资源字符串变量设置为log4j.configuration系统属性的值。指定默认初始化文件的首选方法是通过log4j.configuration系统属性。如果未定义系统属性log4j.configuration,则将字符串变量资源设置为其默认值“log4j.properties”
  • 尝试将资源变量转换为URL
  • 如果资源变量无法转换为URL,例如由于错误的FormedUrlexception,则通过调用org.apache.log4j.helpers.Loader.getResource(resource,Logger.class)从类路径中搜索资源,返回URL。请注意,字符串“log4j.properties”构成格式错误的URL。有关搜索位置的列表,请参见Loader.getResource(java.lang.String)
  • 如果找不到URL,请中止默认初始化。否则,从URL配置log4j。PropertyConfigurator将用于解析URL以配置log4j,除非URL以“.xml”扩展名结尾,在这种情况下将使用DOMConfigurator。您可以选择指定自定义配置程序。log4j.configuratorClass系统属性的值作为自定义配置程序的完全限定类名。您指定的自定义配置器必须实现配置器接口
  • 不可否认,这令人费解。基本上,你能做的最简单的事情就是把
    log4j.properties
    放在你的应用程序的类路径上,它就会被找到。其他一切都是。。。手腕就我个人而言,我有时在我的
    main
    中显式调用
    BasicConfigurator
    类,有时配置(硬编码)文件中可能出现的某些内容。。。不管我的处境如何。您可以完全以编程方式初始化log4j,这会使配置文件的问题变得毫无意义。尽管这也会使您的配置变得不那么灵活。

    有一整段详细介绍了Log4j如何初始化自己:

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

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

  • 不可否认,这令人费解。基本上,你能做的最简单的事情就是把
    log4j.properties
    放在你的应用程序的类路径上,它就会被找到。其他一切都是。。。手腕就我个人而言,我有时在我的
    main
    中显式调用
    BasicConfigurator
    类,有时配置(硬编码)文件中可能出现的某些内容。。。不管我的处境如何。您可以完全以编程方式初始化log4j,这会使配置文件的问题变得毫无意义。尽管这也会使您的配置完全不那么灵活。

    您是舒尔,有一个PropertyConfigurator.configure(文件)方法吗?log4j1.2.16api中没有任何内容…@PeterMmm:我只是在注意到你的评论之前,偶然发现了这个差异。我查看的文档是针对1.2.16的,因此它离OP不远,不应该看到如此剧烈的API更改。这里有些不对劲;我向OP寻求解释。你们都是对的,我上面的代码示例是错误的。我们使用的是绝对文件路径,而不是文件实例。我已经纠正了。您是舒尔。有一个PropertyConfiguration。配置(文件)方法吗?log4j1.2.16api中没有任何内容…@PeterMmm:我只是在注意到你的评论之前,偶然发现了这个差异。我看的是1.2.16版的文件,所以离