ASP.Net Core API自托管记录日志到文件

3
使用ASP.Net Core 5.0推出一个作为自己的Windows服务运行的Web API服务。我正在尝试弄清楚如何使用Microsoft.Extensions.Logging将日志写入文件。
我想能够在与应用程序一起推出的appsettings.json文件中指定日志文件的位置。我觉得我漏掉了什么。
我是否必须使用Microsoft.Extensions.Logging的另一个库(例如Serilog)才能实现这一点?我已经阅读了下面的链接,但没有看到关于文件记录的内容。

https://learn.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-5.0

我来自一个使用log4Net的背景,但是不知道如何让Microsoft.Extensions.Logging工作。
我尝试了Serilog,但是遇到了一个问题:当我调试时,似乎项目总是在IIS Express下运行,即使我将配置文件设置为项目名称,并将“启动”设置为“项目”。
我错过了什么?
2个回答

7

来自 Microsoft 文档:

ASP.NET Core 不包含用于将日志写入文件的日志提供程序。要从 ASP.NET Core 应用程序将日志写入文件,请考虑使用第三方日志提供程序。

对我来说,使用 Serilog 完全正常。

Program.cs:

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Serilog;
using Serilog.Events;

namespace WebApplication
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var config = new ConfigurationBuilder()
                .AddJsonFile("appsettings.json", optional: false)
                .Build();

            var path = config.GetValue<string>("Logging:FilePath");
            
            Log.Logger = new LoggerConfiguration()
                .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
                .Enrich.FromLogContext()
                .WriteTo.File(path)
                .CreateLogger();
            
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .UseSerilog()
                .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
    }
}

appsettings.json:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    },
    "FilePath" : "logs/AppLog.txt"
  },
  "AllowedHosts": "*"
}

控制器(或服务,根据需要而定):

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;

namespace WebApplication
{
    [ApiController]
    public class MyController : ControllerBase
    {
        private readonly ILogger<MyController> _logger;
        
        public MyController(ILogger<MyController> logger)
        {
            _logger = logger;
        }
        
        
        [HttpGet("/test")]
        public ActionResult<string> Test()
        {
            _logger.LogInformation("Hello World.");

            return "Success";
        }
    }
}

我安装的软件包:

<ItemGroup>
    <PackageReference Include="Serilog" Version="2.10.0" />
    <PackageReference Include="Serilog.AspNetCore" Version="4.1.0" />
    <PackageReference Include="Serilog.Sinks.File" Version="4.1.0" />
</ItemGroup>

关于在IISExpress上运行,这取决于您拥有的launchSettings.json文件,不太确定您遇到了什么问题。通常情况下,您在配置文件中使用"commandName": "Project"来使用Kestrel,而使用"commandName": "IISExpress"来使用IISExpress。然后您的IDE可以让您选择要运行的配置。

2

我基于Jakob的解决方案进行了一些微小的修改。

在appSettings.json中,我添加了文件路径:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    },
    "FilePath": "logs/AppLog.txt"
  },
  "AllowedHosts": "*"
}

在 Program.cs 文件中,我添加了以下代码:

using Serilog;

var config = new ConfigurationBuilder()
    .AddJsonFile("appsettings.json", optional: false)
    .Build();

var builder = WebApplication.CreateBuilder(args);

// Apply logging 
builder.Logging.ClearProviders();
var path = config.GetValue<string>("Logging:FilePath");
var logger = new LoggerConfiguration()
    .WriteTo.File(path)
    .CreateLogger();
builder.Logging.AddSerilog(logger);

我还安装了Nuget Packages:Serilog、Serilog.AspNetCore和Serilog.Sinks.File

在我的控制器构造函数中,我提供了日志记录器,这样我就可以在整个控制器中使用日志记录器:

private readonly ILogger<ExampleController> _logger;

public ExampleController(ILogger<ExampleController> logger)
{
    _logger = logger;
}

现在每当我记录异常时,我会调用_logger.LogError(ex.Message);,这个错误将被写入日志文件中,该文件在appSettings.json中定义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接