2

我见过的任何例子都是这样的:

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
}

但这不起作用。我收到以下错误:

'WpfApplication3.MainWindow' 的部分声明不得指定不同的基类

那么我想知道是否有一种不需要在每个窗口中配置 Log4Net 的可靠方法呢?

编辑以澄清问题不在于创建基类,问题是我想知道配置 Log4Net 的最佳方法而无需添加它

ILog log = log4net.LogManager.GetLogger(typeof(/* Window Type */));

在每个班级。

4

3 回答 3

2

如下配置 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"); 
}

您还可以组合这些方法:例如,您可以在记录异常时使用全局记录器(您不太可能希望选择性地禁用异常记录),并在某些类中使用特定于类的记录器进行调试记录(其中您可能希望有选择地启用/禁用)。

回应评论:

有选择地启用日志记录有什么好处?

恕我直言,主要的好处是当您需要仪器时。您可以通过在您想要检测的代码库的各个部分自由地散布调试级别的日志记录语句来做到这一点。因为这样的日志记录往往很冗长,所以能够有选择地只启用您想要检查的那些位是很好的,例如在故障排除时。

于 2012-04-06T09:22:11.390 回答
0

我使用静态类

public static class lgr
{
#region "log4Net"
private static bool _isInfoEnabled = false;
private static bool _isWarnEnabled = false;
private static bool _isDebugEnabled = false;
private static ILog _logger;
public static ILog Logger {
    get {
        if ((_logger == null)) {
            _logger = LogManager.GetLogger("root");
            _isInfoEnabled = _logger.IsInfoEnabled;
            _isWarnEnabled = _logger.IsWarnEnabled;
            _isDebugEnabled = _logger.IsDebugEnabled;
        }
        return _logger;
    }
    set {
        if ((value == null)) {
            _logger = LogManager.GetLogger(Reflection.MethodBase.GetCurrentMethod.DeclaringType);
        } else {
            _logger = value;
        }
    }
}

public static string LoggerName {
    get { return Logger.Logger.Name; }
    set {
        if (value == null || value == string.Empty) {
            Logger = null;
        } else {
            Logger = LogManager.GetLogger(value);
        }
    }
}

public enum LogType
{
    Debug,
    Info,
    Warn,
    Error_,
    Fatal
}
public static void WriteLogError(string _message, Exception ex)
{
    if (Logger.IsErrorEnabled) {
        Logger.Error(_message, ex);
    }
}

public static void WriteLogInfo(string _message)
{
    if (_isInfoEnabled) {
        Logger.Info(_message);
    }
}

public static void WriteLogWarn(string _message)
{
    if (_isWarnEnabled) {
        Logger.Warn(_message);
    }
}
#endregion

}

然后我在应用程序的任何地方都使用它

if (Logger.IsInfoEnabled()) {
    Logger.Info("Processing...");
}

并且

WriteLogInfo(string.Format("Close time:{0}", _closeDateTime));
于 2012-04-06T13:07:54.557 回答
0

不确定它是否完全解决了您的问题,但您可以使用:

ILog log = log4net.LogManager.GetLogger(
               System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

那么至少这样代码在每个实例中都是相同的,而不得不使用:

ILog log = log4net.LogManager.GetLogger(typeof(/* Window Type */));
于 2013-04-30T11:52:39.530 回答