企业库日志记录:将消息发送到任意WCF端点的自定义跟踪侦听器

本文关键字:端点 WCF 任意 自定义 侦听器 跟踪 记录 日志 消息 企业库 | 更新日期: 2023-09-27 18:05:19

我正在尝试为企业库日志记录编写一个自定义跟踪侦听器,它将所有日志消息发送到任意WCF端点。这背后的想法是,我可以在另一端设置一个简单的控制台应用程序等,实时打印所有日志消息。

我的问题分为两部分:

  1. 已经有这样的机制了吗?我已经查看了MSMQ侦听器,我对使用它不感兴趣,因为我可能需要在某些时候使用不同的协议/绑定。
  2. 我在下面实现的方式-它足够有效还是有更好的方法?我担心的是,每次从记录器发出消息(可能很频繁)时,我都会打开一个新通道,然后将其关闭。这会导致性能问题吗?

在我的例子中,RemoteClient来源于ClientBase<T>

[ConfigurationElementType(typeof(CustomTraceListenerData))]
public class RemoteTraceListener : CustomTraceListener
{
    public override void Write(string message)
    {
        RemoteClient client = new RemoteClient();
        client.Open();
        client.Write(message);
        client.Close();
    }
    public override void WriteLine(string message)
    {
        RemoteClient client = new RemoteClient();
        client.Open();
        client.WriteLine(message);
        client.Close();
    }
    public override void TraceData(TraceEventCache eventCache, string source, TraceEventType eventType, int id, object data)
    {
        if (data is LogEntry && this.Formatter != null)
        {
            WriteLine(this.Formatter.Format(data as LogEntry));
        }
        else
        {
            WriteLine(data.ToString());
        }
    }
}

企业库日志记录:将消息发送到任意WCF端点的自定义跟踪侦听器

多久写一次?我建议WCF流作为一个更好的选择,因为你将频繁地记录日志。

如果做不到这一点,那么尽可能长时间地保留客户端实例可能是一个好主意。你可以试试合用

我发现了一个名为'CLog'的开源项目,它正是我正在寻找的:http://clog.codeplex.com/.

简单看一下源代码,就会发现他正在使用一个单例对象来跟踪所有将接收日志消息的开放通道,并且他正在使用ChannelFactory<TChannel>而不是ClientBase<T>来实例化每个通道代理。有一些线程的含义需要解决,但我仍然认为这是飞行的方式。

使用它作为实现我自己的自定义跟踪侦听器的起点应该不会太难,该侦听器记录到WCF端点。

我认为你应该使用SQL数据库,你应该登录,因为如果你登录到一个控制台应用程序,你不能看到例如2天前的东西。而在SQL中,您可以引用并获得所需的正确数据。另一个解决方案是使用log4net项目。