【问题标题】:nlog.config- file not found .Net core 3.1 and Docker未找到 nlog.config- 文件 .Net core 3.1 和 Docker
【发布时间】:2020-10-07 21:20:31
【问题描述】:

我是 Docker 新手,我在 Main 方法的下面一行收到一个错误,它是一个带有 Docker 的 .net core 3.1 API, 当它尝试初始化Nlog时,代码找不到nlog.config,文件被配置为总是复制。

var logger = NLog.Web.NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();

这是我遇到的错误,

System.IO.FileNotFoundException: 'Failed to load NLog LoggingConfiguration. 
  Searched the following locations:
     - /app/bin/Debug/netcoreapp3.1/nlog.config

使用 IIS 运行时工作正常。

提前致谢 阿比德

【问题讨论】:

    标签: docker asp.net-core nlog


    【解决方案1】:

    根据您提供的信息很难判断。您是否有任何其他信息 - 您可以提供/显示相关行的 Dockerfile?在 docker examples 上对 Asp.Net Core 应用程序进行 dockerizing 有一些准则。

    如果您的应用程序可以在 IIS 中运行但不能在 docker 中运行,那么我建议您的 nlog.config 文件不是容器的一部分。也许在构建期间检查您的 nlog.config 文件是否已复制到输出目录? (在VS2019中右键文件,然后属性,然后将“复制到输出目录”设置为“如果较新则复制”)

    您可以构建您的容器,然后使用以下 docker 命令进入 bash 会话以浏览目录/etc:

    使用以下方法构建容器:

    docker build -t nlog-example .

    使用以下命令输入 bash 终端会话:

    docker run --rm -it --entrypoint /bin/bash nlog-example

    (注意,nlog-example 是我示例中的 docker 标签,但您的可能不同)

    【讨论】:

    • 您好,文件属性设置为始终复制,我从 VS 2019 运行,我不确定是否获取 docker 文件(“-您可以提供/显示相关行的 Dockerfile "),我检查了 Visual Studio 输出中的容器文件,我可以在这个 app/bin/Debug/netcoreapp3.1/ 中看到该文件
    • 我使用的是 NLog.Config 包,并且 nlog.config 是从包路径中引用的,现在我删除了包并将 nlog.config 手动添加到项目中,现在它开始工作了。谢谢
    • @Aabidabdulsalam 我猜你面临的问题与我的以下回答相同:Linux 容器。
    【解决方案2】:

    为那些正在处理这种环境的人添加一个额外的答案: Docker + Linux:

    作为On Linux, the file system is case sensitive,让我们简单地将配置名称更改为与您在图像中看到的完全相同,区分大小写。

    但另一方面,如果重命名不起作用,也需要设置LogManager.LogFactory.SetCandidateConfigFilePaths

    这里我的配置名称是NLog.Config:

    var fullPath = Directory.GetFiles(Path.GetDirectoryName(Assembly.GetEntryAssembly()?.Location))
            .FirstOrDefault(x => x.EndsWith("nlog.config", StringComparison.OrdinalIgnoreCase));
    
    LogManager.LogFactory.SetCandidateConfigFilePaths(new[] { fullPath });
    var config = Path.GetFileName(fullPath);
    return NLogBuilder.ConfigureNLog(config).GetCurrentClassLogger();
    

    【讨论】:

    • 您能说出您使用的是哪个版本的 NLog 吗?您是否在 NetCore 上使用单文件发布?想要解决这个问题,所以 NLog 开箱即用。
    • @RolfKristensen 那会很好。我们正在使用NLog.Web.AspNetCore 4.10.0。开发人员不知道文件名在 Linux 中是区分大小写的。感谢您的修复。
    • 是的,但要修复它,我需要知道它为什么会失败。如果您可以在 github.com/NLog/NLog.Web/issues 此处创建问题并附上示例项目以重现该问题,那就太好了。
    • 其实是历史原因,在git源码管理中,这个配置文件有不同的网名格式。所有微服务都将 nlog.config 编码为配置文件名,但是当我开始对所有服务进行 dockerizing 时,我在 Linux 映像中发现了不同的配置名称:nlog.configNlog.ConfigNlog.configNLog.config 等等。实际上最简单的方法是将这些文件重命名为相同的格式:nlog.config,这样也可以跳过问题。
    • 是的,在 linux 平台上保留所有小写字母会使一切变得更简单。 NLog 只能看到“NLog.config”和“nlog.config”(Linux 上 NLog.Config 失败)
    猜你喜欢
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 2021-01-30
    • 2023-03-06
    • 2021-10-16
    • 2021-06-09
    • 2020-10-25
    • 1970-01-01
    相关资源
    最近更新 更多