我有一个WCF类库,我作为Windows服务托管。问题是当我以调试模式运行服务作为控制台应用程序时,它会正确记录到事件日志中。但是当我使用我使用inno设置创建的安装文件将其作为Windows服务托管时,它不会出于某种原因记录任何内容。
<system.diagnostics>
<switches>
<add name="Retail.ReaderService.Switch" value="4" />
</switches>
<trace autoflush="false" indentsize="4">
<listeners>
<add name="EventLogTraceListener" type="System.Diagnostics.EventLogTraceListener" initializeData="ServiceLog" />
</listeners>
</trace>
</system.diagnostics>
我在主app.config文件中有这些设置。我尝试将autoflush属性更改为true但它不起作用。请帮忙。
谢谢,
答案 0 :(得分:0)
当你在调试模式下运行程序时,它就像你一样运行,Govs。如果您在计算机上的管理员组中,该程序以管理员身份运行,并且有权读取/写入事件日志。但是当您将程序作为Windows服务运行时,它只具有为该用户帐户分配的权限,它似乎无权写入事件日志。
我遇到了同样的问题并写了这个函数来检测我是否有权写入事件日志。
private void GetServicePermissionLevel()
{
bool bAdmin = false;
try {
SecurityIdentifier sidAdmin = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null);
AppDomain myDomain = Thread.GetDomain();
myDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
WindowsPrincipal myPrincipal = (WindowsPrincipal)Thread.CurrentPrincipal;
if (myPrincipal.IsInRole(sidAdmin)) {
bAdmin = true;
} else {
bAdmin = false;
}
} catch (Exception ex) {
throw new Exception("Error in GetServicePermissionlevel(): " + ex.Message + " - " + ex.StackTrace);
} finally {
_ServiceRunAsAdmin = bAdmin;
}
}
然后,当我想做一些事件记录时,我使用它:
if (_ServiceRunAsAdmin)
EventLog.WriteEntry(c_ServiceName, "Error in GetServiceHostParamSet: " + ex.Message + ". This parameter not found: " + sName);
希望这有帮助。
答案 1 :(得分:0)
我遇到了同样的问题。解决方案是确保您的WCF应用程序的系统诊断设置也在Windows服务的app.config中设置。一旦我复制了我的日志就出现了。