【问题标题】:Use EventLogTraceListener in entire application lifetime in winforms?在winforms的整个应用程序生命周期中使用EventLogTraceListener?
【发布时间】:2015-08-26 19:35:04
【问题描述】:

我想将事件日志跟踪添加到我的 winforms 应用程序,但对此不太了解。

我所做的是以下步骤: 在我的 app.config 中:

<system.diagnostics>
      <trace autoflush="true" indentsize="4">
        <listeners>
          <add name="myListener" type="System.Diagnostics.EventLogTraceListener" initializeData="MyApplication"/>
          <remove name="Default" />
        </listeners>
      </trace>
    </system.diagnostics>
  • 这样的基本记录器类:

    使用系统; 使用 System.Diagnostics;

    命名空间 LogEventSample { 公共静态类 Logger { 公共静态无效错误(字符串消息,字符串模块) { WriteEntry(消息,“错误”,模块); }

        public static void Error(Exception ex, string module)
        {
            WriteEntry(ex.Message, "error", module);
        }
    
        public static void Warning(string message, string module)
        {
            WriteEntry(message, "warning", module);
        }
    
        public static void Info(string message, string module)
        {
            WriteEntry(message, "info", module);
        }
    
        private static void WriteEntry(string message, string type, string module)
        {
            Trace.WriteLine(string.Format("{0},{1},{2},{3}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), type, module, message)); 
        }
    }
    

    }

然后,当我需要这样的一行时:

Logger.Info("working...", "MyApp");

我的疑虑来自应用程序的生命周期。 这会影响我的应用程序性能吗?我应该用不同的方式做这个吗?

另外,当我登录时如何存储更多信息?我不谈论存储一些异常字符串,而是保存更详细的数据以显示在事件查看器中。

【问题讨论】:

    标签: c# winforms logging


    【解决方案1】:

    您这样做的方式是在 .NET 中跟踪应用程序反馈的标准方式,因此它不应该是“错误的”。

    您的应用程序性能也不会受到影响,因为 Trace.WriteLine 调用仅在调试版本中解决。如果您查看定义,您会注意到,它使用Conditional("TRACE") 属性进行了注释。因此,如果您将构建配置文件更改为“Release”,则项目的“Define TRACE-constant”属性将被禁用(默认情况下),您将看不到任何跟踪输出(甚至看不到您的日志,因此请检查这是否是您的期望的行为!)。

    另外请注意,日志记录不应该是您的首要优化优先级。具有更好运行时行为的算法可以补偿大部分开销,应该是开始的方式。

    如果你想更好地控制数据的记录方式,我敢打赌你最好使用一个好的日志框架,比如 Semantic LoggingLog4Net

    【讨论】:

    • 我想在发布配置文件中记录事件,在我的最终客户端应用程序中,以便客户端跟踪应用程序中的一些操作。 Trace 不是一个好方法吗?你说我需要使用 Log4Net?
    • 如果您想包含 Trace 输出,只需在将构建配置文件更改为 Release 后检查项目的 Define TRACE-Constant .某个日志记录框架的决定取决于许多因素,而不是您问题的一部分。有关它的更多信息,请查看this question
    • 我想我会选择那个选项。因为我不想只存储错误,但我想记录一些我的客户需要记录的操作。此外,除了简单(或复杂)字符串之外,还可以记录更多信息吗?
    • 不使用Trace,它基本上是一个打印简单程序反馈的工具(例如到Visual Studio的Output窗口)。
    • 如果你想使用这些字段,要么直接使用System.Diagnostics.EventLog(可以直接写入Windows事件日志),要么使用一些框架。基本上,所有登录到 Windows 事件日志的人都将EventLog-code 抽象出来,并提供多目标日志记录等功能。 EventLogTraceListener 也只将Trace 写入EventLog。但是,我不知道 Log4Net 是否支持所有字段(如事件日志图标或 id)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多