我见过的任何例子都是这样的:
ILog log = log4net.LogManager.GetLogger(typeof(MainWindow));
我不喜欢在各处复制/粘贴代码来做本质上相同的事情。
理想情况下,我可以在某个基类中配置记录器并配置 Log4Net,如下所示:
public ILog log = log4net.LogManager.GetLogger(typeof(MyWindowBase));
并让所有窗口继承它。我看到的问题是 MainWindow 被定义为
public partial class MainWindow : Window {}
所以它已经继承自Window
。
我想到了执行以下操作:
public partial class MyBase : Window
{
// configure Log4Net here
}
public partial class MainWindow : MyBase
{
// use Log4Net here
}
但这不起作用。我收到以下错误:
Partial declarations of 'WpfApplication3.MainWindow' must not specify different base classes
所以我想知道是否有一种可靠的方法可以做到这一点,而不需要在每个窗口中配置 Log4Net?
编辑以澄清问题不在于创建基类,问题是我想知道配置 Log4Net 的最佳方法而无需添加此
ILog log = log4net.LogManager.GetLogger(typeof(/* Window Type */));
每个类(class)。
最佳答案
按如下方式配置 log4net 记录器是很常见的:
class MyClass
{
private static ILog log = log4net.LogManager.GetLogger(typeof(MyClass));
...
}
这将创建一个与类同名的记录器,如果您希望能够根据记录器名称有选择地启用日志记录,这会很方便。
请注意静态字段的使用,这样实例化记录器的开销只会产生一次,而不是每次实例化类时都会产生。
当然,能够选择性地启用日志记录的灵活性是有代价的:您必须在每个执行日志记录的类中都有类似的声明。
除非您愿意放弃有选择地启用日志记录的能力,否则我看不出有任何解决办法,在这种情况下,您可以通过单个全局记录器路由所有日志记录请求,例如:
public static class LoggingHelper
{
public static ILog GlobalLogger
{
get { return _globalLogger; }
}
private static ILog _globalLogger = log4net.LogManager.GetLogger("Global");
}
您还可以组合这些方法:例如,您可以在记录异常时使用全局记录器(您不太可能希望有选择地禁用异常记录),并在某些类中使用特定于类的记录器进行调试日志记录(您可能希望有选择地启用/禁用)。
回复评论:
What are the benefits of selectively enabling logging?
恕我直言,主要的好处是当你想要instrumentation时。您可以通过在要检测的代码库部分中随意散布调试级别日志记录语句来实现此目的。由于此类日志记录往往很冗长,因此能够有选择地仅启用您想要检查的那些位(例如在进行故障排除时)是件好事。
关于c# - 我是否需要在每个窗口中配置 Log4Net,还是有办法在基类中配置一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10040779/