Log statements are sent to a Logger which in turn writes to one or more
Appenders. First you must get a Logger. Most people use the class name
as the name of the logger:

 namespace Company.Project
 {
  public class Foo
  {
    ILog log = LogManager.GetLogger(typeof(Foo));
    
    public void TestMethod()
    {
     log.Debug("Hello World");
    }
  }
 }

Then in your log4net file you decide what Appenders the Logger should
write to. The text below will write output to the MyFileAppender
Appender:

 <logger name="Company.Project.Foo">
  <appender-ref ref="MyFileAppender" />
 </logger>

MyFileAppender is defined as:

 <appender name="MyFileAppender" type="log4net.Appender.FileAppender">
  <file value="c:\log.txt">
  <appendToFile value="false" />
  <layout type="log4net.Layout.SimpleLayout" />
 </appender>

You should see the following line in your output file:

 DEBUG - Hello World

People usually include much more information in their log entries. For
example, this is what I use for a FileAppenders:

 <appender name="MyFileAppender" type="log4net.Appender.FileAppender">
  <file value="c:\log.txt">
  <appendToFile value="false" />
  <layout type="log4net.Layout.PatternLayout,log4net">
   <conversionPattern value="%5p %d{yyyy-MM-dd hh:mm:ss tt} (%c:%L) -
%m%n" />
  </layout>
 </appender>

That conversionPattern will record a log statement with information
such as the log level, time of the log event, the class, the line
number where the log originated from, and my message:

 INFO 2005-06-02 05:53:55 PM (Company.Project.Global:85) - Application
started

A very common error when people first start using log4net is that they
have not made the destination directory for log files writtable.

The <logger> node I used above will only snag log messages generated by
the Company.Project.Foo class. If you want to log message from other
classes or from Loggers that weren't created from classes:

 ILog auditLog = LogManager.GetLog("AUDIT");

You can use the more general root logger:

 <root>
  <appender-ref ref="MyFileAppender" />
 </root>

Every log4net config file requires there be a root logger. You may
define additional <logger> nodes as necessary. The example below will
write logs belonging to the "AUDIT" Logger to one destination and logs
belonging to Company.Project.Foo to another destination.

 <!-- required -->
 <root>
  <appender-ref ref="AuditFileAppender" />
 </root>

 <!-- optional -->
 <logger name="Company.Project.Foo">
  <appender-ref ref="MyFileAppender" />
 </logger>

Its also possible to write the output from a Logger to more than one
destination:

 <root>
  <appender-ref ref="MyFileAppender" />
 </root>

 <logger name="AUDIT">
  <appender-ref ref="MyEmailAppender" />
  <appender-ref ref="DatabaseAppender" />
 </logger>

Suppose I have other classes in the Company.Project namespace: Bar,
Baz, and Boo. I can use this syntax to capture log statements from all
4 classes:

 <logger name="Company.Project">
  <appender-ref ref="MyFileAppender" />
 </logger>

To answer your second question, you can store additional pieces of
information that you want to appear on the log messages by using the
ThreadContext:

 log4net.ThreadContext.Properties["UserId"] = userId;
 log4net.ThreadContext.Properties["WindowsVersion"] = windowsVersion;

 log.Debug("Hello World");
 log.Debug("World Hello");

To reference these values in your appender you would do this:

 <appender name="MyFileAppender" type="log4net.Appender.FileAppender">
  <file value="c:\log.txt">
  <appendToFile value="false" />
  <layout type="log4net.Layout.PatternLayout,log4net">
   <conversionPattern value="%p %d %property{UserId} - %m%n" />
  </layout>
 </appender>

Log4net already comes with many pre-defined patterns:

http://tinyurl.com/e3nd3
http://logging.apache.org/log4net/release/sdk/log4net.Layout.PatternLayout.html

Its easy to define custom patterns:

 <conversionPattern value="%p %d %querystring{ProductId} - %m%n" />
 <conversionPattern value="%p %d %foo{Bar} - %m%n" />
 <conversionPattern value="%p %d %minutes-till-lunch - %m%n" />

How do you intend to "flag" your message when you write it to the
Logger?

 log.DebugFormat("This message is flagged: {0}", ???);

Its possible to add new log levels to log4net:

 log.Flag("This is a special message.");

You could setup a special Appender that only records "flagged"
messages.

All of the above examples involving xml could be translated to code.
Its possible to deploy log4net without a config file.

--- Weston Weems <[EMAIL PROTECTED]> wrote:

> I've just begun to play with log4net after trying endlessly to get
> Enterprise Library working as I'd like it.
> 
> I do have a few questions I was unable to find the answers for on my
> own (reading documentation/manual on logging.apache.org)
> 
> this is all .net 1.1 and using 1.9b or whatever the latest build was.
> 
> 1) is there a way to explicitly from code tell my log entry to use a
> specific appender?
> 
> 2) For adoappender, is there way to provide more properties of a log
> entry, and log that into more columns etc? Eg, if I wanted to include
> username, version of windows etc.
> 
> 3) from config file, is there somethinga little more finegrained for
> routing error messages than levels and string matches? I'd like to be
> able to "flag" an error message and if the config permits, have it
> processed with a specific appender. (I realize I could use the filter
> and filter on a string I throw in there, just seems cumbersome)
> 
> 
> Anyway thank you guys very much
> Weston Weems
> 

Reply via email to