如何在 .net 核心工作者服务中保存登录文件?

How to save log in file in .net core worker service?

现在,我正在开发 .Net 核心工作者服务,我想将我项目的错误保存在一个文件(文本文件)中 我找不到这方面的任何设置

  .ConfigureLogging((hostingContext, logging) =>
                  {
                      logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
                      logging.AddEventLog(new EventLogSettings()
                      {
                          SourceName = "CallerTestCacheServiceCoreAPI",
                          LogName = "CallerTestCacheServiceCoreAPILog",

                      });
                  })

如果您真的需要,有几个第三方提供商可以处理日志汇到文件。

serilog 是一个很好的例子,请查看下面的自述文件

https://github.com/serilog/serilog-sinks-file

我在另一个class像这个项目中添加了一个扩展方法 https://github.com/MV10/Serilog.Dependency.Injection

    public static IServiceCollection AddSerilogServices(this IServiceCollection services)
        {
            return services.AddSerilogServices(
                new LoggerConfiguration()
                    .MinimumLevel.Verbose()
                     .WriteTo.File("log.txt")
                     //.WriteTo.File(new CompactJsonFormatter(), "log.txt")
                    .WriteTo.Console());
        }

并在program.cs服务中介绍

 services.AddSerilogServices();

在我的工人 class 中:

    readonly Serilog.ILogger _log;

        public Worker(  Serilog.ILogger log)
        {

            _log = log;
            log.Information("Hello World!");

        }

成功了

在Main方法中(程序class):

 var configuration = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json")
            .Build();
        Log.Logger = new LoggerConfiguration()
            .ReadFrom.Configuration(configuration)
            .CreateLogger();

在 IHostBuilder 方法中,添加 UseSerilog():

Host.CreateDefaultBuilder(args)
            .UseSerilog()

在您的控制器中,使用 DI 获取记录器的实例,添加以下内容:

public class MyController: Controller
{
    private ILogger _logger;
    public MyController(ILogger<MyController> logger)
    {
        _logger = logger;
    } }

要记录消息,请使用 _logger 实例,例如: _logger.LogInformation("User {user} logged in", user_record);

希望这对您有所帮助。

要使用 Serilog 记录器,请将您的 Program class 更改为:

public class Program
{
    public static void Main(string[] args)
    {
        Log.Logger = new LoggerConfiguration()
            .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
            .Enrich.FromLogContext()
            .CreateLogger();

        try
        {
            CreateHostBuilder(args).Build().Run();
        }
        catch (Exception ex)
        {
            Log.Fatal(ex, "Host terminated unexpectedly");
        }
        finally
        {
            Log.CloseAndFlush();
        }
    }

    public static IHostBuilder CreateHostBuilder(string[] args)
        => Host.CreateDefaultBuilder(args)
            .ConfigureServices((hostContext, services) =>
            {
                // Add your services and workers here
                services.AddHostedService<Worker>();
            })
            .UseSerilog((hostingContext, services, loggerConfiguration) =>
                loggerConfiguration
                    .ReadFrom.Configuration(hostingContext.Configuration));
}

在您的 appsettings.json 中删除 "Logging" 部分并将其替换为 "Serilog" 部分(如 here 所述)或在代码中指定设置。

此答案基于 Serilog 库 (link) 为 asp net core sink 给出的说明,因为 Worker 模板使用相同的系统作为 asp 网络核心项目托管。