正在初始化所有类的日志对象
本文关键字:日志 对象 初始化 | 更新日期: 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,可以省去重新发明轮子的工作量。