我正在我正在开发的开源库中实现日志记录支持.大多数第三方库似乎明确选择了"首选"日志库,如Log4Net或NLog等,然后要求其库的消费者"处理它".值得庆幸的是,我们有一个像Common.Logging这样的库,可以在我们的消费应用程序中解决这个问题,这些应用程序统一了这些第三方库日志记录实现.
我打算尝试避免从我自己的开源库引用另一个第三方库,以避免将另一个程序集引用引入其他人的应用程序.也许这不是一个问题,我应该停在那里?
假设有些人认为过多的程序集引用令人讨厌(并且因为有人会提到它),我个人认为,我不喜欢在这种情况下使用ILMerge,因为你可能很容易有几个使用Log4Net的库,如果它们各自ILMerged在程序集中,在我看来,它只是膨胀了应用程序的大小.
为此,我正在考虑实现和公开一个LogBridge,以便我的库的用户可以根据需要挂钩我的日志记录调用(默认情况下会关闭).另外,请允许我强调,我不是在讨论实现自己的日志记录框架,只是确保在有人关注它的情况下公开日志记录.我认为消费实现会出现类似于:
public class SomeSetupClass
{
private void SomeSetupMethod()
{
var log = LogManager.GetLogger("LogSourceName");
var logBridge = new LogBridge()
{
DebugEnabled = log.IsDebugEnabled,
InformationEnabled = log.IsInfoEnabled,
WarningEnabled = log.IsWarnEnabled,
ErrorEnabled = log.IsErrorEnabled,
CriticalEnabled = log.IsFatalEnabled
};
logBridge.DebugMessageReceived += (sender, e) => log.Debug(e.Message);
logBridge.InformationMessageReceived += (sender, e) => log.Info(e.Message);
logBridge.WarningMessageReceived += (sender, e) => log.Warn(e.Message);
logBridge.ErrorMessageReceived += (sender, e) => log.Error(e.Message);
logBridge.CrticalMessageReceived += (sender, e) => log.Fatal(e.Message); }
}
}
Run Code Online (Sandbox Code Playgroud)
这种方法有意义吗?在度假太久之后,我是不是在想这个,我应该参考Log4Net或NLog等,并完成它?我错过了这种方法的主要缺点吗?粗糙的API有意义吗?
一如既往,好奇每个人的想法......
更新
好奇,如果人们认为jgauffin解决方案是更好的方法吗?在这篇文章之前我已经考虑过了一些事情; 我的想法是LogBridge更容易与消费者联系,而不是要求在消费项目中实现自定义界面?思考?