Windows 服务启动然后停止,但没有记录
Windows Service started and then stopped, but no logging
昨天,我将可执行文件 C:\Users\urban\Documents\Visual Studio 2013\Projects\TestService\obj\Release\TestService.exe
作为服务安装在 Windows 10 中,因此它现在显示在 services.msc
中。然后我启动它,错误消息就像
The "service name" service on Local Computer started and then stopped. Some services stop automatically if they are not in use by other service or programs.
今天,我回到 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
启动它。尽管错误消息仍然相同,但我希望该服务至少记录它已启动以及已抛出的错误。但是虚无。我在启动服务之前清除了事件查看器的 "Application" 协议,同时添加的一些日志不是来自我的服务。
这是怎么回事?
如果在服务安装时所有事件源都是已知的,我建议您提前注册这些源,然后您就可以获取日志条目。
在这种情况下,您可以创建自己的简单记录器,它可以灵活地提供您指定的日志。
这是我在服务中使用的记录器
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!");
停止服务的时候写就行了。您可以识别 error/reason.
昨天,我将可执行文件 C:\Users\urban\Documents\Visual Studio 2013\Projects\TestService\obj\Release\TestService.exe
作为服务安装在 Windows 10 中,因此它现在显示在 services.msc
中。然后我启动它,错误消息就像
The "service name" service on Local Computer started and then stopped. Some services stop automatically if they are not in use by other service or programs.
今天,我回到 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
启动它。尽管错误消息仍然相同,但我希望该服务至少记录它已启动以及已抛出的错误。但是虚无。我在启动服务之前清除了事件查看器的 "Application" 协议,同时添加的一些日志不是来自我的服务。
这是怎么回事?
如果在服务安装时所有事件源都是已知的,我建议您提前注册这些源,然后您就可以获取日志条目。 在这种情况下,您可以创建自己的简单记录器,它可以灵活地提供您指定的日志。
这是我在服务中使用的记录器
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!");
停止服务的时候写就行了。您可以识别 error/reason.