【问题标题】:C# Windows Service creates trace file but never writes to itC# Windows 服务创建跟踪文件但从不写入
【发布时间】:2011-07-10 20:57:16
【问题描述】:

我在 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 方法中有更多跟踪调用。

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

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

这看起来像 another question 中的症状,但我也遇到了 LocalSystem 的问题(我认为它有太多的权限,所以被弃用了)。

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

感谢您的帮助

【问题讨论】:

    标签: c# windows-services file-permissions


    【解决方案1】:

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

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

    【讨论】:

    • 如果我作为 LocalSystem 而不是 LocalService 运行,将 trace.AutoFlush 设置为 true 可以解决问题。拥有“~MyClass(){Trace.Flush();}”没有帮助。但是,是的,该项目已启用跟踪。
    【解决方案2】:

    尝试在应用程序的 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 工具下的服务配置编辑器来执行此操作。

    【讨论】:

    • 不,它适用于 Web 和 Windows 应用程序。对于 web,您需要将其添加到 web.config,对于 exe,它将位于 app.exe.config.refer msdn 文档中 msdn.microsoft.com/en-us/library/… windows 服务仍然是一个 exe,它应该可以工作。或者你可以编写一个自定义的跟踪监听器并在配置文件中进行配置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多