初始化所有类的日志对象

时间:2016-07-25 14:49:17

标签: c# .net oop

我有一个带有很多类的winforms应用程序,如果出现问题,我需要在每个类中写入日志。

今天我创建了一个记录器函数,我在每个类对象中初始化以便在里面使用它。

例如,我有一个主逻辑类,它有一个日志和一个运行不同逻辑的类应该有一个日志。

今天我正在使用:

  • 在班级承包商中初始化日志对象以便使用它。
  • 将日志对象传递给承包商。

什么是最好的架构,一次初始化它并在每个类中使用它(不做静态)。

我的记录器类:

namespace MyLogger
{
    public class Logger : IMessageLogger
    {
        IMessageLogger _messageLogger;

        public Logger(IMessageLogger messageLogger)
        {
            _messageLogger = messageLogger;
        }

        public void Log(string message)
        {
            _messageLogger.Log(message);
        }
    }

    public interface IMessageLogger
    {
        void Log(string message);
    }

    public class FileLogger : IMessageLogger
    {
        string _filePath = Environment.CurrentDirectory;

        public string filePath
        {
            get { return _filePath; }
            set { _filePath = value; }
        }

        public FileLogger(string filePath)
        {
            _filePath = filePath;
        }

        public void Log(string message)
        {
            string strFileName = Path.Combine(_filePath, String.Format("{0}{1}.log", _filePath, DateTime.Now.ToString("yyyyMMdd")));

            using (StreamWriter writer = new StreamWriter(strFileName, true))
            {
                writer.WriteLine(DateTime.Now.ToString("[dd/MM/yyyy hh:mm:ss]") + "  ->  " + message);
            };
        }
    }

    public class ConsoleLogger : IMessageLogger
    {
        public void Log(string message)
        {
            Console.WriteLine(message);
        }
    }

}

2 个答案:

答案 0 :(得分:1)

我的回答有两个方面。

首先,要获得所需的行为,请使类和方法保持静态。这会为您的应用程序的生命周期创建一个实例,您可以在任何需要的地方使用FileLogger.Log,而无需新建FileLogger。我不知道为什么您对使用静态不利,因此您可以使用singleton获得相同的行为。

第二个是你不应该写自己的记录器。有很多优秀的开源选项可供选择。查看log4netnLog甚至内置TraceSource,以节省重新发明轮子的工作量。

答案 1 :(得分:1)

我认为最好的方法是通过DependencyInjection实现它,你应该在线阅读它。 但是如果你想要一个快速简便的解决方案,只需为你的记录器实现一个Singleton模式,比如 -

public class Logger : IMessageLogger
{
    private IMessageLogger _messageLogger;
    private static Logger _instance;

    public static Logger Instance
    {
        get
        {
            if (_instance == null)
            {
                // Pick one:
                _instance = new Logger(new FileLogger("SomePath"));
                _instance = new Logger(new ConsoleLogger());
            }

            return _instance;
        }
    }

    private Logger(IMessageLogger messageLogger)
    {
        _messageLogger = messageLogger;
    }

    public void Log(string message)
    {
        _messageLogger.Log(message);
    }
}

要编写日志,请使用此行 -

Logger.Instance.Log("This is a log message!");