声明一个记录器并LogManager.GetLogger在基类中调用似乎更干净,这样每个继承的人都可以使用它.但是,在log4net网站和此博客文章中的其他博客中,它声明最好为每个类声明一个记录器,因为:
您可以通过这种方式使用记录器来隔离对象的日志记录问题,我完全建议您这样做.这将使您能够使用log4net的分层配置机制来限制和指示来自各个记录器的日志输出.
这是否意味着如果我把它放在基类中,它会使该记录器成为瓶颈?
如果是这样,还有其他解决方案,还是我只需要为每个类创建一个记录器?
Gro*_*roo 23
该帖子并没有明确告诉您在每个派生类中使用不同的记录器,而是通常每个类类型使用不同的记录器.您可以,但不必在每个派生类中使用新的记录器实例.
查看它的一种方法是,同时实例化两个单独的记录器可能会令人困惑(因为基本记录器仍然存在),特别是如果使用相同的记录器名称隐藏基本记录器.您的基类方法(未被覆盖)仍将引用基本静态记录器,而重写的方法将使用不同的方法.
此外,该文章实例化记录器,如下所示:
static ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType );
Run Code Online (Sandbox Code Playgroud)
虽然可能会使用一种稍微简单的方法:
static readonly ILog Log = LogManager.GetLogger(typeof(YourClass));
Run Code Online (Sandbox Code Playgroud)
首先,它已被标记readonly,这意味着一旦初始化,您将无法意外地更改字段.使用该类型将以与反射相同的方式工作,但稍快(在编译时解析).如果您选择重命名它,Visual Studio也会自动更新类名(不会使用字符串重载).
通常的做法是每个类有一个记录器,而不是基类.这样,您可以基于每个类启用/禁用日志记录.
我可能还建议使用Common Logging 2.0,http://netcommon.sourceforge.net/.
目前正在使用的.NET有各种日志记录实现,log4net,Enterprise Library Logging,NLog,这些都是最受欢迎的.具有不同实现的缺点是它们不共享公共接口,因此会对库的用户强加特定的日志记录实现.
Common.Logging库引入了一个简单的抽象,允许您在运行时选择特定的日志记录实现.因此,您可以推迟决定在部署之前使用的特定日志库.适配器用于将特定的日志记录系统插入Common.Logging.
Dot*_*ser -2
通常您应该有一个记录器类,您可以使用单例模式并确保您的应用程序只有一个记录器实例。
编辑:现在已使其线程安全,感谢您的评论。
public class Logger
{
private static object syncRoot = new Object();
private static Logger instance=null;
// private constructor
private Logger()
{
}
/// <summary>
/// Gets an instance with default parameters based upon the caller
/// </summary>
/// <returns></returns>
public static Logger GetInstance()
{
// make sure you return single instance
if (instance == null)
{
lock (syncRoot)
{
instance=new Logger();
}
}
return instance;
}
}
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助
| 归档时间: |
|
| 查看次数: |
22305 次 |
| 最近记录: |