65.9K
CodeProject 正在变化。 阅读更多。
Home

log4Net 日志框架

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.94/5 (13投票s)

2012年5月9日

CPOL

3分钟阅读

viewsIcon

118566

downloadIcon

6434

本文将解释如何创建一个通用的 log4net 日志框架,该框架可供 Microsoft NET Framework 的各种类型的应用程序使用。

引言   

互联网上有很多关于 log4net 的文章和示例。本文侧重于这样一个场景:您开发一个企业应用程序,该应用程序包含各种类型的 NET 应用程序(控制台、WinForm、Web、WCF、WPF、Windows 服务等),并且希望使用一个单一的 log4net 日志框架,而不是在每个应用程序中配置 log4net,导致 app/web.config 文件中存在重复的条目。

如何构建

这是附加源代码中的解决方案资源管理器视图。

Solution Explorer

除了 Log4NetLibrary 之外的所有项目都不重要,因为它们只是为了演示如何在不同类型的 NET 应用程序中使用日志框架。让我们深入研究 Log4NetLibrary 中的重要内容。

  1. 它是一个类库。
  2. 它引用了 log4net.dll v1.2.11.0,这是撰写本文时的最新版本。但是,您可以查看 log4net 的最新版本
  3. 它有一个接口 ILogService,它简单地帮助实现多种类型的日志记录。
  4. 它有一个类 FileLogService,它实现了 ILogService 并将消息写入文本文件。
  5. 它有一个 log4net.config 文件,其中包含 RollingFileAppender 配置的详细信息(大小为 5 MB,最多 5 个存档)。但是,可以在 log4net 中进行不同类型的配置,请在此处查看更多选项。

注意: 您需要将 log4net.config 文件的属性更改为始终复制,如下所示,否则日志记录将无法工作

copy always

这个类库包装了 log4net 并暴露了公共类 FileLogService,客户端将通过它调用来写入日志文件。 这个项目以其编写方式而非常灵活。 例如,您可以编写自己的类来实现接口并写入任何其他媒介,例如数据库,而不是写入文本文件。

使用代码

接口 ILogService 包装了所有 log4net 方法

public interface ILogService
{
    void Fatal(string message);
    void Error(string message);
    void Warn(string message);
    void Info(string message);
    void Debug(string message);
}

FileLogService 实现了接口。 它在静态构造函数中配置 log4net,以便代码不会为客户端的每次调用而执行。

static FileLogService()
{
    // Gets directory path of the calling application
    // RelativeSearchPath is null if the executing assembly i.e. calling assembly is a
    // stand alone exe file (Console, WinForm, etc). 
    // RelativeSearchPath is not null if the calling assembly is a web hosted application i.e. a web site
    var log4NetConfigDirectory = AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory;
    var log4NetConfigFilePath = Path.Combine(log4NetConfigDirectory, "log4net.config");
    log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(log4NetConfigFilePath));
}

注意:还有另一种在程序集范围内进行此配置的方法,通过编辑 AssemblyInfo.cs 文件,如下所示

[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
//log4net configuration
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

但是这样做会导致如下所示的构建错误,因此我选择了第一个版本(在类级别配置)。如果此方法对您有效,请使用此方法。

configuration build error

...并且构造函数接受一个 Type 参数。 因此,客户端类必须在调用方法来写入日志信息之前提供其名称。 这样,我们可以看到哪个类正在写入日志消息。

public FileLogService(Type logClass)
{
    _logger = LogManager.GetLogger(logClass);
}
public void Info(string message)
{
    if (_logger.IsInfoEnabled)
        _logger.Info(message);
}
//other methods...

客户端调用如下

public partial class Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        ILogService logService = new FileLogService(typeof(Default));
        logService.Info("Just an information from web app");
    }
}

使用 log4net 库

好的,现在库已准备就绪,我们可以使用各种类型的应用程序对其进行测试。 在此示例中,我创建了 WPF、Console、Win Form、ASP.NET 和两个类库,以便测试日志消息是否已正确写入。

您可以通过运行附加的源代码来测试这一点。 在 VS 2010 中,您可以设置多个项目来运行,因此当点击 F5 时,您会看到所有项目都在运行。

设置多个启动项目:

multiple startup

它们正在运行:

on run

最后,日志文件显示:

log file

关注点

在本文中,我没有提供您以前不知道的任何新内容,但我很高兴能够帮助您实现可扩展的日志框架。 我使用了用于 NET Framework 4.0 的 log4net 版本,但这并不意味着它只能在 Net Framework 4.0 上工作。 对于其他版本的 Net Framework,您可以使用以前版本的 log4net。

其他有用链接

log4net 教程

http://www.mikebevers.be/blog/2010/09/logging-framework-with-log4net/

历史

  1. 2012 年 5 月 9 日的初始版本
© . All rights reserved.