Mercurial > projects > ldc
diff tango/tango/util/log/Appender.d @ 132:1700239cab2e trunk
[svn r136] MAJOR UNSTABLE UPDATE!!!
Initial commit after moving to Tango instead of Phobos.
Lots of bugfixes...
This build is not suitable for most things.
author | lindquist |
---|---|
date | Fri, 11 Jan 2008 17:57:40 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tango/tango/util/log/Appender.d Fri Jan 11 17:57:40 2008 +0100 @@ -0,0 +1,159 @@ +/******************************************************************************* + + copyright: Copyright (c) 2004 Kris Bell. All rights reserved + + license: BSD style: $(LICENSE) + + version: Initial release: May 2004 + + author: Kris + +*******************************************************************************/ + +module tango.util.log.Appender; + +public import tango.core.Exception; + +public import tango.util.log.Event, + tango.util.log.EventLayout; + +/******************************************************************************* + + Base class for all Appenders. These objects are responsible for + emitting messages sent to a particular logger. There may be more + than one appender attached to any logger. The actual message is + constructed by another class known as an EventLayout. + +*******************************************************************************/ + +public class Appender +{ + typedef int Mask; + + private Appender next; + private EventLayout layout; + + /*********************************************************************** + + Return the mask used to identify this Appender. The mask + is used to figure out whether an appender has already been + invoked for a particular logger. + + ***********************************************************************/ + + abstract Mask getMask (); + + /*********************************************************************** + + Return the name of this Appender. + + ***********************************************************************/ + + abstract char[] getName (); + + /*********************************************************************** + + Append a message to the output. + + ***********************************************************************/ + + abstract void append (Event event); + + /*********************************************************************** + + Create an Appender and default its layout to SimpleLayout. + + ***********************************************************************/ + + this () + { + layout = new SimpleLayout; + } + + /*********************************************************************** + + Static method to return a mask for identifying the Appender. + Each Appender class should have a unique fingerprint so that + we can figure out which ones have been invoked for a given + event. A bitmask is a simple an efficient way to do that. + + ***********************************************************************/ + + protected Mask register (char[] tag) + { + static Mask mask = 1; + static Mask[char[]] registry; + + Mask* p = tag in registry; + if (p) + return *p; + else + { + auto ret = mask; + registry [tag] = mask; + + if (mask < 0) + throw new IllegalArgumentException ("too many unique registrations"); + + mask <<= 1; + return ret; + } + } + + /*********************************************************************** + + Set the current layout to be that of the argument. + + ***********************************************************************/ + + void setLayout (EventLayout layout) + { + if (layout) + this.layout = layout; + } + + /*********************************************************************** + + Return the current Layout + + ***********************************************************************/ + + EventLayout getLayout () + { + return layout; + } + + /*********************************************************************** + + Attach another appender to this one + + ***********************************************************************/ + + void setNext (Appender next) + { + this.next = next; + } + + /*********************************************************************** + + Return the next appender in the list + + ***********************************************************************/ + + Appender getNext () + { + return next; + } + + /*********************************************************************** + + Close this appender. This would be used for file, sockets, + and such like. + + ***********************************************************************/ + + void close () + { + } +} +