我看到很多帖子提到 Microsoft.Extensions.Logging 和 NLog 的使用。
我想更好地了解 Microsoft.Extensions.Logging 的用途?
特别是为什么需要它或者将它与 NLog 一起使用有什么好处?
我在日志记录中看到了许多其他问题.最佳做法.什么日志记录平台最好.等等.这里有一些关于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实现活动传播:
TraceSource ts = new TraceSource("myUserTraceSource");
Guid oldID = Trace.CorrelationManager.ActivityId;
Guid traceID = Guid.NewGuid();
ts.TraceTransfer(0, "transfer", traceID);
Trace.CorrelationManager.ActivityId = traceID; // Trace is static
ts.TraceEvent(TraceEventType.Start, 0, "Add request");
double value1 = 100.00D;
double value2 = 15.99D;
ts.TraceInformation("Client sends message to Add " + value1 + ", " + value2);
double result = client.Add(value1, value2);
ts.TraceInformation("Client receives Add response '" + …Run Code Online (Sandbox Code Playgroud) 编辑:Common.Logging 2.1.1于2012年6月9日发布,Github页面相当活跃,作者专门评论了项目的健康状况.
我们正在考虑在新的.NET项目中使用Common.Logging,但我有点担心项目似乎变得不活跃.该主页最后一次更新于2009年,SourceForge上的最新版本于2010年创建.我已经发现与NLog 2不兼容,我担心随着时间的推移,这可能会成为一个更大的问题.我注意到Enterprise Library 5.0没有列为兼容,但我没有尝试过.
是否有其他替代方案可提供类似的通用接口?
目前我正在使用NLog将我的应用程序错误写入文本文件.除了写入Azure Blob存储之外,如何配置NLog将错误消息写入Azure Streaming Log?
我正在使用NLog并遵循建议的模式,在每个类上都有一个日志声明,以便能够跟踪哪个类/方法已写入日志.我发现每次日志写入都有一点顶级"堆栈跟踪"非常有用.
我的代码看起来像这样:
class SomeClass {
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
void DoStuff() {
logger.Debug("stuff"); }
}
Run Code Online (Sandbox Code Playgroud)
我最近要求我的单个项目写入3个单独的日志文件,为此,我添加了多个记录器和目标,如下所示:https://stackoverflow.com/a/21711838/191206
但是,现在在我的日志文件中,我丢失了类级名称.它现在只写我在NLog.config中指定的日志名称.我已经考虑过简单地通过调用来添加方法名称
System.Reflection.MethodBase.GetCurrentMethod(); // use Name property
Run Code Online (Sandbox Code Playgroud)
或像这样使用反射中的其他东西
但是,我想知道NLog是否有内置的东西我错过了?Debug()方法我只看到编写字符串的能力,带参数和可选的格式化..
这是内置到NLog?
如何 - 如果可能 - 我可以使用NLog作为翻转文件记录器吗?仿佛:
我希望31天内最多可以有31个文件,当新的一天开始时,如果有一个旧日志文件##.log,那么它应该被删除但是在那一天所有的日志都被附加并且至少会在那里为期27天.
在NLog中是否可以创建具有不同配置的多个记录器?
我有一个组件,每次实例化必须将所有事件记录到与新实例相关的不同文件.
NLog可以实现吗?如果没有,那么有日志框架可以做到这一点吗?
正如标题所示,我如何为每个应用程序运行创建一个新的日志文件?我知道怎么做分钟/小时/等.但不是应用程序.跑
我现在有:
target name="Debug" archiveEvery="Hour"
archiveFileName="${basedir}/logs/Debug.{#####}.txt" maxArchiveFiles="4"
archiveNumbering="Sequence" xsi:type="File" fileName="${basedir}/logs/Debug.txt"
layout="${date:format=HH\:mm\:ss} | ${level} | ${message} ${exception}
${exception:format=stacktrace}"
Run Code Online (Sandbox Code Playgroud)
但实际上我不需要每小时存档,我想要的是每次运行我的应用程序时存档.我在旧论坛中找到了,但我不知道如何使用Cached_layout_renderer
介绍
当用户在NLog的配置中创建错误(如无效的XML)时,我们(NLog)抛出一个NLogConfigurationException.该例外包含描述错误的内容.
但有时如果第一次调用NLog来自静态字段/属性,则会NLogConfigurationException被"吃掉" System.TypeInitializationException.
例
例如,如果用户有此程序:
using System;
using System.Collections.Generic;
using System.Linq;
using NLog;
namespace TypeInitializationExceptionTest
{
class Program
{
//this throws a NLogConfigurationException because of bad config. (like invalid XML)
private static Logger logger = LogManager.GetCurrentClassLogger();
static void Main()
{
Console.WriteLine("Press any key");
Console.ReadLine();
}
}
}
Run Code Online (Sandbox Code Playgroud)
并且配置中存在错误,NLog抛出:
throw new NLogConfigurationException("Exception occurred when loading configuration from " + fileName, exception);
Run Code Online (Sandbox Code Playgroud)
但是用户会看到:
"将异常详细信息复制到剪贴板":
System.TypeInitializationException未处理消息:mscorlib.dll中发生未处理的类型'System.TypeInitializationException'的异常附加信息:'TypeInitializationExceptionTest.Program'的类型初始值设定项引发异常.
所以消息消失了!
问题
TypeInitializationException吗?像一条消息?我们已经发送了一个innerException.Exception以便报告更多信息? …