gpt4 book ai didi

c# - 通过 app.config 关闭跟踪

转载 作者:IT王子 更新时间:2023-10-29 04:46:57 27 4
gpt4 key购买 nike

我正在尝试使用 System.Diagnostics 进行一些非常基本的日志记录。我想我会使用盒子里的东西,而不是像 Log4Net 或 EntLib 这样的额外依赖。

我已经准备就绪,追踪工作非常顺利。代码片段:

Trace.TraceInformation("Hello World")

应用程序配置:

<?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>

我的小“Hello World”很好地显示在我的 Trace.log 文件中。但现在我想关闭跟踪,所以我深入 MSDN 并找到 How to: Configure Trace Switches .我添加 <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>

value="0"应该关闭跟踪 - 至少如果你随后关注 How to: Create and Initialize Trace Switches ,它告诉您添加这行代码:

Dim dataSwitch As New BooleanSwitch("Data", "DataAccess module")

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

无论如何,我确定我错过了某处非常明显的东西。请帮忙。

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

最佳答案

我同意@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);
}
}

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

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

使用 app.config 文件,您还可以以相同的方式控制所有 TraceSources(或 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);
}
}

这样,您可以使应用程序中的所有日志记录发生在同一级别(或关闭或使用相同的 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);
}
}

通过以这种方式对您的类进行检测,您可以将应用日志的“数据访问”部分设置在一个级别,而将应用日志的“分析”部分设置在不同级别(当然,您的应用的任何一个或两个部分)可以配置为禁用日志记录)。

这是配置 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>

如您所见,您可以配置单个 TraceSource 和单个 Switch,并且所有日志记录都将在单一级别的控制下发生(即,您可以关闭所有日志记录或使其在特定级别记录)。

或者,您可以定义多个 TraceSources(并在您的代码中引用相应的 TraceSources)和多个 Switches。开关可以共享(即多个 TraceSources 可以使用同一个开关)。

最终,通过现在付出更多努力来使用 TraceSources 并在代码中引用适当命名的 TraceSources(即逻辑上定义 TraceSource 名称,以便您可以对应用程序中的日志记录进行所需程度的控制),您从长远来看,将获得显着的灵 active 。

这里有一些链接可能会在您继续使用 System.Diagnostics 时为您提供帮助:

.net Diagnostics best practices?

Logging best practices

What's the best approach to logging?

Does the .Net TraceSource/TraceListener framework have something similar to log4net's Formatters?

在我发布的链接中,经常讨论“最佳”日志框架。我并不是要说服您从 System.Diagnostics 进行更改。这些链接也往往包含有关使用 System.Diagnostics 的有用信息,这就是我发布它们的原因。

我发布的几个链接包含指向 Ukadc.Diagnostics 的链接.这是一个非常酷的 System.Diagnostics 附加库,它添加了丰富的格式化功能,类似于您可以使用 log4net 和 NLog 执行的操作。此库对您的应用施加仅配置依赖性,而不是代码或引用依赖性。

关于c# - 通过 app.config 关闭跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4144394/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com