log4Net 日志框架
本文将解释如何创建一个通用的 log4net 日志框架,该框架可供 Microsoft NET Framework 的各种类型的应用程序使用。
引言
互联网上有很多关于 log4net 的文章和示例。本文侧重于这样一个场景:您开发一个企业应用程序,该应用程序包含各种类型的 NET 应用程序(控制台、WinForm、Web、WCF、WPF、Windows 服务等),并且希望使用一个单一的 log4net 日志框架,而不是在每个应用程序中配置 log4net,导致 app/web.config 文件中存在重复的条目。如何构建
这是附加源代码中的解决方案资源管理器视图。
除了 Log4NetLibrary 之外的所有项目都不重要,因为它们只是为了演示如何在不同类型的 NET 应用程序中使用日志框架。让我们深入研究 Log4NetLibrary 中的重要内容。
- 它是一个类库。
- 它引用了 log4net.dll v1.2.11.0,这是撰写本文时的最新版本。但是,您可以查看 log4net 的最新版本。
- 它有一个接口 ILogService,它简单地帮助实现多种类型的日志记录。
- 它有一个类 FileLogService,它实现了 ILogService 并将消息写入文本文件。
- 它有一个 log4net.config 文件,其中包含 RollingFileAppender 配置的详细信息(大小为 5 MB,最多 5 个存档)。但是,可以在 log4net 中进行不同类型的配置,请在此处查看更多选项。
注意: 您需要将 log4net.config 文件的属性更改为始终复制,如下所示,否则日志记录将无法工作
这个类库包装了 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)]
但是这样做会导致如下所示的构建错误,因此我选择了第一个版本(在类级别配置)。如果此方法对您有效,请使用此方法。
...并且构造函数接受一个 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 时,您会看到所有项目都在运行。
设置多个启动项目:
它们正在运行:
最后,日志文件显示:
关注点
在本文中,我没有提供您以前不知道的任何新内容,但我很高兴能够帮助您实现可扩展的日志框架。 我使用了用于 NET Framework 4.0 的 log4net 版本,但这并不意味着它只能在 Net Framework 4.0 上工作。 对于其他版本的 Net Framework,您可以使用以前版本的 log4net。
其他有用链接
http://www.mikebevers.be/blog/2010/09/logging-framework-with-log4net/
历史
- 2012 年 5 月 9 日的初始版本