使用记录器的委托和事件体系结构

时间:2011-12-29 03:34:43

标签: c# events delegates

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

来自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);
    }
}

2 个答案:

答案 0 :(得分:1)

您是否考虑过像NLog(http://nlog-project.org/)这样的日志框架?

它允许您分隔日志记录和目标。无需对目标进行硬编码。如果禁用日志记录级别,它还具有记录级别和低CPU负载的优势。

答案 1 :(得分:0)

如果没有关于您需要日志记录的更多信息,那么关于代码的说法就不多了。所有次要要求都可以改变设计。

如果您需要一些高性能/吞吐量,则需要对日志消息进行一些排队,以便调用的代码不会阻止日志操作。 如果您需要确定实际发布日志消息,则需要一个反馈机制和“大量”错误处理代码。 如果您将其用于性能记录,那么使用性能分析器可能会更好。

我会说保持简单并从那里开始。