views:

1065

answers:

4

I'm using Apache Commons Logging and SLF4J with log4j, but I also want to use the log4j.properties in a custom place like conf/log4.properties. Here is the problem:

If i use

  PropertyConfigurator.configure("conf/log4j.properties");

then my app is tied to log4j and defets the purpose of having ACL and SLF4J.

What is the best way to configure it withouth the app ever knowing what the logging implementation is?

+4  A: 

I think the easiest thing to do is specify the location of the file using the log4j.configuration system property. Adopting the example in the Log4J manual:

java -Dlog4j.configuration=conf/log4j.properties -classpath ...

I believe that Log4J will find a file named "log4j.properties" anywhere on the classpath, but may be hallucinating. Worth trying, however.

kdgregory
Actually, I had the same problem as the OP, but your solution didn't work for me. I had to specify the location of the log4j.properties file in a URL style form (-Dlog4j.configuration=file:///my/conf/log4j.properties).
Haes
A: 

As you state, by invoking PropertiesConfigurator, you are tying your application to log4j. However, the extend of this tie is quite limited. You could very easily remove the line invoking PropertiesConfigurator and recompile your code. After that is done, assuming you are using the SLF4J API for logging, you could repalce log4j with another logging framework, say logback-classic or j.u.l. just by replacing jar files. Thus, SLF4J still serves its purpose to a large extend. I would not throw the baby out with the bath water.

Ceki
A: 

You can specify config file location with VM argument -Dlog4j.configuration="file:/C:/workspace3/local/log4j.properties"

Makatun
A: 

What took you so long, Makatun? Did your answer get lost on the network? :)

Mihai Danila