问题标签 [nlog]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 如何使用 NLog 记录到多个目标?
我正在使用 NLog,我想同时登录到 RichTextBox 和 File。我想以编程方式配置 Logger,而不是使用 xml 配置文件。
以下代码仅记录到最后一个目标(在本例中为文件)。有人可以帮忙吗?
asp.net-mvc-2 - ASP.NET MVC2 + Ninject + NLog(+ 共享主机?)= NullReferenceException
我有一个基于Tekpub Starter Site的 MVC2 应用程序,因此它使用 Ninject 进行依赖注入,使用 NLog 进行日志记录,并在不同的地方使用了一堆其他库。据我所知,正是这些导致了我的问题。
使用 ASP.NET 开发服务器 (Cassini) 在我的 PC 上一切正常,但是当我部署到服务器时(这是一个便宜的共享托管交易),我得到一个 NullReferenceException,它似乎与 Ninject 实例化记录器有关。
这是我的 Global.asax.cs 的相关部分
nlog.config
NLogLogger 类:
堆栈跟踪:
如果我注释掉登录OnApplicationStarted
,我会得到一个不同的异常。我不确定它为什么会发生,因为不应该发生任何日志记录,所以我不确定它为什么要尝试实例化记录器。
我能让网站正常工作的唯一方法是完全伪造记录器,我对此一点也不满意。这是我第一次玩 ASP.NET 共享主机,所以我有点不知所措。有人有什么有用的建议吗?
c# - 依赖注入和命名记录器
我有兴趣了解更多关于人们如何使用依赖注入平台注入日志的信息。尽管下面的链接和我的示例引用了 log4net 和 Unity,但我不一定会使用其中任何一个。对于依赖注入/IOC,我可能会使用 MEF,因为这是项目的其余部分(大型)正在制定的标准。
我对依赖注入/ioc 很陌生,对 C# 和 .NET 也很陌生(在过去 10 年左右的 VC6 和 VB6 之后,我在 C#/.NET 中编写的生产代码很少)。我对现有的各种日志记录解决方案进行了大量调查,因此我认为我对它们的功能集有一个不错的处理。我只是对注入一个依赖项的实际机制不够熟悉(或者,也许更“正确”,注入一个依赖项的抽象版本)。
我看过其他与日志和/或依赖注入相关的帖子,例如: 依赖注入和日志接口
我的问题与“如何使用 ioc 工具 yyy 注入日志记录平台 xxx?”没有特别的关系。相反,我对人们如何处理日志记录平台(通常但并不总是推荐)和配置(即 app.config)的处理方式很感兴趣。例如,以 log4net 为例,我可以配置(在 app.config 中)一些记录器,然后以使用如下代码的标准方式获取这些记录器(没有依赖注入):
或者,如果我的记录器不是为一个类命名,而是为一个功能区域命名,我可以这样做:
所以,我想我的“要求”是这样的:
我想将我的产品来源与对日志平台的直接依赖隔离开来。
我希望能够通过某种依赖注入(可能是 MEF)直接或间接地解析一个特定的命名记录器实例(可能在同一个命名实例的所有请求者之间共享同一个实例)。
我不知道我是否会将此称为硬性要求,但我希望能够按需获取命名记录器(不同于类记录器)。例如,我可能会根据类名为我的类创建一个记录器,但是一种方法需要特别繁重的诊断,我想单独控制这些诊断。换句话说,我可能希望单个类“依赖”两个单独的记录器实例。
让我们从第 1 条开始。我已经阅读了很多文章,主要是关于 stackoverflow 的文章,关于包装是否是个好主意。请参阅上面的“最佳实践”链接并转到jeffrey hantin的评论,了解为什么包装 log4net 不好。如果您确实进行了包装(并且如果您可以有效地包装),您会为了注入/删除直接依赖而严格包装吗?或者您是否还会尝试抽象出部分或全部 log4net app.config 信息?
假设我想使用 System.Diagnostics,我可能想实现一个基于接口的记录器(甚至可能使用“通用”ILogger/ILog 接口),可能基于 TraceSource,以便我可以注入它。您是否会实现接口,比如通过 TraceSource,并按原样使用 System.Diagnostics app.config 信息?
像这样的东西:
并像这样使用它:
转到第 2 点...如何解析特定的命名记录器实例?我是否应该只利用我选择的日志记录平台的 app.config 信息(即根据 app.config 中的命名方案解析记录器)?那么,在 log4net 的情况下,我是否更喜欢“注入”LogManager(请注意,我知道这是不可能的,因为它是一个静态对象)?我可以包装 LogManager(称之为 MyLogManager),给它一个 ILogManager 接口,然后解析 MyLogManager.ILogManager 接口。我的其他对象可能在 ILogManager 上具有依赖关系(MEF 用语中的导入)(从实现它的程序集中导出)。现在我可以有这样的对象:
任何时候调用 ILogManager,它都会直接委托给 log4net 的 LogManager。或者,包装后的 LogManager 是否可以采用它基于 app.config 获取的 ILogger 实例,并按名称将它们添加到(a?)MEF 容器中。稍后,当请求同名的记录器时,会在包装后的 LogManager 中查询该名称。如果 ILogger 在那里,它会以这种方式解决。如果 MEF 可以做到这一点,这样做有什么好处吗?
在这种情况下,实际上,只有 ILogManager 被“注入”,它可以像 log4net 通常那样分发 ILogger 实例。这种类型的注入(本质上是工厂)与注入命名记录器实例相比如何?这确实允许更轻松地利用 log4net(或其他日志记录平台)的 app.config 文件。
我知道我可以像这样从 MEF 容器中获取命名实例:
但是如何将命名实例放入容器中?我知道基于属性的模型,我可以在其中拥有 ILogger 的不同实现,每个实现都被命名(通过 MEF 属性),但这并没有真正帮助我。有没有办法创建类似于 app.config (或其中的一个部分)的东西,它会按名称列出记录器(所有相同的实现)并且 MEF 可以读取?是否可以/应该有一个中央“管理器”(如 MyLogManager)通过底层 app.config 解析命名记录器,然后将解析的记录器插入 MEF 容器?这样,其他有权访问同一 MEF 容器的人就可以使用它(尽管 MyLogManager 不知道如何使用 log4net 的 app.config 信息,
这已经变得很长了。我希望它是连贯的。请随时分享有关您如何依赖注入日志平台(我们很可能考虑 log4net、NLog 或基于 System.Diagnostics 构建的其他东西(希望很薄))到您的应用程序的任何具体信息。
您是否注入了“管理器”并让它返回记录器实例?
您是否在自己的配置部分或 DI 平台的配置部分中添加了一些您自己的配置信息,以便更容易/可以直接注入记录器实例(即,使您的依赖项在 ILogger 而不是 ILogManager 上)。
拥有一个包含 ILogManager 接口或一组命名 ILogger 实例的静态或全局容器怎么样?因此,不是传统意义上的注入(通过构造函数、属性或成员数据),而是按需显式解决日志记录依赖关系。这是依赖注入的好方法还是坏方法。
我将其标记为社区 wiki,因为它似乎不是一个有明确答案的问题。如果有人觉得不一样,请随时更改。
谢谢你的帮助!
xml - 配置 NLog 以在 XML 输出中记录异常?
目前,我们有 NLog 吐出 CSV 文件只是为了证明我们有 NLog 实际记录异常。
这按预期工作,只是我需要它以 XML 格式输出。我查看了 NLog 文档,唯一发现的是有一个 Log4JXmlEventLayout,但文档没有说明如何使用它。我是 NLog 的新手,我找不到太多关于这个主题的资源。
c# - 初始化 Nlog 事件日志目标时出现安全异常
我在托管在 IIS 和 Windows server 2003 上的 ASP.NET 应用程序中使用 NLog。当我在开发机器上运行代码时,一切正常。但是当我将代码部署到服务器时。NLog 目标的初始化会导致一个安全异常:
安全异常描述:应用程序试图执行安全策略不允许的操作。要授予此应用程序所需的权限,请联系您的系统管理员或在配置文件中更改应用程序的信任级别。
源错误:
在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常起源和位置的信息。
堆栈跟踪:
[SecurityException: Requested registry access is not allowed.]
System.ThrowHelper.ThrowSecurityException(ExceptionResource resource) +51
Microsoft.Win32.RegistryKey.OpenSubKey(String name, Boolean writable) +7462217
System.Diagnostics.EventLog.CreateEventSource(EventSourceCreationData sourceData) + 366
NLog.Targets.EventLogTarget.CreateEventSourceIfNeeded() +637 NLog.Targets.EventLogTarget.InitializeTarget() +40 NLog.Targets.Target.Initialize() +264 NLog.Config.LoggingConfiguration.InitializeAll() +233
有人在什么时候应该怎么做才能给应用程序适当的许可?谢谢!
c# - 在 NLog 运行时添加/删除日志文件
我正在编写一个小文件转换实用程序。文件在放入目录时会自动转换。
我正在使用 NLog 进行日志记录。除了使用NLog.conf配置的中央日志文件(并接收所有生成的消息)之外,我想为每个输入文件创建一个额外的日志文件,具有相似的名称并包含在转换过程中写入的所有日志消息.
不幸的是,我似乎无法找出如何在运行时正确添加新文件目标和适当的规则。我希望Logger
在转换过程中所有对象都写入新的日志文件。
我尝试了类似的东西
但是没有创建日志文件。
我做错了什么?任何的想法?
nlog - 如何在 NLog 中配置默认目标
我正在尝试将一堆应用程序使用的现有日志库转换为使用 NLog。现有的日志代码没有间接性,日志调用直接从调用者转到 Web 服务调用。现有的日志记录代码是作为静态单例实现的。我需要以这样一种方式执行此操作,即使用此库的现有应用程序在获取已更改的日志记录库时不需要配置或代码更改。稍后我可以根据需要更新应用程序,配置新的日志记录目标或更改代码以直接登录到 NLog。
为此,我打算让静态日志代码通过 NLog。现有的日志记录调用将通过 NLog 路由,现有的 web 服务调用将包装在自定义 NLog 目标中。
为了在不更改旧应用程序的情况下使其工作,我需要以编程方式将自定义目标设置为默认值(当配置文件中未配置任何目标时)。我想在不对众多现有应用程序进行配置更改的情况下执行此操作,因此我需要以编程方式执行此操作。
问题是......它不起作用。对这种方法有什么想法吗?下面是我尝试添加到现有记录器类中以创建默认目标的代码。
我也不介意去log4net。看看我最初选择 NLog 的 API,因为这些名称对我来说更有意义。
asp.net - NLog 可以与 customErrors 一起使用吗?
当我使用<customErrors mode="Off"/>
并且我在屏幕上出现错误时,它会写入日志文件,但是当我使用时<customErrors mode="RemoteOnly"/>
,我会看到我的自定义错误页面,但错误没有捕获但记录器:-/
wcf - 使用 log4net 或 NLog 的 WCF 日志记录/跟踪和活动 ID 传播
我已经看到了许多其他有关日志记录的问题。最佳实践。什么日志平台最好。等等。这里有一些关于 SO 的链接,对这个话题进行了很好的讨论:
开始编辑:
打完这篇长文章后,我想我想弄清楚的主要事情是 WCF 日志记录/跟踪和活动 id 传播与 System.Diagnostics 和 TraceSources 的紧密耦合程度。您能否使用第三方日志记录平台(如 log4net 或 NLog)获得“良好”的 WCF 日志记录/跟踪和活动 ID 传播。如果你这样做,你会怎么做?
有关 ServiceTraceViewer 的一些问题,请参阅这篇文章的底部,
结束编辑。
我的问题的主题在任何这些帖子中都没有详细讨论。我对人们在日志记录和 WCF 方面所做的事情很感兴趣。如果您正在处理一个包含 WCF 服务的项目并且您已经登录您的项目,您是否会特别努力使用 WCF 特定的日志记录功能。特别是,您是否尝试合并诸如活动跟踪、活动传播和端到端跟踪之类的东西?如MSDN 的这篇文章中所述。这是 MSDN 关于传播活动的另一篇文章。
这些文章很好地解释了如何使用 System.Diagnostics TraceSources 进行活动跟踪、活动传播和端到端跟踪。它显示了如何配置 WCF 以通过 app.config/web.config 文件“打开”这些选项。WCF 在内部使用 TraceSources 来记录通信结果。
下面是一些示例代码(来自上面链接的第二篇 MSDN 文章),它或多或少地展示了如何通过 System.Diagnostics 和 TraceSources 实现活动传播:
您可以通过以下方式从服务中判断 WCF 是否已传播活动:
从我看到的所有示例中,活动传播是通过配置(通常通过 app.config)System.Service 模型 TraceSource 并将其propagateActivity 属性设置为“true”来实现的。活动实际上是通过在 Trace.CorrelationManager.ActivityId 上设置活动 id (guid) 来传播的。如果您使用 log4net 或 NLog,是否可以有效地使用 WCF 日志记录和活动传播?
我的项目将大量使用 WCF。我们目前正在尝试解决我们的日志记录解决方案。我认为我非常了解 WCF 日志记录和活动传播如何与 System.Diagnostics 和 TraceSources 一起使用。我想更好地了解如何/是否可以使用 log4net 和 NLog 等日志平台实现类似的功能。
他们是否提供一些“本地”支持?他们似乎更有可能提供一些基础设施,以便可以“手动”实现活动传播。也许是这样的:
如果 log4net/NLog 日志记录格式配置为记录 NDC 堆栈的顶部,则客户端记录的每条消息(当活动在范围内时)都将使用活动 ID“标记”。假设 WCF 服务的实现方式类似,那么在服务调用期间记录的所有消息也将被记录(尽管可能在单独的文件中)并使用相同的活动 ID 进行标记。因此,可以将“服务”日志文件中的日志消息与“客户端”日志中的相应消息相关联。
因此,如果您使用 WCF 并且有日志记录,这里有一些问题:
- 你使用活动传播吗?
- 您是否使用 TraceSources 进行日志记录?
- 您是否使用其他一些日志记录平台(例如 log4net、NLog)?
- 如果您使用另一个日志记录平台,您如何进行活动传播?
- 您是否混合使用第三方日志记录(log4net/NLog - 对于大多数日志记录)和
System.Diagnostics.TraceSource
(对于 WCF 服务边界日志记录)?
ServiceTraceViewer 呢?你用它吗?我见过的大多数示例都显示了 System.Diagnostics 通过 TraceSources 和 XmlTraceListener 生成的输出。它可以消耗来自 log4net、NLog 等的输出吗?它是否与基于 TraceSource 的日志记录“最佳”?如果是这样,那么在 WCF 服务边界(捕获一些应用程序上下文以及 WCF 通信信息)仅具有一点基于 TraceSource 的日志记录以在 ServiceTraceViewer 中查看是否“足够好”?作为我正在进行的 WCF 学习过程的一部分,我简要地使用了 ServiceTraceViewer。
如果你已经走到这一步,感谢阅读。也许我过度考虑了日志记录、WCF 活动传播以及在 ServiceTraceViewer 中查看日志的能力的整个集成。在选择日志平台和/或日志策略时,这似乎是一个重要的考虑因素,但我对这些日志平台或 WCF 没有足够的经验来确定。
dependency-injection - 将 NLog 与 MEF 一起使用的最佳方式是什么?
我想知道将 NLog 与 Managed Extensibility Framework (MEF) 一起使用的最佳方式是什么?
我有一个使用 MEF 架构(导入和导出等)支持插件的应用程序我想向我的应用程序添加日志记录功能。作为一个日志组件,我想使用 NLog。
你会推荐什么?1. 为 NLog 创建一个包装器,即配置 NLog 并导出其他插件导入的 void Log(string level, string message) 等功能的附加插件 2. 每个插件都应该有它自己的 NLog 实例配置和使用。(他们实际上都会写入同一个文件)。