Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

common variable for log4j.xml configuration

Tags:

java

log4j

I have log4j.xml configuration like this:

<appender name="MyAppender"class="org.apache.log4j.DailyRollingFileAppender">   
     <param name="File"     value="/logs/custom/my.log"/>
...  
 </appender>

However the root directory of my file are the same for a lot of appender. Is there a way to defined "/logs/custom/" as a variable and reused it in all of my appender.

Thanks,

Sean

like image 671
Sean Nguyen Avatar asked Sep 30 '11 17:09

Sean Nguyen


People also ask

What is configuration status in log4j2 xml?

Configuration: the root element of a log4j2 configuration file; the status attribute represents the level at which internal log4j events should be logged. Appenders: this element contains a list of appenders; in our example, an appender corresponding to the System console is defined.

Where should log4j xml be placed?

Locate the log4j. xml file under the oarm/WEB-INF/classes/ directory. Update the log output path for each appender.


2 Answers

UPDATE: The original answer applies to Log4j 1.x

Log4j 2.x has much richer support for properties in configuration file, see the Log4j manual about Configuration with properties.

Log4j 1.x (the original answer):

The only way to achieve something similar when you are using log4j.xml is to set a system property at startup and then reference that from your log4j.xml.

At startup, you set your system property:

java -Dlog_dir=/var/logs/custom     com.yourorg.yourapp.Main

Or set it programmatically at runtime (before initializing Log4j):

System.setProperty("log_dir", "/var/logs/custom")

Then you can reference it like this:

<appender name="MyAppender"class="org.apache.log4j.DailyRollingFileAppender">   
     <param name="File" value="${log_dir}/my.log"/>
     ...  
</appender>

Or in properties file, like this:

log4j.appender.MyAppender.File = ${log_dir}/my.log

Source: I got inspiration for this answer from Using system environment variables in log4j xml configuration.

Also, if you are running under Tomcat, you can use ${catalina.home} variable, like this:

<appender name="MyAppender"class="org.apache.log4j.DailyRollingFileAppender">   
     <param name="File" value="${catalina.home}/logs/my.log"/>
     ...  
</appender>
like image 171
Neeme Praks Avatar answered Sep 19 '22 22:09

Neeme Praks


It is possible in XML as well to define a variable and reuse it in the rest of the doc:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" [
  <!ENTITY logHome "/logs/folder1/folder2">
]
>

Then, refer to this variable just defined, as &logHome;

<param name="File" value="&logHome;/folder3/my.log"/>

How about that?

(I believe I learnt about XML entity references some time ago at this link: http://www.ibm.com/developerworks/xml/library/x-tipentref/index.html)

like image 33
user185624 Avatar answered Sep 20 '22 22:09

user185624