问题:是否有更简单的方法来使用事件构建日志代码?
代码灵感来自@JonSkeets在www.tekpub.com上的伟大演讲。一切理解上的错误都是我自己的。
internal class Program
{
private static void Main(string[] args)
{
Person p = new Person();
p.GetDefaultName();
}
}
public delegate void LogHandler(string message);
public class Person
{
public void GetDefaultName()
{
LogEventRaiser raiser = SetupLogEventRaiser();
raiser.OnLog("getting default name");
}
private static LogEventRaiser SetupLogEventRaiser()
{
ConsoleLogger cl = new ConsoleLogger();
ConsoleLogger2 cl2 = new ConsoleLogger2();
//when delegate LogHander is called, run fileLogger.Logger method
LogHandler handler = cl.Logger;
LogHandler handler2 = cl2.Logger;
var raiser = new LogEventRaiser();
//wire up event called Log which is of type delegate LogHandler
raiser.Log += handler;
raiser.Log += handler2;
return raiser;
}
}
public class LogEventRaiser
{
public event LogHandler Log;
public void OnLog(string text)
{
LogHandler tmp = Log;
if (tmp != null)
tmp.Invoke(text);
}
}
public class ConsoleLogger
{
public void Logger(string s)
{
Console.WriteLine("ConsoleLogger: " + s);
}
}
public class ConsoleLogger2
{
public void Logger(string s)
{
Console.WriteLine("ConsoleLogger2: " + s);
}
}
你考虑过像NLog (http://nlog-project.org/)这样的日志框架吗?
它将允许您分离日志和目标。不需要对目标进行硬编码。如果日志级别被禁用,它还具有日志级别和低CPU负载的优点。
如果没有更多关于日志记录的信息,就不能对代码说太多。各种次要要求均可更改设计
如果你需要一些高性能/吞吐量,你需要一些日志消息队列,这样被调用的代码就不会阻塞日志操作。如果你需要高度确定日志信息是否被发布,你就需要一个反馈机制和"大量"错误处理代码。如果您将使用它进行性能日志记录,那么使用性能分析器可能会更好。
我会说保持简单,然后从这里开始。