diff tango/tango/util/log/Logger.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/Logger.d	Fri Jan 11 17:57:40 2008 +0100
@@ -0,0 +1,254 @@
+/*******************************************************************************
+
+        copyright:      Copyright (c) 2004 Kris Bell. All rights reserved
+
+        license:        BSD style: $(LICENSE)
+      
+        version:        May 2004: Initial release
+        version:        Feb 2007: Switched to lazy expr
+        
+        author:         Kris
+
+*******************************************************************************/
+
+module tango.util.log.Logger;
+
+private import tango.time.Time;
+
+private import tango.util.log.Appender;
+
+private import tango.util.log.model.ILevel;
+
+/*******************************************************************************
+
+        Loggers are named entities, sometimes shared, sometimes specific to 
+        a particular portion of code. The names are generally hierarchical in 
+        nature, using dot notation (with '.') to separate each named section. 
+        For example, a typical name might be something like "mail.send.writer"
+        ---
+        import tango.util.log.Log;
+        
+        auto log = Log.getLogger ("mail.send.writer");
+
+        log.info  ("an informational message");
+        log.error ("an exception message: " ~ exception.toString);
+
+        etc ...
+        ---
+        
+        It is considered good form to pass a logger instance as a function or 
+        class-ctor argument, or to assign a new logger instance during static 
+        class construction. For example: if it were considered appropriate to 
+        have one logger instance per class, each might be constructed like so:
+        ---
+        private Logger log;
+        
+        static this()
+        {
+            log = Log.getLogger (nameOfThisClassOrStructOrModule);
+        }
+        ---
+
+        Messages passed to a Logger are assumed to be pre-formatted. You 
+        may find that the format() methos is handy for collating various 
+        components of the message: 
+        ---
+        char tmp[128] = void;
+        ...
+        log.warn (log.format (tmp, "temperature is {} degrees!", 101));
+        ---
+
+        Note that a provided workspace is used to format the message, which 
+        should generally be located on the stack so as to support multiple
+        threads of execution. In the example above we indicate assignment as 
+        "tmp = void", although this is an optional attribute (see the language 
+        manual for more information).
+
+        To avoid overhead when constructing formatted messages, the logging
+        system employs lazy expressions such that the message is not constructed
+        unless the logger is actually active. You can also explicitly check to
+        see whether a logger is active or not:
+        ---
+        if (log.isEnabled (log.Level.Warn))
+            log.warn (log.format (tmp, "temperature is {} degrees!", 101));
+        ---
+
+        You might optionally configure various layout & appender implementations
+        to support specific exact rendering needs.
+        
+        tango.log closely follows both the API and the behaviour as documented 
+        at the official Log4J site, where you'll find a good tutorial. Those 
+        pages are hosted over 
+        <A HREF="http://logging.apache.org/log4j/docs/documentation.html">here</A>.
+
+*******************************************************************************/
+
+public class Logger : ILevel
+{
+        /***********************************************************************
+
+                Add a trace message. This is called 'debug' in Log4J but
+                that is a  reserved word in the D language
+                
+        ***********************************************************************/
+
+        abstract Logger trace (lazy char[] exp);
+
+        /***********************************************************************
+                
+                Add an info message
+
+        ***********************************************************************/
+
+        abstract Logger info (lazy char[] exp);
+
+        /***********************************************************************
+
+                Add a warning message
+
+        ***********************************************************************/
+
+        abstract Logger warn (lazy char[] exp);
+
+        /***********************************************************************
+
+                Add an error message
+
+        ***********************************************************************/
+
+        abstract Logger error (lazy char[] exp);
+
+        /***********************************************************************
+
+                Add a fatal message
+
+        ***********************************************************************/
+
+        abstract Logger fatal (lazy char[] exp);
+
+        /***********************************************************************
+        
+                Append a message to this logger via its appender list.
+
+        ***********************************************************************/
+
+        abstract Logger append (Level level, lazy char[] exp);
+
+        /***********************************************************************
+
+                Format text using the formatter configured in the associated
+                hierarchy (see Hierarchy.setFormat)
+
+        ***********************************************************************/
+
+        abstract char[] format (char[] buffer, char[] formatStr, ...);
+
+        /***********************************************************************
+        
+                Return the name of this Logger
+
+        ***********************************************************************/
+
+        abstract char[] name ();
+
+        /***********************************************************************
+
+                Return the current level assigned to this logger
+
+        ***********************************************************************/
+
+        abstract Level level ();
+
+        /***********************************************************************
+
+                Set the activity level of this logger. Levels control how
+                much information is emitted during runtime, and relate to
+                each other as follows:
+                ---
+                    Trace < Info < Warn < Error < Fatal < None
+                ---
+                That is, if the level is set to Error, only calls to the
+                error() and fatal() methods will actually produce output:
+                all others will be inhibited.
+
+                Note that Log4J is a hierarchical environment, and each
+                logger defaults to inheriting a level from its parent.
+
+
+        ***********************************************************************/
+
+        abstract Logger setLevel (Level level = Level.Trace);
+
+        /***********************************************************************
+        
+                same as setLevel (Level), but with additional control over 
+                whether the children are forced to accept the changed level
+                or not. If 'force' is false, then children adopt the parent
+                level only if they have their own level set to Level.None
+
+        ***********************************************************************/
+
+        abstract Logger setLevel (Level level, bool force);
+
+        /***********************************************************************
+        
+                Is this logger enabled for the provided level?
+
+        ***********************************************************************/
+
+        abstract bool isEnabled (Level level = Level.Fatal);
+
+        /***********************************************************************
+
+                Return whether this logger uses additive appenders or not. 
+                See setAdditive().
+
+        ***********************************************************************/
+
+        abstract bool isAdditive ();
+
+        /***********************************************************************
+
+                Specify whether or not this logger has additive behaviour.
+                This is enabled by default, and causes a logger to invoke
+                all appenders within its ancestry (until an ancestor is
+                found with an additive attribute of false).
+
+        ***********************************************************************/
+
+        abstract Logger setAdditive (bool enabled);
+
+        /***********************************************************************
+
+                Add an appender to this logger. You may add multiple
+                appenders to appropriate loggers, and each of them 
+                will be invoked for that given logger, and for each
+                of its child loggers (assuming isAdditive() is true
+                for those children). Note that multiple instances
+                of the same appender, regardless of where they may
+                reside within the tree, are not invoked at runtime.
+                That is, only one from a set of identical loggers 
+                will execute.
+
+                Use clearAppenders() to remove all from a given logger.
+                        
+        ***********************************************************************/
+
+        abstract Logger addAppender (Appender appender);
+
+        /***********************************************************************
+        
+                Remove all appenders from this logger.
+
+        ***********************************************************************/
+
+        abstract Logger clearAppenders ();
+
+        /***********************************************************************
+        
+                Get number of milliseconds since this application started
+
+        ***********************************************************************/
+
+        abstract TimeSpan runtime ();
+}