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

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 に答える