Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set log4j property file?

Tags:

java

log4j

I have an Eclipse Java Project which uses log4j. I can't set the log4j configuration file to be accessed by file path. I have to export and run the project in a jar.

Here is how i trying:

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());
  }
}

System out prints the C:\Users\roncsak\eclipse_workspace\WITA\resources\log4j.xml which is good. WITA is the base folder of the project. But running the project with -Dlog4j.debug argument the following returns also:

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].

I would like to change the log4j.xml over time, without building another jar file. How can I do that?

like image 521
roncsak Avatar asked Sep 25 '12 08:09

roncsak


People also ask

Where do I put log4j properties file?

The file is named log4j. properties and is located in the $DGRAPH_HOME/dgraph-hdfs-agent/lib directory. The file defines the ROLLINGFILE appenders for the root logger and also sets the log level for the file. The level of the root logger is defined as INFO and attaches the ROLLINGFILE appender to it.

How do you set log file path in log4j properties dynamically?

System. setProperty("{my. log", "C:/logfile. log");


2 Answers

From "Default Initialization Procedure" at http://logging.apache.org/log4j/1.2/manual.html:

  • Set the resource string variable to the value of the log4j.configuration system property. The preferred way to specify the default initialization file is through the log4j.configuration system property. In case the system property log4j.configuration is not defined, then set the string variable resource to its default value "log4j.properties".
  • Attempt to convert the resource variable to a URL.
  • If the resource variable cannot be converted to a URL, for example due to a MalformedURLException, then search for the resource from the classpath by calling org.apache.log4j.helpers.Loader.getResource(resource, Logger.class) which returns a URL. Note that the string "log4j.properties" constitutes a malformed URL. See Loader.getResource(java.lang.String) for the list of searched locations.

So you need to prepend file: to log4j.configuration property value in order that it can be treated as URL.

See https://stackoverflow.com/a/7927278/603516.

Even better code:

    System.setProperty("log4j.configuration", new File("resources", "log4j.xml").toURL());
like image 103
Vadzim Avatar answered Sep 29 '22 18:09

Vadzim


You can set VM argument : -Dlog4j.configuration='path_to_log4j.xml'

or programatically :

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>);   
}
like image 42
yodamad Avatar answered Sep 29 '22 17:09

yodamad