我将所有服务逻辑封装在类库中。当我在命令行应用程序中实例化类库时,我会收到跟踪信息。
当我在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>
答案 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;
}