.net WCF Windows服务在托管时不记录到事件日志。

.net WCF Windows服务在托管时不记录到事件日志。,.net,wcf,rest,c#-4.0,windows-services,.net,Wcf,Rest,C# 4.0,Windows Services,我有一个WCF类库,作为windows服务托管。问题是,当我以调试模式运行服务时,它会正确地记录到事件日志中。但是,当我使用我用inno setup创建的安装文件作为Windows服务宿主时,由于某些原因,它不会记录任何内容 <system.diagnostics> <switches> <add name="Retail.ReaderService.Switch" value="4" /> </switches> <trace auto

我有一个WCF类库,作为windows服务托管。问题是,当我以调试模式运行服务时,它会正确地记录到事件日志中。但是,当我使用我用inno setup创建的安装文件作为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,但它不起作用。请帮忙


谢谢,

当您在调试模式下运行程序时,它将按您的方式运行,Govs。如果您在计算机上的admin组中,则该程序以管理员身份运行,并且它有权读取/写入事件日志。但是,当您将程序作为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;
}
}
我也遇到了同样的问题,编写这个函数是为了检测我是否有权写入事件日志

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);

希望这能有所帮助。

我遇到了同样的问题。解决方案是确保在windows服务的app.config中也设置了适用于WCF应用程序的系统诊断设置。我一把我的抄过来,我的日志就出现了

嗨,布莱恩,我正在使用trace.writeline来写日志。你认为它也会有同样的问题吗?实际上我是电脑的管理员。所以我认为这不是问题所在。还有什么想法吗?没错。。。在调试模式下运行程序时,以管理员身份运行的程序将具有读取/写入事件日志的权限。但是你运行这个程序的windows服务帐户呢?可能没有管理员权限。我包含的代码将从运行程序的用户帐户中找到具有管理员权限的代码。因为没有管理员权限,您无法写入事件日志。如果我正在阅读此权限,此代码不只是检查您是否拥有权限,但实际上并不能帮助解决它不写入的问题吗?