Hi!

We are using the DatedFileAppender for writing webcontrolling information, 
these informations have to be moved from the windows application servers once a 
day to other systems.
Up to now we did shut down the Tomcat for maintenance and moved the files 
during this downtime, but now we want to minimize the downtime, so we won't 
shut down the servers.

The problem that now occurs was already discussed on this list in 2002, the 
DatedFileAppender (and all other Appenders that do "roll" in one way or other) 
will only roll when an event is logged after the given time (or size) for that 
it is configured.
Until this happens, the file will be kept locked.
This leads to the problem, that if no event is logged for e.g. 2 days you would 
find a file on the system that has a date in it that's 2 days old but still 
active.
This problem was already discussed on this list some time ago with the solution 
that people just should force the logging of an event. This is not possible for 
our purpose.

To do a quick fix to our problem I changed the 
DatedFileAppender.setFile(DatedFile, boolean) method to start a thread that 
triggers the rolling at midnight:
====
        public void setFile(DatedFile datedFile, boolean append) throws 
IOException {
                Calendar now = Calendar.getInstance();
                String datedFilename = datedFile.getDatedFilename(now);
                setFile(datedFilename, append, false, 0);
                nextMidnight = datedFile.nextFilenameChange(now);
                
>               Thread kb = new Thread(new DatedFileRoller(nextMidnight, this));
>               kb.start();
                
                LogLog.debug("Opened " + datedFilename);
                LogLog.debug("Next rollover: " + new Date(nextMidnight));
        }
===
and added a method to access the value of nextMidnight and the datedFile from 
outside:
===
        /**
         * @return Returns the datedFile.
         */
        protected DatedFile getDatedFile() {
                return datedFile;
        }
        
        /**
         * @return Returns the nextMidnight.
         */
        protected long getNextMidnight() {
                return nextMidnight;
        }
===

The new class DatedFileRoller just waits till midnight and calls setFile of the 
DatedFileAppender:

=================
        public DatedFileRoller(long millies, DatedFileAppender appender) {
                this.millies = millies;
                this.dfa = appender;
        }

        public void run() {
                Thread t = Thread.currentThread();
                t.setPriority(Thread.MIN_PRIORITY);
                try {
                        // Warten bis Mitternacht
                        Thread.sleep(Math.abs(millies - 
System.currentTimeMillis()));
                } catch (InterruptedException e) {
                        logger.error(e);
                }
                if (dfa != null) {
                        if (dfa.getNextMidnight() == millies) {
                                // Still same midnight? perhaps it was already 
rolled by event?
                                try {
                                        dfa.setFile(dfa.getDatedFile(), 
dfa.fileAppend);
                                } catch (IOException e1) {
                                        logger.error(e1);
                                }
                        }
                }
=================

Someone else here suggested the Usage of a Timer instead, to prevent locks:

=================
                final Timer timer = new Timer();
                timer.schedule(new TimerTask(){
                   public void run(){
                        
                        //roll here

                        timer.cancel();
                 }}, Math.abs(millies - System.currentTimeMillis()));
=================

Did anyone else find a solutin for this problem? 
I'd prefer a solution that is already tested and published (and maybe in the 
cvs at some time in the future) over someting that I wrote/modified myself.

Thanks, 
G.Horstmann

---
> AXA Service AG
> GERO HORSTMANN
> SOFTWAREENTWICKLER ISDM-BCC
> Colonia-Allee 10-20; D-51067 K�ln
> Telefon:+49 (0)221 / 148 - 21 7 84
> Telefax:+49 (0)221 / 148 - 44 21 7 84
> E-Mail: [EMAIL PROTECTED]



------------------------------------------------------------------------------
Aus Rechts- und Sicherheitsgruenden ist die in dieser E-Mail gegebene 
Information nicht rechtsverbindlich. Eine rechtsverbindliche Bestaetigung 
reichen wir Ihnen gerne auf Anforderung in schriftlicher Form nach. Beachten 
Sie bitte, dass jede Form der unautorisierten Nutzung, Veroeffentlichung, 
Vervielfaeltigung oder Weitergabe des Inhalts dieser E-Mail nicht gestattet 
ist. Diese Nachricht  ist ausschliesslich fuer den bezeichneten Adressaten oder 
dessen Vertreter bestimmt. Sollten Sie nicht der vorgesehene Adressat dieser 
E-Mail oder dessen Vertreter sein, so bitten wir Sie, sich mit dem Absender der 
E-Mail in Verbindung zu setzen.
----------------------------
For legal and security reasons the information provided in this e-mail is not 
legally binding. Upon request we would be pleased to provide you with a legally 
binding confirmation in written form. Any form of unauthorised use, 
publication, reproduction, copying or disclosure of the content of this e-mail 
is not permitted. This message is exclusively for the person addressed or their 
representative. If you are not the intended recipient of this message and its 
contents, please notify the sender immediately.

==============================================================================


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to