将 Trace 方法添加到 System.Diagnostics.TraceListener

2023-12-13

我编写了一个从 System.Diagnostics.TraceListener 派生的 Log 类,如下所示

public class Log : TraceListener

它充当 Log4Net 的包装器,并允许人们像这样使用 System.Diagnostics Tracing

Trace.Listeners.Clear();
Trace.Listeners.Add(new Log("MyProgram"));
Trace.TraceInformation("Program Starting");

请求添加其他跟踪级别,然后添加默认跟踪级别(错误、警告、信息)

我想将其添加到 System.Diagnostics.Trace 中,以便可以像这样使用它

Trace.TraceVerbose("blah blah");
Trace.TraceAlert("Alert!");

有什么办法可以通过扩展类来做到这一点吗?我试过

public static class TraceListenerExtensions
{
     public static void TraceVerbose(this Trace trace) {}
}

但传入的跟踪实例上没有任何内容被公开:(


虽然已经晚了,但是您考虑过使用 TraceSource 吗? TraceSources 为您提供可用于记录到 System.Diagnostics 的实际对象实例(这意味着您可以按照您在问题中建议的方式使用扩展方法来扩展它们)。 TraceSources 通常在 app.config 中配置(类似于配置 log4net 记录器的方式)。您可以控制日志记录的级别以及正在侦听的跟踪侦听器。因此,您可以拥有针对 TraceSource 进行编程的应用程序代码,其可能如下所示:

public class MyClassThatNeedsLogging
{
  private static TraceSource ts = 
          new TraceSource(MethodBase.GetCurrentMethod().DeclaringType.Name);
  //Or, to get full name (including namespace)
  private static TraceSource ts2 = 
          new TraceSource(MethodBase.GetCurrentMethod().DeclaringType.FullName);

  private count;

  public MyClassThatNeedsLogging(int count)
  {
    this.count = count;

    ts.TraceEvent(TraceEventType.Information, 0, "Inside ctor.  count = {0}", count);
  }

  public int DoSomething()
  {
    if (this.count < 0)
    {
      ts.TraceEvent(TraceEventType.Verbose, 0, "Inside DoSomething.  count < 0");
      count = Math.Abs(count);
    }

    for (int i = 0; i < count; i++)
    {
      ts.TraceEvent(TraceEventType.Verbose, 0, "looping.  i = {0}", i);
    }
  }
}

您还可以使用任何名称创建 TraceSource(即不必是类名):

TraceSource ts1 = new TraceSource("InputProcessing");
TraceSource ts2 = new TraceSource("Calculations");
TraceSource ts3 = new TraceSource("OutputProcessing");

正如我之前提到的,每个 TraceSource 通常在 app.config 文件中配置,以及日志记录“级别”和应接收输出的侦听器。

对于您的扩展方法,您可以执行以下操作:

public static class TraceSourceExtensions
{
  public static void TraceVerbose(this TraceSource ts, string message)
  {
    ts.TraceEvent(TraceEventType.Verbose, 0, message);
  }
}

如果您需要对 TraceSource 进行更多自定义(例如添加其他级别),这是一篇非常好的文章,描述了如何做到这一点:

http://msdn.microsoft.com/en-us/magazine/cc300790.aspx

如果您最终在 TraceListener 内部使用 log4net(并使用它来定义命名记录器、日志记录级别等),则可能不需要配置许多 TraceSource。您甚至可能只能配置一个(其名称众所周知),或者您可以以编程方式创建一个,将其设置为记录“全部”,并将其连接到您的特定 TraceListener。

最后,您可以通过 TraceSource 实例进行日志记录,而不是通过静态 Trace 对象进行日志记录。如果配置了一个 TraceSource 并且其名称众所周知,则可以在任何位置创建有效的 TraceSource(用于日志记录),如下所示:

TraceSource ts = new TraceSource("logger");
ts.TraceEvent(TraceEventType.Information, 0, "Hello World!");
//Or, via your extension method
ts.TraceVerbose(TraceEventType.Verbose, 0, "Logged via extension method");

可能有更好的方法来完成您想要完成的任务,但这可能会让您考虑使用 TraceSource 与静态 Trace 类。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 Trace 方法添加到 System.Diagnostics.TraceListener 的相关文章

随机推荐

  • 在 flutter 中构建应用程序 2 次后构建失败

    在 VS code 中构建我的 flutter 应用程序后 我成功运行了该应用程序 一切正常 但在应用程序重新启动两次或多次后 每当我再次运行代码时 构建都会失败 这是弹出的错误 Target debug android applicati
  • iOS swift NumberFormatter 十进制样式本地化

    我正在与NumberFormatter Style decimal我需要 20000 23 应该是 20 000 23 因为我创建了一个扩展 var NumerWithDecimalPoint String if self let numb
  • mysql 中的 GROUP BY 特性 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我有以下 SQL 表和查询 如 sqlfiddle 中所示 http sqlfiddle com 2 37eda 1 0 当前结果如下所示 id definition id serv
  • 列出 Windows 中打开文件句柄的所有者进程?

    我目前在程序的事件查看器中收到 句柄不足 错误 列出哪些进程正在使用文件句柄的好程序是什么 一个例子是 nix 世界中的 lsof 使用流程浏览器 http technet microsoft com en us sysinternals
  • 在 CIFilter 中使用 CIColor 中的 CIImage:获取空图像

    我正在尝试创建一个具有混合模式 如叠加或乘法 的 CIFilter 相关代码 Let s try a filter here Get the data NSData imageData UIImageJPEGRepresentation i
  • 从周数查找一周的开始结束日期

    我使用 servlet 和 JSP 构建了一个 Web 应用程序 并在 Servlet 内计算了周数 private int findWeekNumber String myDate throws ParseException Simple
  • Auto Div 高度取决于另一高度

    我有以下情况我希望 Div2 高度根据 Div3 的内容调整大小 我怎样才能做到这一点 DIV1 DIV2 DIV3
  • Chrome 扩展程序可从脚本中提取文本

    我正在尝试使用 Chrome 扩展的 JS 从脚本标记中提取 webId 22 22 var 字符串 我当前正在使用的示例允许我提取页面标题 payload js chrome runtime sendMessage document ti
  • 根据另一个数据框更改数据框的值

    我再次需要您的帮助来解决一个对于初学者 R 用户来说不太清楚的可能简单的问题 我需要操作一个数据框来替换NA值由 现实 的值来满足另一个应用程序 数据帧包含 3 0 的值 这是原始数据库中无效值的标志 我需要的是用来自另一个数据帧的数据替换
  • 如何在 Touch UI 中添加强制下拉字段

    我将 必需 添加为 真实 但它不起作用 required 为 true 仅适用于文本字段 根据下面的文档 我没有看到任何从下拉列表中添加必填字段的选项 http docs adobe com docs en aem 6 0 author a
  • 为什么 Promise.then 'onFulfilled' 函数在 setTimeout 回调之前触发? [复制]

    这个问题在这里已经有答案了 有人可以解释为什么 Promise then 函数在 setTimeout 函数之前触发吗 我本以为 setTimeout 函数会首先安排在事件循环上 所以它会在 Promise then 函数之前运行 setT
  • 运算符如何重载|专门实现了 C++ 范围适配器?

    自从范围被合并到 C 20 中以来 我一直在查看标题以了解如何operator 对于范围视图来说超载 但我找不到关于如何或在何处实现它的正确轨道 C R 相当于R C根据https en cppreference com w cpp ran
  • Makefile - 移动目标文件

    经过一番搜索后 我成功地将以下 Makefile 放在一起 CC gcc CFLAGS c Wall LDFLAGS SOURCEFILES main c SOURCES src SOURCEFILES OBJECTS SOURCES c
  • Codeigniter 2.1.3 的 SMTP Gmail 错误

    我看过很多与此问题相关的帖子 我已经完成了给出的说明 但总是遇到相同的错误 我想使用 Code Igniter 2 1 3 发送 smtp gmail 这是代码 class Email extends CI Controller funct
  • 使用 SSIS 压缩文件夹

    我正在尝试压缩 SSIS 中的一个文件夹 源文件夹中有 12 个文件 我需要压缩该文件夹 我可以很好地压缩文件 我的问题是文件夹 我必须使用 winzip 来创建压缩包 谁能给我指点一个好的教程 我无法实现我找到的任何示例 Thanks 添
  • 将字典拆分为 df 中的各个列[重复]

    这个问题在这里已经有答案了 我有以下内容df其值是字典 tests SO4 Mon 6 Tues 6 Wed 7 CH3 Mon 0 Tues 8 Wed 10 我想获得所需的输出 0 1 2 SO4 Mon 6 Tues 6 Wed 7
  • Android:如何根据首先选择的单选按钮启用/禁用复选框

    基本上我有一个带有两个单选按钮的单选组 其中一个标记为 运行 另一个标记为 通过 就在其下方 我还有一个标记为 通过完成 的复选框 问题 如何在选择 运行 单选按钮时禁用该复选框 因此无法选择该复选框 并在选择 通过 单选按钮时启用它 任何
  • 无法将数组项传递给 PhantomJS 中的函数

    我正在尝试将源代码同时提取到多个网页 这些链接通过源文本文件输入到数组中 我能够迭代数组并打印出链接并确认它们存在 但是当尝试通过函数传递它们时 它们在第一次迭代后变得未定义 我的最终目标是将每个页面的源代码保存到自己的文档中 它正确执行第
  • 将打印按钮添加到 Inno Setup 中的许可证页面(Inno Setup 6 重新访问)

    这是一个标准 RTF 文档 用于LicenseFile财产在 Setup Inno 设置部分 是否可以在此页面添加一个打印按钮来触发打印许可协议 我看到了类似的问题和答案 在 Inno Setup 的许可页面中添加 打印协议 按钮 我刚刚尝
  • 将 Trace 方法添加到 System.Diagnostics.TraceListener

    我编写了一个从 System Diagnostics TraceListener 派生的 Log 类 如下所示 public class Log TraceListener 它充当 Log4Net 的包装器 并允许人们像这样使用 Syste