Green Root
Green Root

Reputation: 704

log4j custom configuration

I faced following situation: we have an application which uses standard Apache log4j facility for logging. It contains two classes (lets name them A & B).

A.java:

package TestLog4j;

import org.apache.log4j.Logger;

public class A {
    private static Logger logger = Logger.getLogger(A.class);

    public static void main(String[] args) {
        logger.info("This is A");
    }
}

B.java:

package TestLog4j;

import org.apache.log4j.Logger;

public class B {
    private static Logger logger = Logger.getLogger(B.class);

    public static void main(String[] args) {
        logger.info("This is B");
    }
}

My log4j.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="true">

  <appender name="fileAppender" class="org.apache.log4j.RollingFileAppender">
    <param name="File" value="${app_log_dir}/${process_name}.log" />
    <param name="maxBackupIndex" value="1" />
    <param name="maxFileSize" value="50MB" />
    <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%d{DATE}] %5p %c{1} - %m%n" /> </layout>
  </appender>

  <logger name="TestLog4j.B">
    <level value="info"/>
    <appender-ref ref="fileAppender" />
  </logger>

  <root>
    <level value="${log4j_loglevel}"></level>
    <appender-ref ref="fileAppender" />
  </root>

</log4j:configuration>

log4j.properties:

app_log_dir=C:\Work\Java\log4j
log4j_loglevel=INFO

log4j.properties.custom

process_name=custom.log

Both classes are in the same jar: TestLog4j.jar

I am trying to run both classes using following command:

java -Druntime_dir=. -Dlog4j.custom.properties=log4j.properties,log4j.properties.custom -cp .;TestLog4j.jar;log4j-1.2.15.jar TestLog4j.B (or A)

Output for A is:

INFO: This is A

Output for B is:

log4j:ERROR setFile(null,true) call failed. java.io.FileNotFoundException: .log (Access is denied) at java.io.FileOutputStream.openAppend(Native Method) at java.io.FileOutputStream.(Unknown Source) at java.io.FileOutputStream.(Unknown Source) at org.apache.log4j.FileAppender.setFile(FileAppender.java:290) at org.apache.log4j.RollingFileAppender.setFile(RollingFileAppender.java:194) at org.apache.log4j.FileAppender.activateOptions(FileAppender.java:164) at org.apache.log4j.config.PropertySetter.activate(PropertySetter.java:257) at org.apache.log4j.xml.DOMConfigurator.parseAppender(DOMConfigurator.java:285) at org.apache.log4j.xml.DOMConfigurator.findAppenderByName(DOMConfigurator.java:171) at org.apache.log4j.xml.DOMConfigurator.findAppenderByReference(DOMConfigurator.java:184) at org.apache.log4j.xml.DOMConfigurator.parseChildrenOfLoggerElement(DOMConfigurator.java:502) at org.apache.log4j.xml.DOMConfigurator.parseCategory(DOMConfigurator.java:415) at org.apache.log4j.xml.DOMConfigurator.parse(DOMConfigurator.java:919) at org.apache.log4j.xml.DOMConfigurator.doConfigure(DOMConfigurator.java:790) at org.apache.log4j.xml.DOMConfigurator.doConfigure(DOMConfigurator.java:696) at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:471) at org.apache.log4j.LogManager.(LogManager.java:125) at org.apache.log4j.Logger.getLogger(Logger.java:118) at TestLog4j.B.(B.java:6)

It seems that log4j does not recognize -Dlog4j.custom.properties for second class. Why this happens?

Upvotes: 0

Views: 1447

Answers (2)

Green Root
Green Root

Reputation: 704

Problem is resolved. I've added the parsing of log4j.custom.properties property and everything went fine.

Upvotes: 1

SSharma
SSharma

Reputation: 144

Are you sure INFO: This is A is displayed? From above log4j_loglevel=ERROR for root (that would include TestLog4j.A)

Since you have given level as ERROR, my understanding is that it would ignore logger.info("This is A");

So there is possibility that its not even finding log4j.properties.

Upvotes: 0

Related Questions