我一直在寻找一个用于.net (c#)的日志框架,在阅读了stackoverflow上的一些问答线程后,我决定尝试一下log4net。我看到人们一次又一次地提到他们使用log4net的包装器类,我想知道那会是什么样子。
我将代码拆分到不同的项目中(data access/business/webservice/..)。log4net包装类应该是什么样子的?包装器类是否需要包含在所有项目中?我应该把它作为一个单独的项目一起构建吗?
包装器应该是单例类吗?
发布于 2008-10-03 11:49:55
本质上,您创建了一个接口,然后创建了该接口的一个具体实现,该接口直接包装了Log4net的类和方法。可以通过创建更具体的类来包装其他日志记录系统,这些类包装了这些系统的其他类和方法。最后,使用工厂根据配置设置或代码更改行创建包装器的实例。(注意:使用StructureMap这样的Inversion of Control容器可以变得更加灵活和复杂。)
public interface ILogger
{
void Debug(object message);
bool IsDebugEnabled { get; }
// continue for all methods like Error, Fatal ...
}
public class Log4NetWrapper : ILogger
{
private readonly log4net.ILog _logger;
public Log4NetWrapper(Type type)
{
_logger = log4net.LogManager.GetLogger(type);
}
public void Debug(object message)
{
_logger.Debug(message);
}
public bool IsDebugEnabled
{
get { return _logger.IsDebugEnabled; }
}
// complete ILogger interface implementation
}
public static class LogManager
{
public static ILogger GetLogger(Type type)
{
// if configuration file says log4net...
return new Log4NetWrapper(type);
// if it says Joe's Logger...
// return new JoesLoggerWrapper(type);
}
}
下面是一个在类中使用此代码的示例(声明为静态只读字段):
private static readonly ILogger _logger =
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
您可以使用以下命令获得相同的性能更友好的效果:
private static readonly ILogger _logger =
LogManager.GetLogger(typeof(YourTypeName));
前面的例子被认为是更易维护的。
您不会希望创建一个单例来处理所有日志记录,因为Log4Net会为调用类型记录日志;让每种类型使用自己的记录器而不是只在日志文件中看到一个报告所有消息的类型要干净得多,也很有用。
因为您的实现应该具有相当高的可重用性(组织中的其他项目),所以您可以使其成为自己的程序集,或者最好将其包含在您自己的个人/组织的框架/实用程序集中。不要在每个业务/数据/UI程序集中单独地重新声明类,这是不可维护的。
发布于 2009-02-26 02:52:23
假设你使用的是像cfeduke's answer above这样的东西,你也可以像这样给你的LogManager
添加一个重载:
public static ILogger GetLogger()
{
var stack = new StackTrace();
var frame = stack.GetFrame(1);
return new Log4NetWrapper(frame.GetMethod().DeclaringType);
}
通过这种方式,您现在可以在代码中只使用:
private static readonly ILogger _logger = LogManager.GetLogger();
而不是这两个:
private static readonly ILogger _logger =
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private static readonly ILogger _logger =
LogManager.GetLogger(typeof(YourTypeName));
它实际上等同于第一个替代方案(即使用MethodBase.GetCurrentMethod().DeclaringType
的方案),只是稍微简单一点。
发布于 2008-10-03 12:30:30
您计划从为log4net编写包装器中获得什么好处?我建议先熟悉一下log4net类,然后再围绕它们编写包装器。cfeduke在如何编写上述包装器方面的回答是正确的,但除非您需要在他的示例中添加实际功能,否则包装器只会成功地减慢日志记录过程,并为未来的维护者增加复杂性。当.Net中可用的重构工具使这样的更改变得非常容易时,这一点尤其正确。
https://stackoverflow.com/questions/166438
复制相似问题