在 IIS 7.5 上运行 ASP.NET Core 时,日志在哪里?

Posted

技术标签:

【中文标题】在 IIS 7.5 上运行 ASP.NET Core 时,日志在哪里?【英文标题】:Where do logs go when running ASP.NET Core on IIS 7.5? 【发布时间】:2016-11-10 20:02:32 【问题描述】:

我发布这个并回答它,因为这让我很长一段时间都感到困惑。我的web.config 中有以下行:

<aspNetCore processPath="dotnet" arguments=".\XXX.Server.dll" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false" />

显然,这应该记录到logs\stdout,但是当我查看时,那里什么都没有。我进行了一场疯狂的追逐,在整个磁盘中搜索任何名为“log”(返回太多)或“stdout”(没有返回)的东西,但仍然无法弄清楚。

【问题讨论】:

我浪费了很多时间没有注意到我有stdoutLogEnabled="false",我自己没有修改过,所以去看看...... 【参考方案1】:

您可能可以检查您机器上的事件查看器 -> 应用程序以查看是否记录了任何错误,这可以解释您的日志文件未生成的原因。

但是,最可能的原因是 IIS 没有写入该日志文件夹的权限。

    右键文件夹->安全 确保 IIS_IUSRS 用户具有以下权限:读取和执行、列出、写入(默认情况下可能缺少写入)

【讨论】:

为什么 IIS 可能有权创建单个日志文件,但没有创建日志文件夹? @AndrewWilliamson 不幸的是我不确定:( @VlatkoVlahek 我的 IIS_IUSRS 拥有日志文件夹的完全权限,但没有创建日志文件! @HamidEbr 你能检查一下 web.config 中你的 stdoutLogEnabled 是否设置为 true 吗?另外,应用启动时事件查看器内部是否有任何错误? @VlatkoVlahek stdoutLogEnabled 为真,事件查看器内部也存在一些错误。【参考方案2】:

您必须确保日志文件夹存在! IIS 不会为您服务。如此简单的解决方案解决了这个令人恼火的问题。

【讨论】:

对我来说,它是在根目录添加 logg 文件夹,在 approot 和 wwwroot 旁边,使用 stdoutLogFile="..\logs\stdout.log" 文件夹应该有什么样的权限? 读取和执行、列出、写入(默认情况下可能缺少写入) - 请参阅Vlatko's answer 似乎这已在较新版本中得到修复。当前正在运行 IIS 10,并且此文件夹与日志文件一起创建。【参考方案3】:

我创建了日志文件夹,但仍然没有记录任何内容。我发现您可以使用 home/logfiles 下的现有文件夹并使其工作而无需创建文件夹。 这个解决方案对我有用:

1) 打开在已发布应用程序的根文件夹中创建的 web.config 文件。

2) 将 stdoutlogEnabled 设置为 true 并将 stdoutLogFile 设置为 \?\%home%\LogFiles\stdout,如下所示:

<aspNetCore processPath="dotnet" arguments=".\SellCarsHereV2.dll" stdoutLogEnabled="true" stdoutLogFile="\\?\%home%\LogFiles\stdout" />

然后您可以转到该路径并下载文件或使用 Azure 门户(如果它托管在 Azure 中)。如果您使用的是 Azure 门户:

1) 转到应用服务。

2) 转到高级工具,它会将您带到 https://your app service.scm.azurewebsites.net/

3) 点击调试控制台菜单 --> CMD

4) 点击日志文件

5) 您将看到一个名为 stdout_*.log 的文件,您可以单击铅笔查看它。如果需要,您也可以下载该文件。

【讨论】:

我喜欢这个,因为它使用了现有的日志文件夹。在我的一生中,我无法让任何 KuDu 写入操作在 Azure 上工作(创建一个新文件夹和编辑 web.config 都给了我权限错误,即使这些文件没有标记为只读)【参考方案4】:

根据您的 web.config 文件中提供的stdoutLogFile=".\logs\stdout"logs 目录应创建在 web.config 旁边的the publish directory 内。

要创建logs 子目录,您可以使用ASP.NET Core directory structure 中描述的方法。

只需将其粘贴到您已发布项目的 *.csproj 文件的末尾

<Project>
...
  <Target Name="CreateLogsFolder" AfterTargets="Publish">
    <MakeDir Directories="$(PublishDir)logs" 
              Condition="!Exists('$(PublishDir)logs')" />
  </Target>
</Project>

在此更改后的发布过程中,如果输出目录中不存在logs 目录,则应创建它。

如果你运行例如: dotnet publish --output &lt;path_to_your_publish_folder&gt; 你应该在&lt;path_to_your_publish_folder&gt; 中找到logs 目录

【讨论】:

【参考方案5】:

为了获取日志,我执行了以下步骤:

    如上所述,创建文件夹日志并授予对IIS_IUSRS 的写入权限 在web.config中设置绝对路径:stdoutLogFile="C:\xxx\xxx\logs" 回收应用程序池 停止,启动网站

编辑

第 2 步也适用于相对路径 stdoutLogFile=".\logs\stdout"

【讨论】:

【参考方案6】:

检查事件查看器。如果您像我一样,您会在 Application\Event 日志中看到一个条目“无法创建 stdoutLogFile c:....logs\stdout_....”。您必须自己在那里创建日志文件夹。一旦我创建了“日志”文件夹 stdout_.... 文件就开始转储到其中。当然还要确定stdoutLogEnabled="true"。预期文件夹位置的位置将显示在事件查看器日志中。这很重要,因为它可能不是您认为应该放置的位置。

【讨论】:

【参考方案7】:

我注意到当您访问该网站时不会立即创建日志。我允许对 IIS_IUSRS 进行写访问,创建“日志”文件夹,重新启动 app_pool,几分钟后日志就在那里。

【讨论】:

以上是关于在 IIS 7.5 上运行 ASP.NET Core 时,日志在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

IIS 7.5 上的 ASP.NET MVC

IIS 7.5 上的 ASP.NET MVC

IIS 7.5 ASP.Net 和远程共享

IIS 7.5 中的 Asp.net mvc 4 应用程序问题

IIS 7.5 上的调试与发布模式

ASP.Net MVC 3/4 托管在 IIS 7.5 默认处理程序映射上