Microsoft.extension.logging 中的编译时日志记录代码生成错误

Error with compile-time logging code generation in Microsoft.extension.logging

提问人:Chaos 提问时间:11/8/2023 最后编辑:Chaos 更新时间:11/8/2023 访问量:27

问:

我有一个包含多个项目的申请。为了重构我们在应用程序中处理日志记录的方式,我使用 ILoggerProvider 接口创建了一个具有特定提供程序的日志记录项目。我还实现了 ILogger 接口。

为了添加特定的日志记录方法,我使用了以下实现:

namespace Logger
{
    public static partial class LogBasicExtensions
    {
        [LoggerMessage(
        EventId = 0,
        Level = LogLevel.Error,
        Message = "Log basic exception")]
        public static partial void LogException(this ILogger logger, Exception exception);

    }
}

现在,为了保持干净的模式,我希望解决方案中的每个项目都声明它们将使用的日志记录方法。例如,在另一个项目中:

namespace AnotherProject
{
    public static partial class ClientLogExtension
    {

        [LoggerMessage(
        EventId = 1,
        Level = LogLevel.Information,
        Message = "Application Started")]
        public static partial void ApplicationStarted(this ILogger logger);

        [LoggerMessage(
        EventId = 2,
        Level = LogLevel.Information,
        Message = "Code {coderead} reception from reader {readernumber}")]
        public static partial void CodeReception(this ILogger logger, string coderead, uint readernumber);
    }
}

但是,在尝试编译项目时,我遇到了以下错误:

CS0757: 分部方法不能有多个实现声明。 CS0102:类型“类型名称”已包含“标识符”的定义

以下是Microsoft.Extensions.Logging.Generators生成的代码:

 partial class ClientLogExtension
    {
        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Extensions.Logging.Generators", "7.0.8.27404")]
        private static readonly global::System.Action<global::Microsoft.Extensions.Logging.ILogger, global::System.Exception?> __ApplicationStartedCallback =
            global::Microsoft.Extensions.Logging.LoggerMessage.Define(global::Microsoft.Extensions.Logging.LogLevel.Information, new global::Microsoft.Extensions.Logging.EventId(1, nameof(ApplicationStarted)), "Application Started", new global::Microsoft.Extensions.Logging.LogDefineOptions() { SkipEnabledCheck = true }); 

        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Extensions.Logging.Generators", "7.0.8.27404")]
        public static partial void ApplicationStarted(this global::Microsoft.Extensions.Logging.ILogger logger)
        {
            if (logger.IsEnabled(global::Microsoft.Extensions.Logging.LogLevel.Information))
            {
                __ApplicationStartedCallback(logger, null);
            }
        }
        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Extensions.Logging.Generators", "7.0.8.27404")]
        private static readonly global::System.Action<global::Microsoft.Extensions.Logging.ILogger, global::System.String, global::System.UInt32, global::System.Exception?> __CodeReceptionCallback =
            global::Microsoft.Extensions.Logging.LoggerMessage.Define<global::System.String, global::System.UInt32>(global::Microsoft.Extensions.Logging.LogLevel.Information, new global::Microsoft.Extensions.Logging.EventId(2, nameof(CodeReception)), "Code {coderead} reception from reader {readernumber}", new global::Microsoft.Extensions.Logging.LogDefineOptions() { SkipEnabledCheck = true }); 

        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Extensions.Logging.Generators", "7.0.8.27404")]
        public static partial void CodeReception(this global::Microsoft.Extensions.Logging.ILogger logger, global::System.String coderead, global::System.UInt32 readernumber)
        {
            if (logger.IsEnabled(global::Microsoft.Extensions.Logging.LogLevel.Information))
            {
                __CodeReceptionCallback(logger, coderead, readernumber, null);
            }
        }
    }

到目前为止,我已经尝试了各种方法。除了重新启动、重建和删除“bin”和“obj”文件夹之外,我还尝试重命名我的类和方法。我还创建了一个小型测试解决方案,该解决方案引用了 Logger 项目并以相同的方式使用它,并且它在那里工作。

现在,我知道它应该有效,但它仍然不起作用。

我认为Visual Studio可能会生成两组分部类,因此我删除了“Temp\VSGeneratedDocuments”目录中的所有文件,但这也没有解决问题。

任何帮助将不胜感激。

日志记录 visual-studio-2022 代码生成 c#-7.0 microsoft.extensions.logging

评论


答: 暂无答案