nlog 相关问题

NLog是.NET的免费日志记录平台

如何查询NLog日志文件的路径?

我为 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);

回答 4 投票 0

如何在运行时使用NLog获取当前目标文件的路径?

我使用 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 }); }

回答 6 投票 0

登录.net MAUI

.net MAUI 最近在其最新版本之一中删除了日志记录。现在有什么替代方案以及应该如何实施?在网上查遍了,但找不到一个例子...

回答 4 投票 0

如何通过依赖注入使.NET 6 Azure Functions V4与NLog一起使用?

我一整天都在研究这个问题,并查看了 NLog 文档、StackOverflow 和 NLog GitHub 问题。但是,没有真正的示例说明如何使 Azure Functions V4 与 NLog 配合使用...

回答 1 投票 0

自定义渲染器类不适用于日志

我的 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

回答 1 投票 0

条件适用时 Nlog 截断消息

在我的应用程序中,我想将发布或消耗的任何 AMQP 事件记录到两个文件中。第一个日志文件是我的“主”文件,其中包含我的应用程序每一层的各种日志语句...

回答 1 投票 0

运行时使用NLog忽略日志条目的正确方法

我在运行时创建一个 MongoTarget 到托管生产数据库的服务器。在运行时忽略不需要的日志条目的正确方法是什么?我目前正在创建一个 MemoryTarget 和

回答 1 投票 0

Application Insights:通过 .net core 3.1 控制台应用程序中的自定义 ITelemetryInitializer 添加云角色名称不会获取云角色名称

我正在使用 HostBuilder 在 Program.cs 中配置控制台应用程序。 在配置服务中: services.AddSingleton(p => new CustomInitializer("我的应用程序",

回答 1 投票 0

带过滤器的 NLOG 电子邮件日志未按预期工作

使用 ASP.NET 4.6.2、NLog 版本 5.1.2,当某些事件属性设置为布尔值 true 时,尝试使用 Mail 目标记录事件。这是行不通的。但在我看来它确实有效......

回答 1 投票 0

使用wrapper时Nlog Callsite错误

我使用 NLog 进行日志记录,我使用包装器来调用日志方法,我的问题是:如果我尝试打印有关调用站点(${callsite})的信息,它会打印包装器方法而不是原始方法我...

回答 4 投票 0

NLog 像 WithProperty 方法一样使用 .NET6 注入自定义属性

我有一个 .NET 4.8 项目,我按以下方式使用 NLog: 公共类 ReportsController :ApiController { private static NLog.Logger logger = NLog.LogManager.GetLogger("应用...

回答 1 投票 0

RoslynAnalyzer 在构建期间抛出转换错误

我正在尝试在 Visual Studio 2019(社区版,如果相关的话)中构建 NLog。由于下面的转换错误,NLog 未构建。我在代码中搜索了“TypeParameterSymbo...

回答 1 投票 0

当与针对相同输出的其他配置结合使用时,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,因为许多人对此感到困惑

回答 1 投票 0

使用 Application Insights 配置 NLog 和 JS 异常

我已经设置了 NLog 来与 Applicatin Insights 配合使用,还记录 js 异常,并且正在按要求工作。然而,我正在努力使仪器键动态化,因此它的目标是

回答 1 投票 0

LogManager.configuration 为空

我已使用 nuget 将 NLog 添加到项目中并添加了 NLog.config。我正在运行调试器并由于 LogManager.Configuration 为空而收到 NullReferenceException: LogManager.配置...

回答 2 投票 0

如何使用 Nlog 和 MDLC 以编程方式为 CloudWatch 设置 logGroup

我正在使用 AWS.Logger.NLog 将日志发送到 CloudWatch。 我想做的是以编程方式分配 logGroup,而不是将其放入 nlog.config 中。我测试了其他配置参数,例如...

回答 1 投票 0

.NET MAUI 示例的 Nlog

可以在.NET MAUI中使用Nlog吗? 有配置示例吗?我还没有找到任何样本。谢谢

回答 1 投票 0

如何将记录器(例如 NLog、log4net 等)与 Dynamics CRM 2011 ITracingService 集成?

上下文 我花费了大量时间编写自定义操作(代码活动类),偶尔还为 Dynamics CRM 2011 本地应用程序编写插件。 Dynamics 中的所有日志记录都是通过 ITracingService 完成的

回答 1 投票 0

NLog:如何根据环境变量有条件选择目标

我想在nlog中定义2个目标(通常是本地DevOps和UDP上的文件目标)并根据位置动态选择它们。这样做的动机是在运行时使用不同的目标

回答 2 投票 0

Dotnet 框架 - 在 TFS cd 管道中使用变量替换来更改 Nlog 配置

我在Web配置文件中有Nlog配置,我想更改CD管道中的文件路径,以便根据环境放置一些动态路径。 现在是 web.config 文件

回答 2 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.