gpt4 book ai didi

c# - 在 .net5 中部署为单个文件,log4net 为配置文件抛出异常

转载 作者:行者123 更新时间:2023-12-03 13:37:30 26 4
gpt4 key购买 nike

尝试使用 log4net 作为单个文件部署用 .Net 5 编写的控制台应用程序。
运行部署的应用程序抛出异常。
重现步骤

  • dotnet 新控制台 --name TestConsole --language C#(确保 .net 5.0)
  • 安装包 log4net
  • 程序.cs
  • static void Main(string[] args)
    {
    log4net.Config.XmlConfigurator.Configure(new FileInfo("log.config"));
    var logger = log4net.LogManager.GetLogger("TestLogger");
    logger.Info("Hello World!");
    }
  • log.config(始终复制)
  • <?xml version="1.0" encoding="utf-8" ?>
    <log4net>
    <logger name="TestLogger">
    <level value="ALL" />
    <appender-ref ref="console" />
    </logger>
    <appender name="console" type="log4net.Appender.ConsoleAppender">
    <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%level - %message%newline" />
    </layout>
    </appender>
    </log4net>
  • 发布(没有单个文件)= 有效(运行控制台应用程序时)

  • dotnet publish -o .\Publish --self-contained true -r win-x64
  • 发布(无单个文件)= 抛出异常(运行控制台应用程序时)

  • dotnet publish -o .\Publish --self-contained true -r win-x64 -p:PublishSingleFile=true
    抛出异常:
    log4net:ERROR Exception while reading ConfigurationSettings. Check your .config file is well formed XML.
    System.Configuration.ConfigurationErrorsException: Configuration system failed to initialize
    ---> System.IO.FileNotFoundException: Cannot find file. (0x80070002)
    at System.Reflection.RuntimeModule.GetFullyQualifiedName()
    at System.Reflection.RuntimeModule.get_Name()
    at System.Configuration.ClientConfigPaths..ctor(String exePath, Boolean includeUserConfig)
    at System.Configuration.ClientConfigPaths.GetPaths(String exePath, Boolean includeUserConfig)
    at System.Configuration.ClientConfigurationHost.get_ConfigPaths()
    at System.Configuration.ClientConfigurationHost.GetStreamName(String configPath)
    at System.Configuration.ClientConfigurationHost.get_IsAppConfigHttp()
    at System.Configuration.Internal.DelegatingConfigHost.get_IsAppConfigHttp()
    at System.Configuration.ClientConfigurationSystem..ctor()
    at System.Configuration.ConfigurationManager.EnsureConfigurationSystem()
    --- End of inner exception stack trace ---
    at System.Configuration.ConfigurationManager.EnsureConfigurationSystem()
    at System.Configuration.ConfigurationManager.PrepareConfigSystem()
    at System.Configuration.ConfigurationManager.GetSection(String sectionName)
    at System.Configuration.ConfigurationManager.get_AppSettings()
    at log4net.Util.SystemInfo.GetAppSetting(String key)
    log4net:ERROR Exception while reading ConfigurationSettings. Check your .config file is well formed XML.
    System.Configuration.ConfigurationErrorsException: Configuration system failed to initialize
    ---> System.IO.FileNotFoundException: Cannot find file. (0x80070002)
    at System.Reflection.RuntimeModule.GetFullyQualifiedName()
    at System.Reflection.RuntimeModule.get_Name()
    at System.Configuration.ClientConfigPaths..ctor(String exePath, Boolean includeUserConfig)
    at System.Configuration.ClientConfigPaths.GetPaths(String exePath, Boolean includeUserConfig)
    at System.Configuration.ClientConfigurationHost.get_ConfigPaths()
    at System.Configuration.ClientConfigurationHost.GetStreamName(String configPath)
    at System.Configuration.ClientConfigurationHost.get_IsAppConfigHttp()
    at System.Configuration.Internal.DelegatingConfigHost.get_IsAppConfigHttp()
    at System.Configuration.ClientConfigurationSystem..ctor()
    at System.Configuration.ConfigurationManager.EnsureConfigurationSystem()
    --- End of inner exception stack trace ---
    at System.Configuration.ConfigurationManager.PrepareConfigSystem()
    at System.Configuration.ConfigurationManager.GetSection(String sectionName)
    at System.Configuration.ConfigurationManager.get_AppSettings()
    at log4net.Util.SystemInfo.GetAppSetting(String key)
    我错过了什么?

    最佳答案

    所以我相信这个问题是由于 .NET 5 的变化。我还假设需要更新 log4net 以使用新的单一文件格式。
    这里有一个关于 .NET 5 如何以不同于 3.1 的方式处理单个文件的讨论。
    https://github.com/dotnet/core/issues/5409#issuecomment-715522029
    在 3.1 中,从技术上讲,单个可执行文件被解压缩并从 temp 运行(这可能会导致本地引用文件出现问题,至少在我的经验中,如果这些文件未在项目文件中设置为包含在单个文件之外)。在 .NET 5 中,他们试图转移到程序集在内存中执行时停留在同一目录中的情况。但是,很明显,这会导致您在 log4net 中发现的其他问题。
    上面的这个链接让我找到了答案:

    dotnet publish -r win-x64 /p:PublishSingleFile=true /p:IncludeAllContentForSelfExtract=true
    /p:IncludeAllContentForSelfExtract=true 强制 .NET 5 单个文件与 3.1 完全相同,这对我有用。
    在接下来的几个月里,我将继续尝试,希望 log4net .NET 5 兼容性开始使用新格式。但至少这面旗帜让我前进。

    关于c# - 在 .net5 中部署为单个文件,log4net 为配置文件抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64929114/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com