通过app.config关闭跟踪

Jak*_*ade 18 .net c# vb.net configuration trace

我正在尝试使用System.Diagnostics做一些非常基本的日志记录.我想我会使用框中的内容,而不是像Log4Net或EntLib那样使用额外的依赖.

我已经全部成立,跟踪工作非常好.代码段:

Trace.TraceInformation("Hello World")
Run Code Online (Sandbox Code Playgroud)

App.config中:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.diagnostics>
    <trace autoflush="true" indentsize="4">
      <listeners>
        <add name="TraceListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="Trace.log" traceOutputOptions="DateTime" />
        <remove name="Default" />
      </listeners>
    </trace>
  </system.diagnostics>
</configuration>
Run Code Online (Sandbox Code Playgroud)

而我的小"Hello World"在我的Trace.log文件中显示得很好.但现在我想关闭跟踪,所以我深入了解MSDN并找到如何:配置跟踪开关 .我添加了<switches>元素,现在我的app.config看起来像这样:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.diagnostics>
    <trace autoflush="true" indentsize="4">
      <listeners>
        <add name="TraceListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="Trace.log" traceOutputOptions="DateTime" />
        <remove name="Default" />
      </listeners>
    </trace>
    <switches>
      <add name="Data" value="0" />
    </switches>
  </system.diagnostics>
</configuration>
Run Code Online (Sandbox Code Playgroud)

value="0"应关闭跟踪-至少如果你然后按照如何:创建和初始化跟踪开关,它告诉您添加这行代码:

Dim dataSwitch As New BooleanSwitch("Data", "DataAccess module")
Run Code Online (Sandbox Code Playgroud)

这对我来说没有意义:我只需要BooleanSwicth通过.config文件声明一个能够管理(禁用)跟踪的实例?我应该...在某处使用 ......对象?

无论如何,我确定我错过了一些非常明显的东西.请帮忙.

如何在app.config中关闭跟踪?

wag*_*ghe 34

我同意@Alex Humphrey建议尝试使用TraceSources.使用TraceSources,您可以更好地控制日志记录/跟踪语句的执行方式.例如,您可以使用以下代码:

public class MyClass1
{
  private static readonly TraceSource ts = new TraceSource("MyClass1");

  public DoSomething(int x)
  {
    ts.TraceEvent(TraceEventType.Information, "In DoSomething.  x = {0}", x);
  }
}

public class MyClass2
{
  private static readonly TraceSource ts = new TraceSource("MyClass2");

  public DoSomething(int x)
  {
    ts.TraceEvent(TraceEventType.Information, "In DoSomething.  x = {0}", x);
  }
}
Run Code Online (Sandbox Code Playgroud)

TraceSource.TraceEvent调用将根据关联的Switch的配置级别自动检查消息级别(TraceEventType.Information),并确定是否应该实际写出消息.

通过为每种类型使用不同名称的TraceSource,您可以单独控制这些类的日志记录.您可以启用MyClass1日志记录,也可以禁用它,或者您可以启用它,但只有在消息级别(TraceEventType)大于某个值(可能只记录"警告"和更高级别)时才进行日志记录.同时,您可以打开或关闭MyClass2中的日志记录或设置为一个级别,完全独立于MyClass1.所有这些启用/禁用/级别的东西都发生在app.config文件中.

使用app.config文件,您还可以以相同的方式控制所有TraceSource(或TraceSources组).因此,您可以进行配置,以便MyClass1和MyClass2都由同一个Switch控制.

如果您不希望每种类型都有不同名称的TraceSource,则可以在每个类中创建相同的TraceSource:

public class MyClass1
{
  private static readonly TraceSource ts = new TraceSource("MyApplication");

  public DoSomething(int x)
  {
    ts.TraceEvent(TraceEventType.Information, "In DoSomething.  x = {0}", x);
  }
}

public class MyClass2
{
  private static readonly TraceSource ts = new TraceSource("MyApplication");

  public DoSomething(int x)
  {
    ts.TraceEvent(TraceEventType.Information, "In DoSomething.  x = {0}", x);
  }
}
Run Code Online (Sandbox Code Playgroud)

