log4net的使用
日志对于应用程序来说,其重要性不言无喻,在编码时,可以帮助开发人员调试程序.在应用发布以后,可以跟踪应用程序的运行情况,必要时找出错误,或帮助以后审计.然而在应用程序中插入日志需要花费很多精力.一般来说大约4%的代码是专门用来记录日志的.所以即使对于一个不大的应用软件来说,也会插入上千条日志代码.在强调可重用组件开发的今天,除了自己的从头到尾开发一个可重用的日志操作类以外,对于.net应用程序,我们可以使用apache的log4net日志操作包(对于java,则有Log4j).官方网站:http://logging.apache.org/log4net/,最新版本为1.2.10.
2.实例
log4net可以通过程序来配置,当然通过配置文件来配置会更灵活.让我们来尝试一下在一个简单的应用MyApp中使用log4net.
如下(记得先引用log4net程序集):
using log4net;
using log4net.Config;
namespace Com.Foo
{
public class MyApp
{
// Define a static logger variable so that it references the
// Logger instance named "MyApp".
private static readonly ILog log = LogManager.GetLogger(typeof(MyApp));
static void Main(string[] args)
{
// Set up a simple configuration that logs on the console.
BasicConfigurator.Configure();
log.Info("Entering application.");
Bar bar = new Bar();
bar.DoIt();
log.Info("Exiting application.");
Console.Read();
}
}
public class Bar
{
private static readonly ILog log = LogManager.GetLogger(typeof(Bar));
public void DoIt()
{
log.Debug("Did it again!");
}
}
}
3.log4net简介
3.1 Log4net的结构
log4net有四种主要的组件,分别是Logger(记录器), Repository(库), Appender(附着器)以及 Layout(布局).
3.1.1 Logger
Logger是log4net的核心组件,也是应用程序需要交互的主要组件,它代表了Log4net的日志记录器,它能够对日志信息进行分类筛选,就是决定什么日志信息应用被输出,什么日志信息应该被忽略。产生的日志消息并不直接显示,还要预先经过Layout的格式化处理后才会输出。
Log4net框架定义了一个ILog接口,所有的logger类都必须实现这个接口。如果你想实现一个自定义的logger,你必须首先实现这个接口。
ILog接口的定义如下:
public interface ILog
{
void Debug(object message);
void Info(object message);
void Warn(object message);
void Error(object message);
void Fatal(object message);
//以上的每一个方法都有一个重载的方法,用来支持异常处理。
//每一个重载方法都如下所示,有一个异常类型的附加参数。
void Debug(object message, Exception ex);
// ...
//Boolean 属性用来检查Logger的日志级别
bool isDebugEnabled;
bool isInfoEnabled;
//… 其他方法对应的Boolean属性
}
3.1.2 日志的级别
log4net采用日志级别机制,简化了控制日志的输出步骤.
Fatal():输出ERROR级别的日志信息.
Error():输出ERROR级别的日志信息.
Warn() :输出WARN级别的日志信息.
Info() :输出INFO级别的日志信息.
Debug():输出Debug级别的日志信息.
3.2 Appender(附着器)
Appender组件决定将日志信息输出到什么地方.比如控制台(Console),文件(File).
3.3 Layout(布局)
Layout组件用来决定日志的输出格式.
4.使用配置文件来使用log4net
对于开始的例子可以如下:
using System.IO;
using log4net;
using log4net.Config;
namespace Com.Foo
{
public class MyApp
{
// Define a static logger variable so that it references the
// Logger instance named "MyApp".
private static readonly ILog log = LogManager.GetLogger(typeof(MyApp));
static void Main(string[] args)
{
// Set up a simple configuration that logs on the console.
//BasicConfigurator.Configure();
XmlConfigurator.Configure(new System.IO.FileInfo("ConsoleApplication1.exe.config"));
log.Info("Entering application.");
Bar bar = new Bar();
bar.DoIt();
log.Info("Exiting application.");
Console.Read();
}
}
public class Bar
{
private static readonly ILog log = LogManager.GetLogger(typeof(Bar));
public void DoIt()
{
log.Debug("Did it again!");
}
}
}
相应的配置文件如下:
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<!--log4net配置-->
<log4net>
<!-- A1 is set to be a ConsoleAppender -->
<appender name="A1" type="log4net.Appender.ConsoleAppender">
<!-- A1 uses PatternLayout -->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-4timestamp [%thread] %-5level %logger %ndc - %message%newline" />
</layout>
</appender>
<!-- Set root logger level to DEBUG and its only appender to A1 -->
<root>
<level value="DEBUG" />
<appender-ref ref="A1" />
</root>
</log4net>
</configuration>
详细解释请参照:
http://logging.apache.org/log4net/release/manual/configuration.html