【问题标题】:Windows Service started and then stopped, but no loggingWindows 服务启动然后停止,但没有日志记录
【发布时间】:2016-05-12 07:39:49
【问题描述】:

昨天,我在 Windows 10 中将可执行文件 C:\Users\urban\Documents\Visual Studio 2013\Projects\TestService\obj\Release\TestService.exe 作为服务安装,因此它现在显示在 services.msc 中。然后我启动它,错误消息就像

本地计算机上的“服务名称”服务启动然后停止。如果某些服务没有被其他服务或程序使用,它们会自动停止。

今天,我回到VS,添加了EventLog,然后try...catch,这样我的代码现在是这样的:

internal class TestService : ServiceBase
{
    Thread Worker;
    AutoResetEvent StopRequest = new AutoResetEvent(false);
    Toolkit toolkit;

    protected override void OnStart(string[] args)
    {
        try {
            EventLog.Log = "Application";
            EventLog.Source = "TestService";
            EventLog.WriteEntry("Starting Test Service", EventLogEntryType.Information);
            var User = System.Security.Principal.WindowsPrincipal.Current;
            toolkit = new ServiceToolkit(User);
            Worker = new Thread(DoWork);
            Worker.Start();
        }
        catch (Exception e)
        {
            EventLog.WriteEntry(e.GetType().Name + ": " + e.Message, EventLogEntryType.Error);
            throw;
        }
    }

我编译它并尝试从services.msc 启动它。尽管错误消息仍然相同,但我希望该服务至少记录它已启动以及引发了哪个错误。但是纳达。我在启动服务之前清除了事件查看器的“应用程序”协议,同时添加的少数日志不是来自我的服务。

这是怎么回事?

【问题讨论】:

  • 看看msdn.microsoft.com/en-us/library/zt39148a(v=vs.110).aspx(演练:创建 Windows 服务)
  • ServiceBase[] ServicesToRun; TestService ts = new TestService (); ts.AutoLog = true; ServicesToRun = new ServiceBase[]{ts}; ServiceBase.Run(ServicesToRun);
  • 查看youtube 并按照这些步骤操作如何在 c# 中创建 Windows 服务。看完这些步骤后我得到了同样的错误我的错误消失了。

标签: c# windows-services event-viewer


【解决方案1】:

如果在服务安装时所有的事件源都是已知的,我建议你提前注册这些源,这样你就可以得到日志条目。 在这种情况下,您可以创建自己的简单记录器,它可以灵活地提供您指定的日志。

这是我在服务中使用的记录器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

    namespace TestWindowService
    {
        public static class MyLogger
        {
            public static void WriteErrorLog(Exception ex)
            {
                StreamWriter sw = null;
                try
                {
                    sw = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "\\LogFile.txt", true);
                    sw.WriteLine(DateTime.Now.ToString() + ": " + ex.Source.ToString().Trim() + "; " + ex.Message.ToString().Trim());
                    sw.Flush();
                    sw.Close();
                }
                catch
                {
                }
            }

            public static void WriteErrorLog(string Message)
            {
                StreamWriter sw = null;
                try
                {
                    sw = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "\\LogFile.txt", true);
                    sw.WriteLine(DateTime.Now.ToString() + ": " + Message);
                    sw.Flush();
                    sw.Close();
                }
                catch
                {
                }
            }
        }
    }

我只是简单地使用它

MyLogger.WriteErrorLog("Test window service started!");

在服务停止的时候直接写。您可以识别错误/原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多