Java 如何设置log4j属性文件?

Java 如何设置log4j属性文件?,java,log4j,Java,Log4j,我有一个使用log4j的eclipsejava项目。我无法将log4j配置文件设置为通过文件路径访问。我必须导出并在jar中运行项目 以下是我如何尝试的: public class Wita { static Logger logger; public static void main(String[] args) { System.setProperty("log4j.configuration", new File("").getCanonicalPath()+File.se

我有一个使用log4j的eclipsejava项目。我无法将log4j配置文件设置为通过文件路径访问。我必须导出并在jar中运行项目

以下是我如何尝试的:

public class Wita {
  static Logger logger;
  public static void main(String[] args) {
    System.setProperty("log4j.configuration", new File("").getCanonicalPath()+File.separatorChar+"resources"+File.separatorChar+"log4j.xml" );
    // System.out.println( System.getProperty("log4j.configuration") );
    logger = Logger.getLogger(Wita.class.getName());
  }
}
系统输出打印C:\Users\roncsak\eclipse\u workspace\WITA\resources\log4j.xml,这很好。WITA是项目的基本文件夹。但使用-Dlog4j.debug参数运行项目时,也会返回以下结果:

log4j: Trying to find [C:\Users\roncsak\eclipse_workspace\WITA\resources\log4j.xml] using context classloader sun.misc.Launcher$AppClassLoader@18e3e60. log4j: Trying to find [C:\Users\roncsak\eclipse_workspace\WITA\resources\log4j.xml] using sun.misc.Launcher$AppClassLoader@18e3e60 class loader. log4j: Trying to find [C:\Users\roncsak\eclipse_workspace\WITA\resources\log4j.xml] using ClassLoader.getSystemResource(). log4j: Could not find resource: [C:\Users\roncsak\eclipse_workspace\WITA\resources\log4j.xml]. log4j:尝试使用上下文类加载器sun.misc.Launcher查找[C:\Users\roncsak\eclipse\u workspace\WITA\resources\log4j.xml]$AppClassLoader@18e3e60. log4j:尝试使用sun.misc.Launcher查找[C:\Users\roncsak\eclipse\u workspace\WITA\resources\log4j.xml]$AppClassLoader@18e3e60类加载器。 log4j:尝试使用ClassLoader.getSystemResource()查找[C:\Users\roncsak\eclipse\u workspace\WITA\resources\log4j.xml]。 log4j:找不到资源:[C:\Users\roncsak\eclipse\u workspace\WITA\resources\log4j.xml]。
我希望随着时间的推移更改log4j.xml,而无需构建另一个jar文件。我该怎么做?

您可以设置VM参数:
-Dlog4j.configuration='path\u to_log4j.xml'

或按程序:

String logFilePath = new File(<path_to_log4j.xml>);
if (logFilePath == null || "".equalsIgnoreCase(logFilePath)) {
    URL file = this.getClass().getResource(DEFAULT_CONF);
    DOMConfigurator.configure(file);
} else {
    DOMConfigurator.configure(<default_config_file>);   
}
String logFilePath=new File();
if(logFilePath==null | |“”.equalsIgnoreCase(logFilePath)){
URL文件=this.getClass().getResource(默认配置);
DOMConfigurator.configure(文件);
}否则{
DOMConfigurator.configure();
}
来自以下位置的“默认初始化过程”:

  • 将资源字符串变量设置为 log4j.配置系统属性。指定 默认初始化文件通过log4j.configuration系统 财产。如果系统属性log4j.configuration不是 定义,然后将字符串变量资源设置为其默认值 “log4j.属性”
  • 尝试将资源变量转换为URL
  • 如果资源变量无法转换为URL,例如,由于 创建一个畸形的DurLexException,然后从 通过调用 org.apache.log4j.helpers.Loader.getResource(resource,Logger.class) 返回一个URL。注意字符串“log4j.properties” 构成格式不正确的URL。请参阅Loader.getResource(java.lang.String) 用于搜索位置的列表
因此,您需要将
文件:
前置到
log4j.configuration
属性值,以便将其视为URL

更好的代码:

    System.setProperty("log4j.configuration", new File("resources", "log4j.xml").toURL());

所有这些答案都不令人满意,因此我在这里为将来可能需要这些答案的人发帖:

  • 您需要指定您的属性所在的位置。通过程序或命令选项都可以
  • 在程序上:

    private static void setupLog4J(){
        try {
            System.setProperty("log4j.configuration", new File(".", File.separatorChar+"log4j.properties").toURL().toString());
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
  • 创建自己的log4j.properties文件:

  • 希望这能有所帮助。

    java.io.File.tour()
    现在已经过时了。如果此方法的签名是System.setProperty(String,String),请改为使用:
    x.toURI().tour()
    它的工作原理?它不支持URL作为其值。我这样问是因为将路径作为字符串传递给setProperty对我不起作用。@DanielT.Sobrosa,您是否尝试使用答案中提到的前缀?是的,但我解决了问题。。。我犯了个错误。在初始化
    log4j.configuration
    system属性之前,我得到了一个记录器实例。现在一切正常。谢谢。来自未来的更新:log4j v2已将用于覆盖配置文件的系统属性更改为
    log4j.configurationFile
    #  Logging level
    # Root logger option
    log4j.rootLogger=DEBUG, stdout, file
    
    # Redirect log messages to console
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target=System.out
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p     %c{1}:%L - %m%n
    
    # Redirect log messages to a log file, support file rolling.
    log4j.appender.file=org.apache.log4j.RollingFileAppender
    log4j.appender.file.File=c:/project/resources/t-output/log4j-application.log
    log4j.appender.file.MaxFileSize=5MB
    log4j.appender.file.MaxBackupIndex=10
    log4j.appender.file.layout=org.apache.log4j.PatternLayout
    log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n