我有一个带有很多类的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);
}
}
}
答案 0 :(得分:1)
我的回答有两个方面。
首先,要获得所需的行为,请使类和方法保持静态。这会为您的应用程序的生命周期创建一个实例,您可以在任何需要的地方使用FileLogger.Log
,而无需新建FileLogger
。我不知道为什么您对使用静态不利,因此您可以使用singleton获得相同的行为。
第二个是你不应该写自己的记录器。有很多优秀的开源选项可供选择。查看log4net,nLog甚至内置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!");