| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 | /******************************************************************************* copyright: Copyright (c) 2004 Kris Bell. All rights reserved license: BSD style: $(LICENSE) version: Initial release: May 2004 author: Kris *******************************************************************************/ module tango.util.log.AppendFile; private import tango.util.log.Log; private import tango.io.device.File; private import tango.io.stream.Buffered; private import tango.io.model.IFile, tango.io.model.IConduit; /******************************************************************************* Append log messages to a file. This basic version has no rollover support, so it just keeps on adding to the file. There is also an AppendFiles that may suit your needs. *******************************************************************************/ class AppendFile : Filer { private Mask mask_; /*********************************************************************** Create a basic FileAppender to a file with the specified path. ***********************************************************************/ this (const(char[]) fp, Appender.Layout how = null) { // Get a unique fingerprint for this instance mask_ = register (fp); // make it shareable for read auto style = File.WriteAppending; style.share = File.Share.Read; configure (new File (fp, style)); layout (how); } /*********************************************************************** Return the fingerprint for this class ***********************************************************************/ @property override final const Mask mask () { return mask_; } /*********************************************************************** Return the name of this class ***********************************************************************/ @property override final const const(char)[] name () { return this.classinfo.name; } /*********************************************************************** Append an event to the output. ***********************************************************************/ override final void append (LogEvent event) { synchronized(this) { layout.format (event, &buffer.write); buffer.append (FileConst.NewlineString) .flush(); } } } /******************************************************************************* Base class for file appenders *******************************************************************************/ class Filer : Appender { package Bout buffer; private IConduit conduit_; /*********************************************************************** Return the conduit ***********************************************************************/ @property final IConduit conduit () { return conduit_; } /*********************************************************************** Close the file associated with this Appender ***********************************************************************/ override final void close () { synchronized(this) { if (conduit_) { conduit_.detach(); conduit_ = null; } } } /*********************************************************************** Set the conduit ***********************************************************************/ package final Bout configure (IConduit conduit) { // create a new buffer upon this conduit conduit_ = conduit; return (buffer = new Bout(conduit)); } } |