c# - 使用 NLog 配置 API 写入 ApplicationData 文件夹

标签 c# nlog

我有一个与 WCF 服务捆绑在一起的桌面应用程序。两者都是使用 .NET 4.7.2 构建的。应用程序和服务彼此共享一个安装目录,并且它们都使用 NLog 4.5.8 进行日志记录。它们各自使用 NLog 的方式的唯一区别是应用程序使用 NLog.config 文件来设置其日志记录属性,而服务使用 NLog Configuration API .

请注意,我为该服务使用 NLog 配置 API 的原因是因为该服务似乎拒绝使用应用程序使用的 NLog.config 文件,即使它与它们两个位于同一目录中。它根本不会记录,除非我使用 NLog 配置 API 对其进行配置。

无论如何,NLog 配置 API 似乎一切正常;但是,我无法像使用 NLog.config 文件时那样将其定位到用于日志文件存储的 ApplicationData 文件夹。

在NLog.config文件中,ApplicationData文件夹可以定位如下:

<target xsi:type="File"
        name="infoLogFile"
        layout="${longdate}|${level:uppercase=true}|${callsite}|${logger:shortName=true}: ${message}"
        fileName="${specialfolder:ApplicationData}\Program\file.log"
        keepFileOpen="false"
        archiveFileName="${specialfolder:ApplicationData}\Program\file_${shortdate}.{##}.log"
        archiveNumbering="Sequence"
        archiveEvery="Day"
        maxArchiveFiles="30"
/>

我已经使用 NLog 配置 API 设置了我的 FileTarget,如下所示:

var infoFileTarget = new FileTarget("infoFileTarget")
{
    Layout = @"${longdate}|${level:uppercase=true}|${callsite}|${logger:shortName=true}: ${message}",
    FileName = "${specialfolder:ApplicationData}/Program/file.log",
    KeepFileOpen = false,
    ArchiveFileName = "${specialfolder:ApplicationData}/Program/file_${shortdate}.{##}.log",
    ArchiveNumbering = ArchiveNumberingMode.Sequence,
    ArchiveEvery = FileArchivePeriod.Day,
    MaxArchiveFiles = 30,
};
config.AddTarget(infoFileTarget);

不幸的是,这不起作用。

但是,将 FileName/ArchiveFileName 设置为以下两个都有效:

FileName = "${basedir}/Program/file.log", // this works

FileName = "C:/Users/<USERNAME>/AppData/Roaming/Program/file.log, // this works

似乎以 ApplicationData 文件夹为目标应该可行,但我一定遗漏了一些东西。有使用 NLog 经验的人知道我如何让它工作吗?

在此先感谢您的帮助!

最佳答案

如果你认为${specialfolder:ApplicationData} (或其他布局)不起作用,您可以将其记录到文件中。例如

<target xsi:type="File"
        name="infoLogFile"
        layout="${longdate}|my application data folder: ${specialfolder:ApplicationData}"
        fileName="c:\temp\test.log"

/>

我认为 C:/Users/<USERNAME>/AppData/Roaming/Program/file.log 中的用户名可能出乎意料。

边注:

${specialfolder}在完整的 .NET 框架和 .NET Standard 2 中受支持,而不是 .NET standard 1。NLog 使用 Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 检索文件夹。

关于c# - 使用 NLog 配置 API 写入 ApplicationData 文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51750682/

相关文章:

c# - 如何在 NLog 中修改 ${stacktrace} 布局渲染器

.net-core - 与 log4net 相比,使用 Nlog 的性能较差

c# - 单元测试自定义 NLog 目标

java - 当成员与另一个类的公共(public)变量相同时使用 Enum

c# - 如何在 HtmlHelper 扩展方法上获取 Controller 和操作的语法突出显示?

c# - ASP MVC Url 编码双转义序列

c# - 如何实现 IEnumerator<T>?

c# - 如何使用额外的 MVC Core 2 应用程序扩展 MVC Core 2 webapp

.net - ASP.Net HttpModule/ErrorHandler - 如何获取正在执行的程序集版本

c# - NLog DatabaseTarget 安装不工作