Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在库DLL中使用EventLogTraceListener_C#_.net_Logging - Fatal编程技术网

C# 在库DLL中使用EventLogTraceListener

C# 在库DLL中使用EventLogTraceListener,c#,.net,logging,C#,.net,Logging,我编写了一个库,它被驻留在同一文件夹中的多个应用程序调用。目前,它将log4net与log4net.config文件一起用于事件日志记录,效果良好。但是log4net现在是一个休眠项目,没有可预见的更新,而且似乎EventLogTraceListener可以在不依赖第三方库的情况下完成大致相同的事情。但是,我不确定是否有方法将app.config文件(开箱即用)与DLL一起使用。例如,下面的app.config文件在控制台应用程序(MyApp.exe.config)中工作,但在仅使用my DLL

我编写了一个库,它被驻留在同一文件夹中的多个应用程序调用。目前,它将log4net与log4net.config文件一起用于事件日志记录,效果良好。但是log4net现在是一个休眠项目,没有可预见的更新,而且似乎
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
     }
}