Scott Ellsworth wrote:
>
> Hi, all.
>
> I have a project in which we have used log4j extensively. Our program logs
> a message on start, so there should be something in the log file pretty
> much instantly, but it appears that if the program is halted suddenly, the
> log file will be completely empty.
>
> I have tried halting it by closing the Java launcher DOS window, and I note
> that I then get an empty log file. This is true even if the program has
> been running for five or ten minutes. I am using a plain old FileAppender,
> which inherits from WriterAppender, and thus ImmediateFlush should force
> the writes to take place within seconds at most.
>
> If I do not kill the process, then the writes take place either when we
> have a few k in the log buffer, or when the process terminates
> gracefully. This is normal behavior for buffered output, but I even tried
> explicitly setting ImmediateFlush to see if that made a difference.
>
> NB - there is quite a bit of time where the program sits idle, so I know
> that the initial message is not getting swallowed by threading or something
> similarly vile.
>
> I have tried both 1.1.3 and 1.1.2.
>
> So, can anyone confirm that FileWriter is honoring the immediate flush
> requests under Windows and JDK 1.3.1?
>
> The config file is below.
>
> log4j.rootCategory=DEBUG, A_log
>
> log4j.appender.A_log=org.apache.log4j.FileAppender
> log4j.appender.A_log.Threshold=DEBUG
> log4j.appender.A_log.File=pov.log
> log4j.appender.A_log.ImmediateFlush=true
> log4j.appender.A_log.Append=false
> log4j.appender.A_log.layout=org.apache.log4j.PatternLayout
> log4j.appender.A_log.layout.ConversionPattern=%d (%r) %-5p %-30c{2} - %m\n
>
> log4j.category.com.isisph.bioinfo.general.POV=DEBUG
> Scott Ellsworth
> [EMAIL PROTECTED]
>
Scott:
I observed a similar behaviour but with a different appender (a custom
RMI appender). It had to deregister with rmiregistry on shutdown. A
managed this for proper exiting of the application. However, this didn't
work when, for example, the application got killed via Ctrl-C or
something similar.
My solution to this was adding a shudown hook to my application.
Registering the shutdown hook was like
// allocate thread which runs when the Java vm gets killed.
allocateCleanupThread();
// register that thread with the runtime
Runtime runtime = java.lang.Runtime.getRuntime();
runtime.addShutdownHook( cleanupThread );
Where's the best place to put this? The main() or the constructor of the
class holding the resource?
I have an attribute as follows:
CleanupThread cleanupThread;
which is defined as follows (as an inner class):
class CleanupThread extends Thread
{
public void run() {
cleanupResources();
}
}
The method allocateCleanupThread() may look as follows:
public void allocateCleanupThread () {
if( cleanupThread == null ) {
cleanupThread = new CleanupThread();
//System.out.println( "cleanupThread has been created." );
}
}
As said above, I used it to deregister from rmiregistry on sudden Java
virtual machine shutdown via Ctrl-C. But maybe you can use such a thing
also to flush streams or do other resource cleanups.
HTH
Regards
Claus Wagner
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]