如何在共享项目中使用Log4net包装器类?

时间:2018-10-04 10:17:07

标签: c# log4net

我的解决方案有多个项目。我在类库项目中的日志包装器类下面有这个。类库的dll在其他项目中被引用,因此我可以使用此包装器类。

但是我很荣幸地在其他项目中访问_Logger或_Log来传递数据以写入日志。我在这里想念什么?

    public class LoggerManager
{
    public static LoggerManager _Logger;
    public static ILog _log;
    public LoggerManager()
    {
        Init();
    }

    public static LoggerManager Instance
    {
        get
        {
            if (_Logger == null)
            {
                _Logger = new LoggerManager();
            }
            return _Logger;
        }
    }

    private void Init()
    {
        _log = LogManager.GetLogger(typeof(Program));
        XmlConfigurator.Configure();
    }

    public void Error(Exception ex, [CallerMemberName] string memberName = "", [CallerFilePath] string filePath = "", [CallerLineNumber] int lineNumber = 0)
    {
        if (_log == null)
        {
            Init();
        }
        _log.Error(string.Format("Error from Method : {0} in file {1} at line {2}", memberName, filePath, lineNumber), ex);
    } 
}

1 个答案:

答案 0 :(得分:1)

确保您要尝试访问静态变量,如下所示:

LoggerManager._logLoggerManager.Logger

而不是通过您的实例:

var a = new LoggerManager()
a._log; // this wont work as the instance doesn't know about the static variables!

但是,当您尝试访问公共静态变量时,似乎就像是一个奇怪的包装器。私有化它们并通过财产通过您的实例使它们可用会更好吗?如:

public class LoggerManager
{
    private static LoggerManager _logger;
    private static ILog _log;

    public LoggerManager Logger => LoggerManager._logger;
    public ILog LogInstance => LoggerManager._log;

    // rest of your code...

}

或者也许您可以看看拥有单例类。