NLog是.NET的免费日志记录平台
我为 NLog 配置了一个文件目标,如下所示: 我为 NLog 配置了一个文件目标,如下所示: <targets> <target name="asyncFile" xsi:type="AsyncWrapper"> <target xsi:type="File" name="logfile" fileName="${basedir}/Logs/${shortdate}.log" layout="${longdate} ${uppercase:${level}} ${message}" /> </target> </targets> 如何通过 NLog 的 API 查询此 fileName 目标的实际文件系统路径 (File)? private string GetLogFile() { var fileTarget = LogManager.Configuration.AllTargets.FirstOrDefault(t => t is FileTarget) as FileTarget; return fileTarget == null ? string.Empty : fileTarget.FileName.Render(new LogEventInfo { Level = LogLevel.Info }); } 我刚刚尝试通过 configuration api 获取此信息。 遗憾的是,配置似乎是由实际目标评估的,并且未在配置中解析。 由于 {basedir} 指的是 appdomain 基目录,您可以简单地自行读取该值。 var basedirPath = AppDomain.CurrentDomain.BaseDirectory; 您可以在代码中使用 nLog 的 api 而不是 xml 配置文件。然后,在您的应用程序中,将日志的文件路径分配给一个变量,并使用该变量作为目标的文件名。您可以访问该变量,或者随时更改它(这里的我的代码片段是在类内部定义的)。 Private MainNlogConfig As New LoggingConfiguration() Dim localrule As New LoggingRule(*, LogLevel.Info, locallogtarget) MainNlogConfig..AddTarget("file", locallogtarget) With locallogtarget .Layout = "${longdate} ${logger} ${message}" .FileName = appdir & appName & ".log" '----->LOOK HERE! End With LogManager.Configuration = MainNlogConfig 您可以像这样查找 FileTarget 并解析文件名: var fileTarget = LogManager.Configuration?.FindTargetByName<NLog.Targets.FileTarget>("logfile"); string filePath = fileTarget?.FileName.Render(LogEventInfo.CreateNullEvent()); string directory = System.IO.Path.GetDirectoryName(filePath);
我使用 NLog 进行下一个配置: 我使用 NLog 进行下一个配置: <targets> <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log" layout="${longdate} ${uppercase:${level}} ${message}" /> </targets> <rules> <logger name="*" minlevel="Trace" writeTo="f" /> </rules> 我试图获取 FileName 的 FileTarget 属性(我检查了一下,集合中只有一个 FileTarget) NLog.LogManager.GetCurrentClassLogger().Info("test"); var logFile = (from t in NLog.LogManager.Configuration.AllTargets where t is NLog.Targets.FileTarget select (NLog.Targets.FileTarget)t).FirstOrDefault(); 但是 logFile.FileName 仅包含文件名模式,与设置中的指定方式完全相同。 如何获取当前日志文件的运行时路径? 这对我有用: var fileTarget = LogManager.Configuration.FindTargetByName<NLog.Targets.FileTarget>("file"); string fileName = fileTarget?.FileName.Render(LogEventInfo.CreateNullEvent()); if (string.IsNullOrEmpty(fileName) || !File.Exists(fileName)) throw new Exception("Log file does not exist."); 即使您在 NLog XML 配置中设置了 async="true"(即您的目标被 AsyncTargetWrapper 包裹),此方法也将起作用: private string GetLogFileName(string targetName) { string fileName = null; if (LogManager.Configuration != null && LogManager.Configuration.ConfiguredNamedTargets.Count != 0) { Target target = LogManager.Configuration.FindTargetByName(targetName); if (target == null) { throw new Exception("Could not find target named: " + targetName); } FileTarget fileTarget = null; WrapperTargetBase wrapperTarget = target as WrapperTargetBase; // Unwrap the target if necessary. if (wrapperTarget == null) { fileTarget = target as FileTarget; } else { fileTarget = wrapperTarget.WrappedTarget as FileTarget; } if (fileTarget == null) { throw new Exception("Could not get a FileTarget from " + target.GetType()); } var logEventInfo = new LogEventInfo { TimeStamp = DateTime.Now }; fileName = fileTarget.FileName.Render(logEventInfo); } else { throw new Exception("LogManager contains no Configuration or there are no named targets"); } if (!File.Exists(fileName)) { throw new Exception("File " + fileName + " does not exist"); } return fileName; } 目标可以多次包装(在我的例子中,我有一个过滤器),因此以下代码片段是一种更通用的展开方法,适用于多个级别,并且不会对目标名称做出假设。 Target target = LogManager.Configuration.FindTargetByName(targetName); while ((target != null) && (target is WrapperTargetBase)) { target = (target as WrapperTargetBase).WrappedTarget; } 这里有一些对我有用的简化实现——至少对于较新版本的.Net/NLog。 如果您只有一个 FileTarget 并且没有任何异步环绕它并且只想要一个简单的文件名: var file = LogManager.Configuration?.AllTargets.OfType<FileTarget>() .Select(x => x.FileName.Render(LogEventInfo.CreateNullEvent())) .FirstOrDefault(x => !string.IsNullOrWhiteSpace(x)); Console.WriteLine($"Logging to file: {file}"); 输出: 记录到文件:C:\MyApp\logs�2-05-04.log 或者,这里还有一个方法可以解包异步和缓冲目标: public static IEnumerable<string> GetNLogFileTargets() { var allTargets = LogManager.Configuration?.AllTargets; if (allTargets == null) { return Enumerable.Empty<string>(); } var wrappedFileTargets = allTargets.OfType<WrapperTargetBase>() .Where(x => x.WrappedTarget is FileTarget) .Select(x => x.WrappedTarget).Cast<FileTarget>(); var fileTargets = allTargets.OfType<FileTarget>().Concat(wrappedFileTargets); return fileTargets.Select(x => x.FileName.Render(LogEventInfo.CreateNullEvent())).Where(x => !string.IsNullOrWhiteSpace(x)); } 我知道我的答案并不能完全回答问题,但最困难的是找到正确的目标并正确施放它,然后我们就可以访问任何属性。我也没有找到适合我的答案的问题,因此发布在这里...... 即使您在 NLog XML 配置中设置了 async="true"(即您的目标由 AsyncTargetWrapper 或任何 TargetWrapper 包装),此方法也将起作用: 使用NLog版本:3.1.0.0 运行版本:v4.0.30319 private Target FindTargetByName(string targetName) { if (LogManager.Configuration == null) return null; Target t = LogManager.Configuration.FindTargetByName(targetName); if (t is NLog.Targets.Wrappers.WrapperTargetBase) { var list = LogManager.Configuration.AllTargets.ToList(); t = list.Find(x => x.Name == targetName + "_wrapped"); return t; } else { return t; } } 名为 emailError 的 MailTarget 的用法 var emailError = (MailTarget)FindTargetByName("emailError"); emailError.SmtpServer = "" //you can set or get 这将返回“测试”目标的当前日志文件的路径。 如果还没有文件,则会抛出 NUllReferenceException。 /// <exception cref="NullReferenceException"></exception> public static string GetCurrentDebugLogFilePath() { return (LogManager.Configuration.FindTargetByName("test") as FileTarget).FileName.Render(new LogEventInfo { TimeStamp = DateTime.Now }); }
.net MAUI 最近在其最新版本之一中删除了日志记录。现在有什么替代方案以及应该如何实施?在网上查遍了,但找不到一个例子...
如何通过依赖注入使.NET 6 Azure Functions V4与NLog一起使用?
我一整天都在研究这个问题,并查看了 NLog 文档、StackOverflow 和 NLog GitHub 问题。但是,没有真正的示例说明如何使 Azure Functions V4 与 NLog 配合使用...
我的 nlog.config 文件中有两个目标 我的 nlog.config 文件中有两个目标 <targets> <target xsi:type="File" name="logfile" fileName="../../../Log/log.log"> <layout xsi:type="Layout"> <renderer type="truncate" maxMessageLength="500" /> </layout> </target> <target xsi:type="Console" name="logconsole" layout="${truncate:MaxLength=20}"> </target> </targets> 由于自定义渲染器类,它们都不起作用,但我根据手册和chatgpt编写的所有代码。 这是我的课 [LayoutRenderer("truncate")] public class TruncateLayoutRenderer : LayoutRenderer { [RequiredParameter] public int MaxLength { get; set; } protected override void Append(StringBuilder builder, LogEventInfo logEvent) { string formattedLogEntry = $"test {logEvent.TimeStamp:yyyy-MM-dd HH:mm:ss} {logEvent.Level:uppercase=true} - {logEvent.FormattedMessage}"; if (formattedLogEntry.Length > MaxLength) { formattedLogEntry = formattedLogEntry.Substring(0, MaxLength); } builder.Append(formattedLogEntry); } } 配置文件和类在一个项目中 当我启动项目时,我看到布局设置为默认。但如果我在配置文件中使用硬编码的布局,它就可以工作。我的课出了什么问题吗? 我看了手册并询问了gpt,似乎一切都正确 如果您阅读了 wiki 页面 如何编写自定义布局渲染器,那么它会说 不要忘记注册您的自定义组件 但是请注意,NLog 中已经存在内置的截断方法。所以你可以这样做${message:truncate=500}(不需要你自己的自定义布局渲染器。 另请参阅:https://nlog-project.org/config/?tab=layout-renderers
在我的应用程序中,我想将发布或消耗的任何 AMQP 事件记录到两个文件中。第一个日志文件是我的“主”文件,其中包含我的应用程序每一层的各种日志语句...
我在运行时创建一个 MongoTarget 到托管生产数据库的服务器。在运行时忽略不需要的日志条目的正确方法是什么?我目前正在创建一个 MemoryTarget 和
Application Insights:通过 .net core 3.1 控制台应用程序中的自定义 ITelemetryInitializer 添加云角色名称不会获取云角色名称
我正在使用 HostBuilder 在 Program.cs 中配置控制台应用程序。 在配置服务中: services.AddSingleton(p => new CustomInitializer("我的应用程序",
使用 ASP.NET 4.6.2、NLog 版本 5.1.2,当某些事件属性设置为布尔值 true 时,尝试使用 Mail 目标记录事件。这是行不通的。但在我看来它确实有效......
我使用 NLog 进行日志记录,我使用包装器来调用日志方法,我的问题是:如果我尝试打印有关调用站点(${callsite})的信息,它会打印包装器方法而不是原始方法我...
NLog 像 WithProperty 方法一样使用 .NET6 注入自定义属性
我有一个 .NET 4.8 项目,我按以下方式使用 NLog: 公共类 ReportsController :ApiController { private static NLog.Logger logger = NLog.LogManager.GetLogger("应用...
我正在尝试在 Visual Studio 2019(社区版,如果相关的话)中构建 NLog。由于下面的转换错误,NLog 未构建。我在代码中搜索了“TypeParameterSymbo...
当与针对相同输出的其他配置结合使用时,nlog maxLevel=off 配置选项会做什么?
我不确定 nlog“level=off”配置选项与其他针对相同输出的配置(如下面提供的配置)结合使用时会执行什么操作: 我不确定 nlog“level=off”配置选项与其他针对相同输出的配置(如下面提供的配置)结合使用时会执行什么操作: <logger name="Name.Space.*" minLevel="Info" writeTo="console" final="true"/> <logger name="Name.Space.*" maxLevel="off" writeTo="console" final="true"/> 这样的配置会实现什么行为? 这意味着 LogLevel 高于 minLevel="Info"(Info + Warn + Error + Fatal)的所有记录器输出都应该 writeTo="console",并且由于 final="true",那么记录器输出不应达到以下规则: <logger name="Name.Space.*" minLevel="Info" writeTo="console" final="true"/> 这意味着 LogLevel 低于 maxLevel="off"(Trace + Debug + Info + Error + Fatal)的所有记录器输出都应该 writeTo="console",并且由于 final="true",那么记录器输出不应达到以下规则: <logger name="Name.Space.*" maxLevel="off" writeTo="console" final="true"/> maxLevel通常用于抑制日志记录。另请参阅尝试取代 maxlevel 的新 finalMinLevel,因为许多人对此感到困惑
使用 Application Insights 配置 NLog 和 JS 异常
我已经设置了 NLog 来与 Applicatin Insights 配合使用,还记录 js 异常,并且正在按要求工作。然而,我正在努力使仪器键动态化,因此它的目标是
我已使用 nuget 将 NLog 添加到项目中并添加了 NLog.config。我正在运行调试器并由于 LogManager.Configuration 为空而收到 NullReferenceException: LogManager.配置...
如何使用 Nlog 和 MDLC 以编程方式为 CloudWatch 设置 logGroup
我正在使用 AWS.Logger.NLog 将日志发送到 CloudWatch。 我想做的是以编程方式分配 logGroup,而不是将其放入 nlog.config 中。我测试了其他配置参数,例如...
如何将记录器(例如 NLog、log4net 等)与 Dynamics CRM 2011 ITracingService 集成?
上下文 我花费了大量时间编写自定义操作(代码活动类),偶尔还为 Dynamics CRM 2011 本地应用程序编写插件。 Dynamics 中的所有日志记录都是通过 ITracingService 完成的
我想在nlog中定义2个目标(通常是本地DevOps和UDP上的文件目标)并根据位置动态选择它们。这样做的动机是在运行时使用不同的目标
Dotnet 框架 - 在 TFS cd 管道中使用变量替换来更改 Nlog 配置
我在Web配置文件中有Nlog配置,我想更改CD管道中的文件路径,以便根据环境放置一些动态路径。 现在是 web.config 文件