.Net Windows服务和自定义跟踪侦听器

时间:2010-07-09 22:41:05

标签: c# windows-services trace tracelistener

我将所有服务逻辑封装在类库中。当我在命令行应用程序中实例化类库时,我会收到跟踪信息。

当我在Windows服务中实例化该类时,我看到我的自定义跟踪侦听器已创建了日志目录并启动了一个文件,但它保持为0 KB。

两个应用程序都在.config:

中有这个
 <system.diagnostics>
<switches>
  <add name="PTraceSwitch" value="Verbose" />
</switches>
<trace autoflush="true">
  <listeners>
    <add name="CustomXmlWriterTraceListener" />
    <add name="MyServiceEventListener"  />
    <remove name="Default" />
  </listeners>
</trace>
<sharedListeners>
  <add
     type="CustomUtilities.CustomXmlWriterTraceListener, CustomUtilities"
     name="CustomXmlWriterTraceListener"
     initializeData="Logs\MyService.svclog"
     RollLogAtMidnight="True"
     DateFormat="yyyy.MM.dd"
     MaxFileSizeMB="1"
     CompressLogsOlderThanTimeSpan="1.00:0:00"
     DeleteLogsOlderThanTimeSpan="30.00:00:00"/>

  <add name="MyServiceEventListener"
       type="System.Diagnostics.EventLogTraceListener"
       initializeData="MyServiceEventLog">
    <filter type="System.Diagnostics.EventTypeFilter"
      initializeData="Warning" />
  </add>
</sharedListeners>

1 个答案:

答案 0 :(得分:0)

当使用服务而不是类库或exe运行时,我的CustomXmlWriterTraceListener似乎表现不同。

我将此添加到我的服务中以调试主入口点并遍历我的监听器的init:

Debugger.Launch();

当我运行我的服务时,底层的Writer为null,它通常在基础构造函数中填充。我使用.NET Reflector来查看XmlWriterTraceListener的功能。有一个内部方法EnsureWriter()。这个方法应该创建Writer。我克隆了微软的方法并将其添加到我的Listener中,一切似乎都没问题。我的听众现在适合提供服务。

 internal bool EnsureWriter()
    {
        bool flag = true;
        if (Writer == null)
        {
            flag = false;
            if (baseFileName == null)
            {
                return flag;
            }
            Encoding encodingWithFallback = new UTF8Encoding(false);
            string fullPath = Path.GetFullPath(baseFileName);
            string directoryName = Path.GetDirectoryName(fullPath);
            string fileName = Path.GetFileName(fullPath);
            for (int i = 0; i < 2; i++)
            {
                try
                {
                    Writer = new StreamWriter(fullPath, true, encodingWithFallback, 0x1000);
                    flag = true;
                    break;
                }
                catch (IOException)
                {
                    fileName = Guid.NewGuid().ToString() + fileName;
                    fullPath = Path.Combine(directoryName, fileName);
                }
                catch (UnauthorizedAccessException)
                {
                    break;
                }
                catch (Exception)
                {
                    break;
                }
            }
            if (!flag)
            {
                baseFileName = null;
            }
        }
        return flag;
    }