我正在开发我正在开发的开源库中的日志记录支持。大多数第三方库似乎明确选择了“首选”日志库,如Log4Net或NLog等,然后要求其库的消费者“处理它”。值得庆幸的是,我们有一个像Common.Logging这样的库来解决我们的消费应用程序中的这个问题,它统一了这些第三方库日志记录实现。
我打算尝试避免从我自己的开源库引用另一个第三方库,以避免将另一个程序集引用引入其他人的应用程序。也许这不是一个问题,我应该停在那里?
假定一些人认为,过度的程序集引用是烦人(和因为有人会提到它),我个人而言,我不喜欢使用ILMerge对于这种情况,你可以很容易地有使用几个库log4net的和如果他们每个ILMerged在程序集中,我认为它只是膨胀一个应用程序的大小。
为此,我正在考虑实现和公开一个LogBridge,以便我的库的用户可以根据需要挂钩我的日志记录调用(默认情况下会关闭)。 也让我说,我说的不是实现我自己的日志框架,只是保证如果有人关心comsuming它,我揭露登录强调的我想消费的实现似乎是这样的:
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); }
}
}
这种方法有意义吗?在度假太久之后我是不是在想这个?我应该参考Log4Net或NLog等并完成它?我错过了这种方法的主要缺点吗?粗糙的API是否有意义?
一如既往,好奇每个人的想法......
更新
如果人们认为jgauffin解决方案是更好的方法,那就很好奇吗?在这篇文章之前我已经考虑过了一些事情;我的想法是LogBridge更容易与消费者联系,而不是要求在消费项目中实现自定义界面?想法?
答案 0 :(得分:2)
查看System.Diagnostics并使用Trace或Debug类。像Log4Net这样的产品可以在需要时选择它们。
答案 1 :(得分:1)
我通常这样做:
ILogger
ILogger _logger = LogManager.GetLogger(typeof(ClassBeingLogged));
您还可以在项目维基中提供示例,说明如何实施nlog或log4net。这通常就够了。
LogManager需要ILogFactory
,负责创建实际的实现:
public class LogManager
{
ILogFactory _factory;
public static void Assign(ILogFactory factory);
public static ILogger GetLogger(Type typeBeingLogged);
}
public interface ILogFactory
{
ILogger GetLogger(Type typeBeingLogged);
}
这使得为任何日志框架实现适配器变得非常容易。