ASP.NET Core 1.0 日志记录

15

我有一个 ASP.NET Core web api 项目。现在我想要 记录 错误和事件。我之前在项目中使用 ELMAH,但似乎 elmah 不适用于 ASP.NET Core。我参考了 这个官方链接 来配置 Microsoft 提供的默认日志服务。但我没有找到如何将这些日志保存在文本文件或数据库中。

如果 ASP.NET Core 已经有了默认的日志功能,我想知道为什么我还需要使用像 elmah、log4net 这样的其他工具。所以当我搜索实现默认日志记录并将日志保存到数据库或文本文件的文章时,我找不到任何有用的信息。有没有办法使用 ASP.NET Core 内置的日志功能将日志保存到文件中呢?

我目前正在使用 Serilog,它可以完美地工作,并且还下载了 seq 来优雅地在浏览器中显示日志。但我仍然想知道如何使用内置的 asp.net core 日志功能来实现同样的功能。

使用 Serilog 记录日志文件:

使用 Seq 显示的日志: enter image description here


如果您认为我的答案正确,请随意接受它,如果不是,请告诉我,我会进行调整。 - David Pine
4个回答

8
默认情况下,ASP.NET Core日志记录基于标准的.NET Core抽象和实现。您提供的link正是您要遵循的消耗日志服务的内容。例如在调试时,它们将写入标准输出(输出窗口)。
您特别寻找的部分是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>

你正在寻找 stdoutLogEnabledstdoutLogFile
stdoutLogEnabled:若为true,则重定向processPath指定进程的标准输出和错误输出到stdoutLogFile指定的文件中。
stdoutLogFile:指定相对或绝对文件路径,用于日志记录processPath指定进程的标准输出和错误输出。相对路径相对于网站根目录。任何以“。”开头的路径将相对于站点根目录处理,所有其他路径将被视为绝对路径。
此外,请参阅有关 ASP.NET Core 模块的详细信息发布到IIS

不要忘记将包含日志的文件夹添加到解决方案结构中,并在project.json的publishOptions中列出它。https://docs.asp.net/en/latest/hosting/directory-structure.html。我刚刚做了这个,效果很好,并使用基于日期的命名约定(例如stdout_8440_201691620225.log)命名文件。默认情况下有点啰嗦,但可以进行调整。 - Marc Ziss

3

我为ASP.NET Core logging的博客文章做了大量研究,涉及内置日志以及NLog、SeriLog和log4net。

基本上,我发现内置的ILoggerFactory功能是可用的,但存在一个明显的问题:它不能写入文件。它支持控制台、调试、ETW和一些其他提供者,但不支持文件。我认为这是因为当你需要开始担心最大文件大小、旋转和所有相关的事情时,文件变得相当复杂。

内置日志对于.NET内部非常有效,因为它们不需要写入文件,因此对于.NET团队来说这并不是一个限制。 Serilog和NLog都提供了一些小扩展,以启用文件写入。当然,这些库在各个方面都提供了更多的功能。

Serilog的扩展只需要一行代码即可添加文件日志记录。您可以在此处阅读有关此扩展的信息:https://github.com/serilog/serilog-extensions-logging-file

如果需要帮助,请参考我的有关ASP.NET Core logging的博客文章:https://stackify.com/asp-net-core-logging-what-changed/

我想说,如果您的日志记录需求非常简单,则可以使用内置的日志记录和文件扩展。但是,一旦您想要进入任何高级功能,例如控制输出格式、记录到外部服务、文件旋转、最大文件大小等,您将需要使用NLog或SeriLog。


您可以轻松地将控制台输出重定向到文件中,API 不需要提供显式支持。 - IInspectable

2

ASP.NET Core的日志子系统目前还没有提供文件记录器,但正在讨论创建一个

在撰写本文时,使用Serilog或NLog是最佳选择。


Serilog.Sinks.MSSqlServer是否与asp.net core兼容?即使安装最新的beta版本,也需要serilog版本<2.0。 - Avishekh Bharati

2
你不能将ASP.NET Core内置日志与ELMAH进行真正的比较。ASP.NET Core日志是一个简单的日志框架,你需要告诉它什么时候记录日志。而ELMAH则会自动捕获所有未处理的异常,并记录关于失败请求的大量上下文信息。Seq sink实际上实现了其中一些行为,这使得类似协议、RequestId等额外信息可以通过Seq获得,但这不是ASP.NET日志的默认功能。
ASP.NET日志仍然很新,其他框架和目标的日志记录器将开始出现。我相信文件日志记录很快就会被实现,而且ELMAH也肯定会被移植到ASP.NET Core。更多信息,请查看我的博客文章:ASP.NET Core Logging Tutorial

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