65.9K
CodeProject 正在变化。 阅读更多。
Home

带有表单控制台的日志记录实用程序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.50/5 (2投票s)

2006年9月7日

3分钟阅读

viewsIcon

29956

downloadIcon

512

一个带有基于窗体的控制台的日志实用程序。

Sample screenshot

引言

当我第一次开始使用Visual Studio时,我对Trace输出进入IDE中的标准文本窗口感到失望。 我需要的是一个面向记录的日志系统,可以输出到图形控制台。 我的解决方案是一个基于.NET Remoting和Windows .NET Forms的相当简单的解决方案。

控制台

控制台只是显示客户端收到的日志消息列表。 您可以对列进行排序。 新消息将放在列表的顶部。

不能绝对保证消息将以发送的完全相同的顺序显示。 这是因为我正在使用带有.NET Remoting的默认线程池。 因此,即使消息将按顺序发送,控制台也可能不会按接收的顺序执行消息。 但是,似乎这种情况非常罕见。 大多数时候,控制台将以正确的顺序显示消息。 无论消息执行顺序如何,条目的时间戳将始终反映发送消息的时间。

您可以通过双击行来向下钻取控制台上的单个消息。 你会得到这样的东西

Sample screenshot

控制台配置

应用程序配置文件应如下所示

<?xml version="1.0" encoding="utf-8" ?>
 <configuration>
  <appSettings>
   <add key="port" value="1439"/>
  </appSettings>
 </configuration>

您还需要确保防火墙允许打开此端口。 您可以使用您想要的任何端口。 您只需要确保客户端配置文件中指定的端口是相同的。

客户端 API

API 非常简单。 首先,从 logger 项目添加对 logger_client.dll 的引用。

其次,在您的代码中添加引用

using LiveSwitch.LoggerClient;

接下来,实例化一个 Logger 代理。 这些是轻量级对象,因此不必释放它们。 您可以根据需要创建任意多个,而不会浪费重量级资源。

Logger logger = new Logger("component name");

logger 类有六个相关的方法

  • logger.Debug("text");
  • logger.Info("text");
  • logger.Warning("text");
  • logger.Warning("text", exception);
  • logger.Error("text");
  • logger.Error("text", exception);

客户端配置

客户端应用程序需要在其配置文件中进行应用程序设置。 请注意,您不能使用应用程序属性,因为依赖的客户端 DLL 需要读取可执行文件的配置文件,并且它无权访问 IDE 生成的代码。

应用程序的属性在名为 <exe 文件名>.config 的文件中提供。

这是一个例子。

<?xml version="1.0" encoding="utf-8" ?>
 <configuration>
  <appSettings>
   <add key="loggerUrl" value="tcp://:1439/logger"/>
  </appSettings>
 </configuration>

内部

消息在客户端库端进行批处理,并由单个工作线程发送。 以下是所有客户端记录器实例共享的主循环,用于将批量的请求发送到记录器应用程序。

private void Start()
{
    while (true)
    {
        ILogger.LogMessage[] msgs;
        lock (this) 
        {
            while (_list.Count == 0)
            {
                Monitor.Wait(this);
            }
            msgs = _list.ToArray();
            _list.Clear();
        }
        _client.Log(msgs); // xmit the batch of messages
    }
}

如您所见,记录器客户端库后台线程使用监视器锁与应用程序同步。

在这里,您可以看到应用程序的信息记录器通知后台线程数据已准备就绪。

internal void LogInfo(string comp, string data)
{
    ILogger.LogMessage msg =
        new ILogger.LogMessage(ILogger.LogMessageType.INFO, 
                               data, comp, DateTime.Now, _host, null);
    lock (this)
    {
        _list.Add(msg);
        Monitor.Pulse(this);
    }
}

如您所见,交互非常规范。

结论

在开发应用程序时,此日志记录系统非常有帮助。 我希望你们中的一些人会觉得它有用。

© . All rights reserved.