这样,您可以使应用程序中的所有日志记录发生在同一级别(或关闭或使用相同的TraceListener,或其他任何方式).

您还可以将应用程序的不同部分配置为可独立配置,而无需在每种类型中定义唯一TraceSource的"麻烦":

public class Analysis1
{
  private static readonly TraceSource ts = new TraceSource("MyApplication.Analysis");

  public DoSomething(int x)
  {
    ts.TraceEvent(TraceEventType.Information, "In DoSomething.  x = {0}", x);
  }
}

public class Analysis2
{
  private static readonly TraceSource ts = new TraceSource("MyApplication.Analysis");

  public DoSomething(int x)
  {
    ts.TraceEvent(TraceEventType.Information, "In DoSomething.  x = {0}", x);
  }
}

public class DataAccess1
{
  private static readonly TraceSource ts = new TraceSource("MyApplication.DataAccess");

  public DoSomething(int x)
  {
    ts.TraceEvent(TraceEventType.Information, "In DoSomething.  x = {0}", x);
  }
}

public class DataAccess2
{
  private static readonly TraceSource ts = new TraceSource("MyApplication.DataAccess");

  public DoSomething(int x)
  {
    ts.TraceEvent(TraceEventType.Information, "In DoSomething.  x = {0}", x);
  }
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式对您的课程进行检测,您可以将应用程序日志中的"DataAccess"部分设置为一个级别,而应用程序的"分析"部分则在不同级别进行记录(当然,可以配置应用程序的任一部分或两个部分)以便禁用日志记录).

以下是配置TraceSources和TraceSwitches的app.config文件的一部分:

<system.diagnostics>
  <trace autoflush="true"></trace>
  <sources>
    <source name="MyClass1" switchName="switch1">
      <listeners>
        <remove name="Default"></remove>
        <add name="console"></add>
      </listeners>
    </source>
    <source name="MyClass2" switchName="switch2">
      <listeners>
        <remove name="Default"></remove>
        <add name="console"></add>
      </listeners>
    </source>
  </sources>
  <switches>
    <add name="switch1" value="Information"/>
    <add name="switch2" value="Warning"/>
  </switches>
  <sharedListeners>
    <add name="console"
         type="System.Diagnostics.ConsoleTraceListener">
    </add>
    <add name="file"
         type="System.Diagnostics.TextWriterTraceListener"
         initializeData="trace.txt">
    </add>
  </sharedListeners>
</system.diagnostics>
Run Code Online (Sandbox Code Playgroud)

如您所见,您可以配置单个TraceSource和单个Switch,并且所有日志记录都可以通过单一级别的控制进行(即您可以关闭所有日志记录或使其在特定级别进行日志记录).

或者,您可以定义多个TraceSource(并在代码中引用相应的TraceSource)和多个Switch.可以共享交换机(即,多个TraceSource可以使用相同的交换机).

最后,通过现在花费更多努力来使用TraceSources并在代码中引用适当命名的TraceSources(即逻辑定义TraceSource名称以便您可以对应用程序中的日志记录进行所需程度的控制),您将获得显着的收益从长远来看具有灵活性.

以下是一些可能会帮助您使用System.Diagnostics的链接:

.net Diagnostics最佳实践?

记录最佳实践

记录的最佳方法是什么?

.Net TraceSource/TraceListener框架是否具有与log4net的Formatters类似的东西?

在我发布的链接中,经常讨论"最佳"日志框架.我并不想说服您从System.Diagnostics更改.链接也往往有关于使用System.Diagnostics的良好信息,这就是我发布它们的原因.

我发布的一些链接包含指向Ukadc.Diagnostics的链接.这是System.Diagnostics的一个非常酷的库添加库,它增加了丰富的格式化功能,类似于你可以用log4net和NLog做的.此库对您的应用程序施加仅配置依赖项,而不是代码或引用依赖项.

  • 为什么我不能这次5次?真棒的答案!非常感谢! (2认同)