正在初始化所有类的日志对象

本文关键字:日志 对象 初始化 | 更新日期: 2023-09-27 17:58:35

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

今天我做了一个记录器函数,我在每个类对象中初始化它,以便在内部使用它。

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

今天我使用的是:

  • 初始化类contractor中的日志对象以便使用它
  • 将日志对象传递给承包商

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

我的记录器类:

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);
        }
    }
}

正在初始化所有类的日志对象

我认为最好的方法是通过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!");

我的回答有两个方面。

首先,要获得所需的行为,请使类和方法成为静态的。这为应用程序的生命周期创建了一个实例,您可以在任何需要的地方使用FileLogger.Log,而不必新建一个新的FileLogger。我不知道为什么你不喜欢使用静态,所以你可以用singleton得到同样的行为。

第二,你不应该写自己的日志。有很多不错的开源选项。看看log4net、nLog甚至内置的TraceSource,可以省去重新发明轮子的工作量。