C# 在库DLL中使用EventLogTraceListener
我编写了一个库,它被驻留在同一文件夹中的多个应用程序调用。目前,它将log4net与log4net.config文件一起用于事件日志记录,效果良好。但是log4net现在是一个休眠项目,没有可预见的更新,而且似乎C# 在库DLL中使用EventLogTraceListener,c#,.net,logging,C#,.net,Logging,我编写了一个库,它被驻留在同一文件夹中的多个应用程序调用。目前,它将log4net与log4net.config文件一起用于事件日志记录,效果良好。但是log4net现在是一个休眠项目,没有可预见的更新,而且似乎EventLogTraceListener可以在不依赖第三方库的情况下完成大致相同的事情。但是,我不确定是否有方法将app.config文件(开箱即用)与DLL一起使用。例如,下面的app.config文件在控制台应用程序(MyApp.exe.config)中工作,但在仅使用my DLL
EventLogTraceListener
可以在不依赖第三方库的情况下完成大致相同的事情。但是,我不确定是否有方法将app.config文件(开箱即用)与DLL一起使用。例如,下面的app.config文件在控制台应用程序(MyApp.exe.config)中工作,但在仅使用my DLL(MyLibrary.DLL.config)时不工作:
代码:
我想,跟踪侦听器配置应该放在启动程序集的
app.config
中。您还可以通过代码配置所有内容,这应该很好,如果您一直使用相同的配置,我想跟踪侦听器配置应该放在启动程序集的app.config
中。您还可以通过代码配置所有内容,如果您一直使用相同的配置,那么应该可以
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/>
</startup>
<system.diagnostics>
<trace autoflush="true" indentsize="0">
<listeners>
<add name="MyListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="MyListener.log"/>
<add name="MyEventListener" type="System.Diagnostics.EventLogTraceListener" initializeData="MyLog"/>
</listeners>
</trace>
<switches>
<add name="MySwitch" value="Verbose"/>
</switches>
</system.diagnostics>
</configuration>
var log = Trace.Listeners.OfType<EventLogTraceListener>().First(); // Works for an app but not a DLL (no listener)
log.TraceEvent(new TraceEventCache(), "Delme1", TraceEventType.Verbose, 123, "Testing");
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.diagnostics>
<sources>
<source name="MyExceptionLibrary" switchName="MySwitch" switchType="System.Diagnostics.SourceSwitch">
<listeners>
<remove name="Default"/>
<add name="MyListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="Logger.log">
<filter type="System.Diagnostics.EventTypeFilter" initializeData="Off"/>
</add>
<add name="MyEventListener" type="System.Diagnostics.EventLogTraceListener" initializeData="Blah">
<filter type="System.Diagnostics.EventTypeFilter" initializeData="Verbose"/>
</add>
</listeners>
</source>
</sources>
<switches>
<add name="MySwitch" value="Verbose"/>
</switches>
</system.diagnostics>
</configuration>
public static class Logger
{
private static readonly TraceSource s_traceSource = new TraceSource("MyExceptionLibrary");
static Logger()
{
var config = ConfigurationManager.OpenExeConfiguration("MyExceptionLibrary.dll"); // Confirmed config loaded
ConfigurationManager.RefreshSection("system.diagnostics"); // Doesn't seem to make any difference
Debug.WriteLine($"Config file: {config.FilePath}"); // Points to new config file
var section = config.GetSection("system.diagnostics"); // Contains data from file
Debug.Write(section.SectionInformation.Type); // SystemDiagnosticSection
Trace.Refresh(); // Doesn't seem to make any difference
Debug.WriteLine(s_traceSource.Listeners[0].Name); // Still shows Default
s_traceSource.TraceEvent(TraceEventType.Verbose, 123, "Testing"); // No event log entry is created
}
}