如何将ASP.NET Core应用程序的日志消息记录到Linux上的特定文件中?

8
我将ASP.NET Core应用程序安装为Linux守护进程。默认情况下,.NET将日志写入/var/log/message,但我希望该应用程序将其日志写入特定文件并永久存储。
我该如何做?该应用程序使用Microsoft.Extensions.Logging

你为什么想要更改文件夹?你可能想要查看像 fluentd 这样的日志聚合器,用于 Docker 容器。 - illug
@illug 这与日志聚合器或容器无关。/var/log/message甚至不被文件日志提供程序使用,它只被debug日志提供程序使用。另一个提供程序可以将目标定位到聚合器以及其他目标。 - Panagiotis Kanavos
你尝试过像Serilog这样的解决方案吗?它可以处理许多不同的写入器,如文件、滚动文件、Elasticsearch、数据库等。 - hugo
2个回答

8
日志记录会按照您指定的位置进行记录,而不是固定的某个位置。只有Debug Provider使用/var/log/message位置。
您需要在项目的日志配置中指定要使用的日志提供程序,如.NET Core中的日志记录文章所示。

没有内置的文件提供程序,关于是否应该有一个正在进行讨论。将日志记录到文件并不像听起来那么简单-消息应该如何格式化?滚动文件怎么办?文件名呢?也许您希望错误和详细消息被写入不同的文件?或者在应用程序中使用每个子系统/区域/记录器/业务的不同文件,例如为销售服务记录一条日志,为外部服务调用记录另一条日志?

有很多好的开源日志记录库,如Serilog和NLog,可以解决这些问题。其中一些最受欢迎的列在.NET Core的文档。.NET Core的日志记录可以配置为轻松使用这些库。

例如,您可以添加适当的软件包Serilog文件目标
要使用它,您需要在csproj文件中添加对软件包的引用:
<PackageReference Include="Serilog.Extensions.Logging.File" Version="2.0.0" />

然后使用 AddFile 调用将其添加到日志配置中:

WebHost.CreateDefaultBuilder(args)
    .ConfigureLogging((hostingContext, logging) =>
    {
        logging.AddFile("path/to/Logs/myapp-{Date}.txt");
    })
    .UseStartup<Startup>()
    .Build();

{Date}参数用于按日期创建滚动日志文件。

您可以结合多个记录器,例如您可以使用logging.AddConsole()将日志写入控制台,或者在开发过程中继续将日志写入/var/log/message 使用logging.AddDebug();

如果在NuGet中搜索Extensions.Logging,可以找到许多日志提供程序。

您还可以集成其他库,如Serilog,并使用它们的记录器。例如,您可以使用Serilog.Sinks.Fluentd包来定位Fluentd。


我正在使用Ubuntu 20.04,有一个名为/var/log/syslog的文件,但是其中不存在.NET 6日志。有什么想法吗? - variable

1
默认情况下,dotnet会将日志写入/var/log/message。只有当您使用“Debug logging provider”时,才会记录对Debug.WriteLine的调用。这些调用在“release”版本中被忽略,编译器会从您的应用程序中删除它们,除非您具有DEBUG构建常量。
现在回到问题:我也很惊讶.NET 5在Linux上没有内置的日志记录功能。特别是考虑到Linux已经拥有了出色的内置日志记录工具几十年了。例如像syslog这样的工具。只需将内容发送到/dev/log套接字,linux就会处理剩余的部分-写入文件、轮换日志等等。
因此,我编写了一个(非常!)简短的C#文件,它只是使用DllImport从libc调用内置的syslog()函数。
它不是巨大的Nuget依赖项,也不是“logging provider”,也不是DI服务或其他什么东西。只有一个1kb的C#文件,您可以将其放入您的项目中,并像这样记录一些内容:
Syslog.Write(Syslog.Level.Warning, "MyAwesomeApp", "something went wrong");

这是要点 https://github.com/jitbit/SyslogCore

P.S. 这并不是直接回答问题,但当我搜索在 .NET 5 下记录 Linux 日志的方法时,这个页面一直弹出。所以我决定发表另一个答案。


我正在使用Ubuntu 20.04,有一个名为/var/log/syslog的文件,但是其中不存在 .net 6 日志。有什么想法吗? - variable
@variable 请查看链接仓库中的常见问题解答,如果有任何问题,请提交 GitHub issue。 - Alex from Jitbit
@AlexfromJitbit 根据变量的注释,/var/log/syslog 中没有属于 syslog:adm 的日志。但是 dotnet 需要 www-data。我只需要一个调试日志,在我们启动应用程序 dotnet -d app.dll 时打印出来,以便找出为什么我的应用程序在每秒 20 个请求时会挂起。你能对此进行澄清吗? - Khurshid Alam

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