【问题标题】:How to enable assembly bind failure logging (Fusion) in .NET如何在 .NET 中启用程序集绑定失败日志记录 (Fusion)
【发布时间】:2010-09-20 07:38:40
【问题描述】:

如何在 .NET 中启用程序集绑定失败日志记录 (Fusion)?

【问题讨论】:

  • 如果有人关心,使用 fusion logger (fuslogvw.exe) 阅读这篇文章:msdn.microsoft.com/en-us/library/e74a18c4(v=VS.100).aspx 它告诉你在哪里下载它和其他信息。
  • @Will - 感谢分享!作为奖励 - 确保您以管理员身份运行 fuslogvw.exe 以避免任何权利问题。
  • 作为相关说明,请务必在完成后关闭 fusion logger (fuslogvw.exe)。我的“C:\Windows\...\Temporary Internet Files\”文件夹中有 400 万条日志。所有文件的总大小为 6 GiB,但由于它们远小于集群大小,因此实际使用的磁盘空间为 16 GiB。
  • @Will 我不同意安装 fuslogvw 是“最佳”答案。如果您无需在可能不是开发环境的环境中安装整个 Windows SDK 即可获得该工具,那么您将有道理。
  • @Will 当然,但您链接到的答案不包括任何内容。

标签: c# .net vb.net binding assemblies


【解决方案1】:

将以下值添加到

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion 添加: DWORD ForceLog 设置值为 1 DWORD LogFailures 将值设置为 1 DWORD LogResourceBinds 设置值为 1 DWORD EnableLog 设置值为 1 String LogPath 设置日志文件夹的值(例如 C:\FusionLog\)

确保在文件夹名称后包含反斜杠并且文件夹存在

您需要重新启动正在运行的程序以强制它读取这些注册表设置。

顺便说一句,不要忘记在不需要时关闭融合记录。

【讨论】:

  • Gary 的解决方案对我有用,尽管我还不得不重置 IIS。注意我是在一个干净的环境中配置的,我不想安装 SDK 等。
  • 有人报告说注册表更改不会立即生效。您是否尝试过打开 Fusion 日志记录然后重新启动?
  • 您需要重新启动正在运行的任何程序才能读取这些注册表设置
  • Fusion 日志查看器为您完成所有这些工作。转到开始 -> 程序 -> Visual Studio xxxx > Visual Studio 工具 > Visual Studio 命令提示符(以管理员身份运行)并键入“fuslogvw”。在“设置”中调整日志记录。
  • 为了方便地打开/关闭日志记录,我创建了 .reg 文件,这些文件基于 Gary Kindel 的回答:enablingdisabling
【解决方案2】:

我通常使用 Fusion Log Viewer(Fuslogvw.exe 来自 Visual Studio command prompt 或 Fusion Log Viewer 从开始菜单) - 我的标准设置是:

  • 以管理员身份打开 Fusion Log Viewer
  • 点击设置
  • 选中启用自定义日志路径复选框
  • 输入您希望将日志写入的位置,例如c:\FusionLogs重要提示:确保您已在文件系统中实际创建了此文件夹。)
  • 确保启用了正确级别的日志记录(我有时只是选择将所有绑定记录到磁盘只是为了确保一切正常)
  • 点击确定
  • 将日志位置选项设置为自定义

完成后记得关闭注销!

(我刚刚在一个类似的问题上发布了这个 - 我认为它在这里也很相关。)

【讨论】:

  • 请注意,如果您自己从本机应用程序托管运行时,出于某种原因,您将需要使用自定义日志路径,否则您将不会记录任何内容。
  • 至少在我的情况下,我实际上不必设置自定义日志路径。我所要做的就是打开登录,例如,在设置对话框中“记录所有绑定到磁盘”。
  • 在我的情况下需要以管理员身份运行,否则所有选项都被禁用。
  • 注意:以管理员身份创建文件夹!
  • 确保您不仅以管理员身份运行 fuslogvw,而且还从引发异常的 Visual Studio 项目使用的 正确 Windows SDK 路径运行。检查其 csproj 并在其中搜索 SDK(我的 sdk 节点名为 TargetFrameworkSDKToolsDirectory)。使用不匹配的 fuslogvw 版本似乎无法捕获异常(这是有道理的......)
【解决方案3】:

如果您的计算机上安装了 Windows SDK,您会在 Microsoft SDK\Tools 下找到“Fusion Log Viewer”(在 Vista 或 Windows 7/8 的开始菜单中键入“Fusion”)。启动它,单击“设置”按钮,然后选择“记录绑定失败”或“记录所有绑定”。

