LOG4J - how to control log file name?

Posted on 2010-09-11
Last Modified: 2012-05-10

My Java application create a number of instances of the same application (let say - executor).
But I need that different instances of the same application writes different log files.

Another important thing I need is - all such log files should have log filename containing the current date in a format - YYYYMMDD and ProcessID of the process which writing this log file.
So, finally I expect following files on a disk:
and so on.

Could you please give me some hints/ideas how can I do this with LOG4J (v1.2.16)?

Btw, please see the example of my enclosed.

log4j.logger.Monitor=TRACE, monitorLog, stdout

log4j.logger.Executor=TRACE, executorLog

log4j.logger.bto.utils.ThreadPool=WARN, threadPool



log4j.appender.stdout.layout.conversionPattern=%d{ABSOLUTE} %m%n




log4j.appender.monitorLog.layout.conversionPattern=%d{ABSOLUTE} %m%n




log4j.appender.executorLog.layout.conversionPattern=%d{ABSOLUTE} %m%n

Open in new window

Question by:Dmitry_Bond
  • 5
  • 2

Accepted Solution

denissie earned 500 total points
ID: 33654565

Expert Comment

ID: 33654571
LVL 20

Expert Comment

by:Sathish David Kumar N
ID: 33655952
you want to define in rootCategory...

Author Comment

ID: 33656088
Ok. I have tried to set log file name using the approach described at
But unfortunately it makes all messages on console duplicated! :-(((
But why?!
Messages in a log file are not duplicated, only in console.
Looks completely weird!
Any ideas what could be wrong with it?
How to improve team productivity

Quip adds documents, spreadsheets, and tasklists to your Slack experience
- Elevate ideas to Quip docs
- Share Quip docs in Slack
- Get notified of changes to your docs
- Available on iOS/Android/Desktop/Web
- Online/Offline


Author Comment

ID: 33656095
Btw, may you see something wrong in a code...
public static Appender findLogAppender(String pLogName, Class pLogAppenderClass)
	Logger log = Logger.getLogger(pLogName);
	Enumeration appenders = log.getAllAppenders();
	while (appenders.hasMoreElements())
		Appender currAppender = (Appender)appenders.nextElement();
		if (pLogAppenderClass.isInstance(currAppender))
			return currAppender;
	return null;

public static void setLogFilename(String pLogName)
	Object logAppender = MiscUtils.findLogAppender(pLogName, org.apache.log4j.FileAppender.class);
	if (logAppender != null)
		FileAppender fa = (FileAppender)logAppender;
		String fn = fa.getFile();			
		String fp = includeTrailing(exctractFilePath(fn), File.separatorChar);
		fn = MiscUtils.exctractFileNameNoExt(fn);
		fn = fp + fn + "-" + MiscUtils.getDateStamp('\0') + ".log";

// then init 2 loggers:
setLogFilename("Monitor"); // in main application
setLogFilename("Executor"); // in executor application

Open in new window


Author Comment

ID: 33657008
Btw, I found duplicated console messages - it was my mistake. I copied file to project folder, so Eclipse included it into a JAR. So, it seems 2 similar files (one in JAR), second in directory with JAR caused console messages duplicated. As for me it looks like a bug in LOG4J - I believe it should not take into account duplicated; assume same names and same properties for logger should not create duplicated objects.

Ok. But my question is - what can i do with the empty log files (monitor.log and executor.log) which was created on application start. Looks like LOG4J initialize and create default log files before I set log filenames. Is there any way to avoid it? I mean - standard way. Prefer to avoid coding custom functionality if possible.

Author Comment

ID: 33657883
Ok... Seems I have solved all logging problems.
Not the way I like but at least it working fine.

So, took the code from

Change the "setFile" method to

      public synchronized void setFile(String fileName, boolean append,
                  boolean bufferedIO, int bufferSize) throws IOException
            SimpleDateFormat sdf = new SimpleDateFormat(fileBackup);
            String actualFileName = sdf.format(new Date());
            actualFileName = actualFileName.replaceAll("\\$PID", MiscUtils.getPID());
            super.setFile(actualFileName, append, bufferedIO, bufferSize);

Implemented "getPID()" method as

      public static String getPID()
            String pid = ManagementFactory.getRuntimeMXBean().getName();
            int p = pid.indexOf('@');
            if (p >= 0)
                  pid = pid.substring(0, p);
            return pid;

Then split log4j.xml config file to 2 separate files - log4j-mon.xml (for monitor app) and log4j-exec.xml (for executor app).

Then adjusted command line which starts monitor application and command line which starts executor application:

java.exe -Dlog4j.configuration=log4j-mon.xml Monitor
java.exe -Dlog4j.configuration=log4j-exec.xml MonExecutor

So, seems now everything is working fine. No dummy files, no duplicated messages.

Thank you very much for help!


Author Closing Comment

ID: 33657895
After some experiments and adjustments I finally make solution working. Thanks.

Featured Post

How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

Join & Write a Comment

An old method to applying the Singleton pattern in your Java code is to check if a static instance, defined in the same class that needs to be instantiated once and only once, is null and then create a new instance; otherwise, the pre-existing insta…
For beginner Java programmers or at least those new to the Eclipse IDE, the following tutorial will show some (four) ways in which you can import your Java projects to your Eclipse workbench. Introduction While learning Java can be done with…
Viewers will learn about the different types of variables in Java and how to declare them. Decide the type of variable desired: Put the keyword corresponding to the type of variable in front of the variable name: Use the equal sign to assign a v…
Viewers will learn about basic arrays, how to declare them, and how to use them. Introduction and definition: Declare an array and cover the syntax of declaring them: Initialize every index in the created array: Example/Features of a basic arr…

746 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now