首页 > 解决方案 > 如何在 Worker Service .NET Core for Linux 中实现日志

问题描述

我正在Worker Service为服务开发 .NET Core 3.1 新项目模板Linux。我想为 Linux 实现日志记录。

我必须生成一个text文件并登录该文件。我已经尝试了一些东西,但这并没有为Linux daemon.

Program class代码

public static void Main(string[] args)
{
    Log.Logger = new LoggerConfiguration()
        .MinimumLevel.Debug()
        .MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
        .Enrich.FromLogContext()
        .WriteTo.File(@"F:\Logs\Worker\logfile.txt").CreateLogger(); //On this location folder and file will be created

    IHost host = CreateHostBuilder(args).Build();

    host.Services.UseScheduler(scheduler =>
    {
        scheduler
          .Schedule<ReprocessInvocable>()
          .EveryThirtySeconds();
    });
    host.Run();
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args).UseSystemd()

.ConfigureServices(services =>
{
    services.AddScheduler();
    services.AddTransient<ReprocessInvocable>();
}).UseSerilog();

ReprocessInvocable.cs调用的类代码Main

public async Task Invoke()
{
    _logger.LogInformation("Information - Worker running at: {time}", DateTimeOffset.Now);
    _logger.LogWarning("Warning - Worker running at: {time}", DateTimeOffset.Now);
    _logger.LogError("Error - Worker running at: {time}", DateTimeOffset.Now);;
    Log.Information("Invoke has called at: {time}", DateTimeOffset.Now);
    //return Task.CompletedTask;
}

我怎样才能使它适用于Linux可执行文件?还是现有代码应该可以正常工作?

编辑1:

1)你用什么来运行你的守护进程?监督?系统化?

我使用 Systemd 安装守护进程。

2)你对“登录Linux”有什么期望吗?

我想在守护进程启动时生成一个文本文件(这在 Windows 中很容易:))并记录/写入文本,例如在 {time} 调用的 Method1 和在 {time} 调用的 Method2 等。只是为了跟踪服务流程.

3)你想要一个磁盘上的日志文件吗?

对于Linux,我想登录Linux机器存储。

4)或者进入系统日志的日志?

如果这给了我一个带有例外日志的文件,那么它也可以。

标签: .netlinuxasp.net-corelogging.net-core

解决方案


如果简单地写入 Linux 系统日志(位于 的那个/var/log/syslog)是适合您的解决方案,那么您可以简单地执行以下操作:

[DllImport("libc")]
private static extern void syslog(int priority, string message);

并使用它来记录到syslog存储。

我为 C# 编写了一个非常简单的"syslog.h"包装器,并在此处作为要点发布:https ://github.com/jitbit/SyslogCore只需在您的项目中包含一个短.cs文件,然后使用:

Syslog.Write(Syslog.Level.Warning, "My service name", "something went wrong");

推荐阅读