【问题标题】:EventLog Source name for .NET Core 3.1 Windows Service.NET Core 3.1 Windows 服务的 EventLog 源名称
【发布时间】:2021-05-06 15:06:58
【问题描述】:

上下文

我有一个作为 Windows 服务运行的 .NET Core 3.1 控制台应用程序。 它的设置使用:

Host.CreateDefaultBuilder(args)
    .UseWindowsService()

并使用 sc.exe create 作为 Windows 服务安装。

问题

有些用户想在同一台机器上安装同一个控制台应用程序的多个版本,这很好用! 但是,在事件查看器中查看日志时,您无法分辨每条记录属于哪个 Windows 服务,因为它们都具有相同的源名称。

是否有在安装时设置源名称的标准方法?

研究

  • The documentation 表示UseWindowsService 会将“应用程序名称”设置为默认源名称。总是同一个名字。
  • This issue 好像表示没有办法通过配置来实现。
  • 下面的代码允许我手动设置它,但我想遵循 行业标准(如果存在):
// Inside .ConfigureServices((hostContext, services) =>
services.Configure<EventLogSettings>(settings =>
{
    settings.SourceName = "My chosen name";
});

【问题讨论】:

    标签: c# windows-services .net-core-3.1


    【解决方案1】:

    据我所知,解决此问题的经典方法是像这样配置几个文件 appsettings.json:

    appsettings.First.json
    
    {
      "Logging": {
        "EventLog": {
          "LogName": "Test app",
          "SourceName": "FirstInstance"
        }
      }
    }
    
    appsettings.Second.json
    
        {
          "Logging": {
            "EventLog": {
              "LogName": "Test app",
              "SourceName": "SecondInstance"
            }
          }
        }
    

    然后按照您在示例中显示的方式设置它,但要引用 appsettings.json 部分:

    public static IHostBuilder CreateHostBuilder(string[] args) =>
                Host.CreateDefaultBuilder(args)
                .UseWindowsService()
                .ConfigureLogging((hostingContext, logging) =>
    {
        logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
        logging.AddConsole();
        logging.AddEventLog(hostingContext.Configuration.GetSection("Logging:EventLog").Get<EventLogSettings>());
    })
                .ConfigureServices((hostContext, services) =>
                {
                    services.AddHostedService<Worker>();
                });
    

    然后您使用两种配置构建服务并安装两个实例。 因此,您的日志记录将记录在同一事件文件夹中,但“源名称”列中的值会有所不同。

    【讨论】:

    • 有几件事让我对你的回答感到困惑。您是建议为每个构建的工件部署多个 appsettings.json 文件,还是在已部署的工件中修改单个 appsettings.json?如果您建议使用多个 appsettings.json,那么您演示的代码如何知道要加载哪个 appsettings 文件?感觉好像我应该忽略您答案中的appsettings.Second.json,而只阅读有关通过EventLogSettings 添加LogNameSourceName 的部分。
    • 您可以使用环境变量。 docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/… 对于 Web 应用程序,您可以将变量更改为 IIS。如果是我不知道的windows服务,也许可以帮助stackoverflow.com/a/2728574/13898743
    • 我真的不明白环境变量有什么帮助。每次安装如何区分它们?
    • 无法区分安装,但您不需要它。您在一个工件中创建应用程序的两个实例。如果您在文章中阅读了 CreateDefaultBuilder 的工作顺序,您就会知道它将在构建后以相同的默认配置运行,因为您还没有设置任何环境变量。
    • 然后,如果您可以使用 IIS,则为第一个服务设置第一个 env var,为第二个服务设置第二个 env var。然后你重新启动两个服务并开始使用适当的配置,这种方式的优点是你可以交换环境变量(所以你可以在第一个服务中将其更改为第二个,然后在第二个中更改为第一个),之后你需要的是只重启服务,没有任何重建。在 .Net Framework 中配置环境变量的方式可能更简单,您可以在构建之前在 Azure 中进行设置,但如果您决定交换变量,则需要重新构建项目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    • 2021-01-04
    • 2021-09-28
    • 2021-03-14
    • 1970-01-01
    • 2021-11-17
    相关资源
    最近更新 更多