ASP.NET 核心 1.0 日志记录

ASP.NET Core 1.0 logging

我有 ASP.NET 核心网络 api 项目。现在我想 log 错误和事件。我以前在我的项目中使用过 ELMAH,但似乎 elmah 不适用于 ASP.NET Core。我参考 this Official link 配置 Microsoft 提供的默认日志记录服务。我看不出如何将这些日志保存在文本文件或数据库中。

如果ASP.NET Core 已经有默认的日志记录功能,我想知道我为什么要使用其他工具,如elmah、log4net。因此,当我再次搜索实现默认日志记录以将日志保存在数据库或文本文件中的文章时,我找不到任何文章。有没有什么方法可以使用 ASP.NET 核心对日志记录的内置支持将日志保存在文件中?

我目前正在使用完美运行的 Serilog,并且还下载了 seq 以便在浏览器中优雅地显示日志。但是,我仍然想知道如何使用内置的 asp.net 核心日志功能来实现相同的目的。

使用 Serilog 的日志文件:

使用 Seq 显示的日志:

默认情况下,ASP.NET Core 日志记录如果基于标准 .NET Core 抽象和所述抽象的实现.您提供的 link 正是您在使用日志记录服务时想要遵循的。这些将写入标准输出(输出window),例如在调试时。

您要查找的具体部分是 web.config。考虑以下因素:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" 
           resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" 
                forwardWindowsAuthToken="false" stdoutLogEnabled="true"
                stdoutLogFile="C:\temp\logs\log.log" />
  </system.webServer>
</configuration>

您正在寻找 stdoutLogEnabled and stdoutLogFile

stdoutLogEnabled If true, stdout and stderr for the process specified in processPath will be redirected to the file specified in stdoutLogFile.

stdoutLogFile Specifies the relative or absolute file path for which stdout and stderr from the process specified in processPath will be logged. Relative paths are relative to the root of the site. Any path starting with ‘.’ will be relative to the site root and all other paths will be treated as absolute paths.

有关 ASP.NET 核心 模块的详细信息,另请参阅 Publishing to IIS

ASP.NET Core 的日志子系统尚未提供文件记录器,但 creating one is being discussed.

在撰写本文时,为此目的使用 Serilog 或 NLog 是可行的方法。

您无法真正将 ASP.NET Core 中的内置日志记录与 ELMAH 进行比较。 ASP.NET Core logging 是一个简单的日志框架,您需要告诉它什么时候记录什么。 ELMAH 自动捕获所有未处理的异常并记录有关失败请求的大量上下文信息。 Seq sink 实际上实现了一些这样的行为,它通过 Seq 提供了额外的信息,如 Protocol、RequestId 和类似的信息,但这不是你可以通过 ASP.NET 日志记录开箱即用的东西。

ASP.NET 日志记录仍然是全新的,为什么其他框架和目标的记录器将开始出现。我确信基于文件的日志记录将很快实现,ELMAH 也肯定会移植到 ASP.NET Core。有关详细信息,请查看我的博客 post:ASP.NET Core Logging Tutorial.

我刚刚针对有关 ASP.NET 核心日志记录的博客 post 对这个主题进行了大量研究。我查看了内置的日志记录以及 NLog、SeriLog 和 log4net。

基本上我发现内置的 ILoggerFactory 工作正常但确实有一个明显的问题:它不会写入文件。它支持控制台、调试、ETW 和其他一些提供程序,但不支持文件。我假设是因为当您不得不开始担心最大文件大小、旋转以及所有其他随之而来的东西时,文件非常复杂。

内置的日志记录非常适合 .NET 内部构件,并且由于它们不需要写入文件,因此它确实不是 .NET 团队的限制。 Serilog 和 NLog 都提供了很少的扩展来启用文件写入。当然,这些库还全面提供了更多功能。

Serilog 的扩展只需要一行代码,它添加了文件日志记录。你可以在这里阅读:https://github.com/serilog/serilog-extensions-logging-file

这是我的博客 post 关于 ASP.NET 核心日志记录,如果有帮助的话:https://stackify.com/asp-net-core-logging-what-changed/

我会说,如果您有非常简单的日志记录需求,您可以使用文件扩展名使 built-in 日志记录工作。一旦您想使用任何高级功能,例如控制输出格式、记录到外部服务、文件轮换、最大文件大小等,您将需要使用 NLog 或 Serilog。