C#Windows服务创建跟踪文件但从不写入它

时间:2011-03-08 05:47:50

标签: c# windows-services file-permissions

我在VS 2010中使用“new ... c#service”菜单创建了一个Windows服务。在构造函数中我有:

TextWriterTraceListener tr1 = new TextWriterTraceListener( System.IO.File.CreateText("d:\\output\\test.log"));
Trace.Listeners.Add(tr1);
Trace.WriteLine("Created");

将服务设置为在LocalService或LocalSystem帐户(WinXP)中运行我获取服务启动时创建的文件,但它始终为空。向析构函数添加Flush()调用没有帮助。我在OnStart / OnStop / OnPause / OnContinue方法中有更多跟踪调用。

(编辑)我在项目中启用了跟踪和调试 - 正在创建跟踪输出文件 ,它只是空的。

该服务将从数据库中提取记录,并将文件写入磁盘,以用于我们必须与之交互的消息系统。因此,日志文件问题只是更广泛问题的第一个实例 - 我需要能够写入用户选择的消息传递目录。

这看起来像another question中的症状,但我也把问题当作LocalSystem(我认为它有太多的权限因此被弃用)。

  1. 跟踪调用我做错了什么? (为什么创建文件但没有写入文件?)
  2. 如果我希望我的服务在LocalService帐户中运行,是否有某种方法可以让安装程序授予其写入文件夹/子树的权限?
  3. 或者我应该将服务作为LocalSystem运行吗?
  4. 这是[Debug.Launch / EnsureWriter] [2]重新实现的理智解决方案吗?我更倾向于说“为什么是作者空”而不是像其他地方那样粘贴代码。
  5. 感谢您的帮助

2 个答案:

答案 0 :(得分:5)

您确定为项目定义了TRACE符号吗?基于此符号有条件地编译所有System.Diagnostics.Trace代码。请注意,您仍然需要刷新跟踪输出以确保写入所有行(或将Trace.AutoFlush设置为true)。

作为旁注,我建议不要使用静态Trace方法,并建议至少使用System.Diagnostics.TraceSource

答案 1 :(得分:1)

尝试在应用程序的app.exe.config中配置跟踪。

<configuration>
   <system.diagnostics>
    <sources>
        <source name="System.ServiceModel" 
            switchValue="Information, ActivityTracing"
            propagateActivity="true">
        <listeners>
         <add name="traceListener" 
           type="System.Diagnostics.XmlWriterTraceListener" 
           initializeData= "c:\log\Traces.svclog" />
        </listeners>
     </source>
    </sources>
   </system.diagnostics>
</configuration>

您可以使用Microsoft Windows SDK工具下的服务配置编辑器来执行此操作。