问题:是否有更简单的方法来使用事件构建此日志记录代码?
来自www.tekpub.com的@JonSkeets精彩演讲启发了代码。理解中的所有错误都是我自己的。
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);
}
}
答案 0 :(得分:1)
您是否考虑过像NLog(http://nlog-project.org/)这样的日志框架?
它允许您分隔日志记录和目标。无需对目标进行硬编码。如果禁用日志记录级别,它还具有记录级别和低CPU负载的优势。
答案 1 :(得分:0)
如果没有关于您需要日志记录的更多信息,那么关于代码的说法就不多了。所有次要要求都可以改变设计。
如果您需要一些高性能/吞吐量,则需要对日志消息进行一些排队,以便调用的代码不会阻止日志操作。 如果您需要确定实际发布日志消息,则需要一个反馈机制和“大量”错误处理代码。 如果您将其用于性能记录,那么使用性能分析器可能会更好。
我会说保持简单并从那里开始。