如果这些按钮被禁用,请返回开始菜单,右键单击日志查看器,然后选择“以管理员身份运行”。

【讨论】:

  • 我禁用了这些按钮 - 为什么?
  • @Tim,以前没见过 - 可能与管理员权限有关吗?毕竟修改的是 HKEY_LOCAL_MACHINE。
  • “设置,日志绑定失败”足以找到我的问题。
  • 确保文件夹允许写访问。 UAC 和 c:\logs 不适合融合日志
  • 请注意,如果按钮被禁用,请以管理员权限重新运行融合日志查看器。
【解决方案4】:

您可以以管理员身份运行此 Powershell 脚本来启用 FL:

Set-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name ForceLog         -Value 1               -Type DWord
Set-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name LogFailures      -Value 1               -Type DWord
Set-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name LogResourceBinds -Value 1               -Type DWord
Set-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name LogPath          -Value 'C:\FusionLog\' -Type String
mkdir C:\FusionLog -Force

这个要禁用:

Remove-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name ForceLog
Remove-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name LogFailures
Remove-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name LogResourceBinds
Remove-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name LogPath

【讨论】:

  • 谢谢!我允许自己将您的命令放入this gist。我添加了c:\FusionLog 目录的创建,这样人们就不会忘记这一点;-)
  • 命令行规则!我可以使用迄今为止发明的最好的代码可重用性技术“剪切和粘贴”快速重播这个过程。谢谢。
  • 这个答案更有用,我上次把它放到我的脚本中。现在几个月后,我回到这里再次看到了线程。提醒我上次是如何使用它的。
【解决方案5】:

设置以下注册表值:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion!EnableLog] (DWORD) 为 1

要禁用,请设置为 0 或删除该值。

[edit ]:将以下文本保存到文件中,例如 FusionEnableLog.reg,在 Windows 注册表编辑器格式:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion]
"EnableLog"=dword:00000001

然后从 Windows 资源管理器中运行该文件并忽略有关可能损坏的警告。

【讨论】:

  • 并不是该条目可能不存在 - 您必须创建它。至少,当我今天早上坠机前准备回答这个问题时,我做到了:)
  • 是什么!意思是?关键还是价值?那么 64 位系统呢?
  • 实际上,这确实有效...您只需要运行 iisreset afterwords 即可使其工作。
  • @Norman:因为此特定设置用于使 Asp.Net 错误在错误页面中显示程序集绑定错误消息,而不是将日志保存到文件中。 @OP:+1。编辑为包含一个 .reg 文件。这 !格式是我从未见过的格式,除了将我发送到此页面以寻找答案的错误消息。
  • 您不需要重置 IIS - 只需相关的应用程序池。或者至少这就是我需要做的。
【解决方案6】:

There's so much wrong 与程序集绑定日志查看器 (FUSLOGVW.exe) 我决定编写一个名为 Fusion++ and put it on GitHub 的替代查看器。 它在内部使用相同的机制,但会为您解析日志。您根本不需要关心任何设置,甚至不需要记录路径?

您可以从here 或通过 Chocolatey (choco install fusionplusplus) 获取最新版本。

我希望你和这里的一些访客可以用它节省一些有价值的终生时间。

