带有记录器的委托和事件体系结构

本文关键字:事件 体系结构 记录器 | 更新日期: 2023-09-27 18:18:55

问题:是否有更简单的方法来使用事件构建日志代码?

代码灵感来自@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负载的优点。

如果没有更多关于日志记录的信息,就不能对代码说太多。各种次要要求均可更改设计

如果你需要一些高性能/吞吐量,你需要一些日志消息队列,这样被调用的代码就不会阻塞日志操作。如果你需要高度确定日志信息是否被发布,你就需要一个反馈机制和"大量"错误处理代码。如果您将使用它进行性能日志记录,那么使用性能分析器可能会更好。

我会说保持简单,然后从这里开始。