Serilog 文件接收器 - System.MissingMethodException:找不到方法:Serilog.LoggerConfiguration

问题描述 投票:0回答:3

当我尝试使用文件接收器时遇到 MissingMethodException。

            Log.Logger = new LoggerConfiguration()
                .MinimumLevel.Debug()
                .WriteTo.File(logFilePath, rollingInterval: RollingInterval.Day, shared: true)
                .CreateLogger();

这真的很奇怪,因为我之前使用过相同的设置,并且从未给出任何问题,但我确信这就是导致错误的原因,因为如果我删除 .WriteTo.File() 行,我不会没有收到错误。

这是我的packages.config:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="ModPlus.Revit.API.2020" version="1.0.0" targetFramework="net472" />
  <package id="Serilog" version="2.9.0" targetFramework="net472" />
  <package id="Serilog.Sinks.File" version="4.1.0" targetFramework="net472" />
</packages>

你能想到发生这种情况的原因吗?
我见过类似的问题,通常是由于程序集文件中的版本不匹配,但我检查过并且引用了正确的版本(至少据我在我的packages.config中看到的)

编辑: 这是完整的未处理异常 UnhandledException

编辑2: 调用 Serilog 的代码是 Revit(3D 建模软件)的插件,我只是尝试在 2 个不同版本的平台中运行该插件:

  • Revit 2020,我收到未处理的异常
  • Revit 2019,运行良好! (我需要该插件才能在两个版本上工作)

两个版本的软件都使用相同版本的.NET Framework,4.7.2
这是否能提供更多线索? 一个版本可能出了什么问题,而另一个版本却没有?

c# serilog rollingfilesink
3个回答
2
投票

现在您已使用新信息更新了问题:

调用Serilog的代码是Revit(3D建模软件)的插件,我只是尝试在2个不同版本的平台中运行这个插件:

  • Revit 2020,我收到未处理的异常
  • Revit 2019,运行良好!

MissingMethodException
表明AppDomain中加载的
Serilog.Sinks.File.dll
中没有扩展方法
.WriteTo.File(path, rollingInterval, shared)

该方法是在

Serilog.Sinks.File.dll
v4.0.0 中引入的,它告诉我 Revit 2000 正在加载旧版本的
Serilog.Sinks.File.dll
v3.2.0 或更早版本,在该方法存在之前)。

我可以想到发生这种情况的两种可能性:

  1. Revit 2000 本身使用

    Serilog
    Serilog.Sinks.File
    进行日志记录,并且它使用旧版本的接收器

  2. 另一个插件(在你的插件之前加载)使用

    Serilog
    Serilog.Sinks.File
    进行日志记录,并且它们使用旧版本的接收器


你可以尝试的事情:

  1. 找出正在加载的版本,然后降级您的插件以使用该版本

  2. 找到旧的

    Serilog.Sinks.File.dll
    从哪里加载(物理路径),并将其替换为您想要在插件中使用的新版本 - 并测试它不会破坏使用旧版本的人。如果您选择这条路线,您可能也想替换
    Serilog.dll
    以确保它是您想要的版本。

您可以使用 Fuslogvw.exe(程序集绑定日志查看器) 来检查程序集的加载位置。

或者,您可以在插件加载时迭代

AppDomain.CurrentDomain.GetAssemblies()
,并检查
CodeBase
以查看加载
Serilog.Sinks.File.dll
的位置。

注意:在常规应用程序中,答案是将绑定重定向添加到主机应用程序的配置文件,但不幸的是,考虑到 Serilog 程序集版本都锁定在版本 2.0.0.0,因此绑定重定向对您来说是不可能的。 .NET 无法区分 v4.0.0v3.2.0 nuget 包中的程序集之间的区别...

PS:您可能想在 Autodesk Revit 论坛 上询问此问题。


1
投票

此错误表明您在输出文件夹中获得了旧版本的

Serilog.Sinks.File.dll
,这不是您通过 NuGet 安装的版本。

打开您的

.csproj
文件并检查对
Serilog.Sinks.File.dll
的所有引用,并确保您只有一个引用,并且它指向正确的 nuget 包文件夹 (4.1.0)。

它应该看起来像:

  <ItemGroup>
    <Reference Include="Serilog, Version=2.0.0.0, Culture=neutral, PublicKeyToken=24c2f752a8e58a10, processorArchitecture=MSIL">
      <HintPath>..\packages\Serilog.2.9.0\lib\net46\Serilog.dll</HintPath>
    </Reference>
    <Reference Include="Serilog.Sinks.File, Version=2.0.0.0, Culture=neutral, PublicKeyToken=24c2f752a8e58a10, processorArchitecture=MSIL">
      <HintPath>..\packages\Serilog.Sinks.File.4.1.0\lib\net45\Serilog.Sinks.File.dll</HintPath>
    </Reference>
  </ItemGroup>

您还可以使用dotPeek之类的工具来检查输出文件夹中的程序集并确认是否拥有正确的程序集。


另外,虽然我认为这与此特定错误无关,但请确保您在项目属性中启用了自动生成绑定重定向,以便

Serilog.Sinks.File
对 Serilog 2.5.0 的引用重定向到 Serilog 2.9。 0.

binding redirects


0
投票

我有类似的问题,我已经检查了上述所有建议,但不确定。出了什么问题

我正在使用 .NET 6 for Azure Functions v4 并写入创建日志, 由于其他依赖关系,我不得不切换到 Serilog 版本 2.9

  <PackageReference Include="Serilog" Version="2.9.0" />
 <PackageReference Include="Serilog.Extensions.Hosting" Version="3.1.0" />
 <PackageReference Include="Serilog.Extensions.Logging" Version="3.1.0" />
 <PackageReference Include="Serilog.Sinks.Console" Version="3.1.0" />
 <PackageReference Include="Serilog.Sinks.Splunk" Version="3.1.0" />  

知道这里可能出了什么问题吗?

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.