【讨论】:

    【解决方案7】:

    Fusion Log Settings Viewer changer script 是最好的方法。

    ASP.NET 中,有时很难让它正常工作。这个脚本效果很好,并且也在Scott Hanselman's Power Tool list 上列出。我个人使用它多年,它从未让我失望。

    【讨论】:

    • ps 请确保在运行后禁用它,否则此文件夹可能会变得很大
    • 这就是我使用 ETW 的原因,仅在我真正需要时才记录数据,而不是一直记录在丑陋的大日志文件中。
    【解决方案8】:

    除了使用丑陋的日志文件之外,您还可以通过 ETW/xperf 激活 Fusion 日志,方法是打开带有 GUID 763FD754-7086-4DFE-95EB-C01A46FAF4CAFusionKeyword 关键字 (0x4) 的 DotnetRuntime Private 提供程序 (Microsoft-Windows-DotNETRuntimePrivate)。

    @echo off
    echo Press a key when ready to start...
    pause
    echo .
    echo ...Capturing...
    echo .
    
    "C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\xperf.exe" -on PROC_THREAD+LOADER+PROFILE -stackwalk Profile -buffersize 1024 -MaxFile 2048 -FileMode Circular -f Kernel.etl
    "C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\xperf.exe" -start ClrSession -on Microsoft-Windows-DotNETRuntime:0x8118:0x5:'stack'+763FD754-7086-4DFE-95EB-C01A46FAF4CA:0x4:0x5 -f clr.etl -buffersize 1024
    
    echo Press a key when you want to stop...
    pause
    pause
    echo .
    echo ...Stopping...
    echo .
    
    "C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\xperf.exe" -start ClrRundownSession -on Microsoft-Windows-DotNETRuntime:0x8118:0x5:'stack'+Microsoft-Windows-DotNETRuntimeRundown:0x118:0x5:'stack' -f clr_DCend.etl -buffersize 1024 
    
    timeout /t 15
    
    set XPERF_CreateNGenPdbs=1
    
    "C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\xperf.exe" -stop ClrSession ClrRundownSession 
    "C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\xperf.exe" -stop
    "C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\xperf.exe" -merge kernel.etl clr.etl clr_DCend.etl Result.etl -compress
    del kernel.etl
    del clr.etl
    del clr_DCend.etl
    

    当您现在打开 PerfView 中的 ETL 文件并查看事件表下方时,您可以找到 Fusion 数据:

    【讨论】:

    • @YuriBondarchuk 这会按需激活它,您在 ETL 中有更多数据(其他进程,文件版本数据),因此您可以将文件提供给其他用户,与正常融合日志
    【解决方案9】:

    对于那些有点懒惰的人,我建议你将它作为一个 bat 文件运行,以备不时之需:

    reg add "HKLM\Software\Microsoft\Fusion" /v EnableLog /t REG_DWORD /d 1 /f
    reg add "HKLM\Software\Microsoft\Fusion" /v ForceLog /t REG_DWORD /d 1 /f
    reg add "HKLM\Software\Microsoft\Fusion" /v LogFailures /t REG_DWORD /d 1 /f
    reg add "HKLM\Software\Microsoft\Fusion" /v LogResourceBinds /t REG_DWORD /d 1 /f
    reg add "HKLM\Software\Microsoft\Fusion" /v LogPath /t REG_SZ /d C:\FusionLog\
    
    if not exist "C:\FusionLog\" mkdir C:\FusionLog
    

    【讨论】:

      【解决方案10】:

      只是一点点可能对其他人有所帮助的信息;如果您按照在某个目录中搜索所有程序集以查找继承/实现类/接口的类的方式执行某些操作,那么如果您收到与您自己的程序集之一有关的此错误,请确保清除过时的程序集。

      场景大概是这样的:

      1. 程序集 A 将所有程序集加载到某个文件夹中
      2. 此文件夹中的程序集 B 已过时,但引用程序集 C
      3. 程序集 C 存在,但命名空间、类名或其他一些细节可能在程序集 B 过时后发生了变化(在我的例子中,命名空间是通过重构过程更改的)

      简而言之:A ---loads--> B (stale) ---references---> C

      如果发生这种情况,唯一的标志是错误消息中的命名空间和类名。仔细检查它。如果您在解决方案中的任何地方都找不到它,则可能是在尝试加载过时的程序集。

      【讨论】:

        【解决方案11】:

        如果您已启用日志记录,但在 Windows 7 64 位上仍然出现此错误,请在 IIS 7.5 中尝试:

        1. 创建新的应用程序池

        2. 转到此应用程序池的高级设置

        3. 启用 32 位应用程序设置为 True

        4. 让您的 Web 应用程序使用这个新池

        【讨论】:

        • 伙计,你救了我的命,我花了大约 8 个小时解决了这个问题。非常感谢。 :)
        【解决方案12】:

        以防万一您想知道 FusionLog.exe 的位置 - 你知道你有它,但你找不到它?在过去的几年里,我一遍又一遍地寻找 FUSLOVW。迁移到 .NET 4.5 后,FUSION LOG 的版本数量激增。 她是可以在您的磁盘上找到它的地方,具体取决于您安装的软件:

        C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\x64

        C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\x64

        C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\x64

        C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 工具

        C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 工具

        C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin

        【讨论】:

          【解决方案13】:

          在我的例子中,帮助输入小写的磁盘名称

          错误 - C:\someFolder

          正确 - c:\someFolder

          【讨论】:

          • 这与问题有什么关系?
          • 我用它作为注册表中 LogPath 参数的值。但现在我认为问题不在于 CASE 而在于错误的字母 C != С
          猜你喜欢
          • 2013-07-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-15
          • 1970-01-01
          • 2013-09-09
          • 2017-01-15
          • 2011-07-11
          相关资源
          最近更新 更多