首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Microsoft.Extensions.Logging Vs.NLog

Microsoft.Extensions.Logging Vs.NLog
EN

Stack Overflow用户
提问于 2019-10-03 04:41:40
回答 2查看 10.8K关注 0票数 23

我看到很多帖子都提到了Microsoft.Extensions.Logging和NLog的用法。

我想更好地理解Microsoft.Extensions.Logging是做什么用的?

具体地说,为什么需要它,或者与NLog一起使用它有什么好处?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-03 07:22:32

使用NLog,您可以:

代码语言:javascript
复制
var logger = NLog.LogManager.GetCurrentClassLogger();
logger.Info("Hello {Name}", "Earth");

这适用于所有平台和所有框架。

Microsoft.Extensions.Logging

随着.NET内核的引入,微软的Microsoft.Extensions.Logging也引入了一种日志抽象。您可以在项目中使用日志记录抽象,并将其与NLog集成。

例如,在ASP.NET核心中,您可以注入Microsoft.Extensions.Logging.ILogger<HomeController>,这可以将日志发送到NLog。(参见Getting started with ASP.NET Core 2 · NLog/NLog Wiki)

代码语言:javascript
复制
using Microsoft.Extensions.Logging;

public class HomeController : Controller
{
    private readonly ILogger<HomeController> _logger;

    public HomeController(ILogger<HomeController> logger)
    {
        _logger = logger;
    }

    public IActionResult Index()
    {
        _logger.LogInformation("Index page says hello {Name}", "Universe");
        return View();
    }

套餐

对于NLog和Microsoft.Extensions.Logging,有以下软件包:

Microsoft.Extensions.Logging.Abstractions

  • The
  • .NET核心日志记录抽象位于package中,这些抽象的集成位于package NLog.Extensions.Logging中。您可以将此程序包用于applications.
  • For核心控制台.NET ASP.NET核心,有一个使用NLog.Extensions.Logging

的优化程序包NLog.Web.AspNetCore

比较

NLog的优点

直接使用NLog的优点

使用记录器performance

  • More的最佳
  • 选项,例如所有平台中的Logger.WithProperty(..)
  • Works
  • 不需要依赖项注入,从而降低了复杂性。

Pros Microsoft.Extensions.Logging

通过Microsoft.Extensions.Logging使用NLog的优点:

  • 与ASP.NET核心完全集成,例如,微软也写入记录器API,这也将被NLog
  • 捕获(并可能被过滤)写入日志抽象将使您的代码日志库与.NET核心依赖项configure NLog with appsettings.json很好地结合在一起,因此,使用

而不是

更新:添加- Using NLog with appsettings.json

票数 27
EN

Stack Overflow用户

发布于 2021-05-13 08:00:21

Microsoft.Extensions.Logging用于依赖注入,这对单元测试很方便:您可以实现一个具有LoggedText属性的记录器来支持Assert.IsTrue(_logger.LoggedText.Contains("expected value"))。下面的示例说明了这样一个类,它实现了Microsoft.Extensions.Logging.ILogger<T>,并且(为了好玩)还使用了朱利安的建议,将消息发送到NLog:

代码语言:javascript
复制
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
    
namespace MyDomain.Tests
{
   internal class WrappedNLogger<T> : ILogger<T>
    {
       private StringBuilder _sb = new StringBuilder(); //Support Assert.IsTrue(_logger.LoggedText == "expected value")
        private NLog.Logger _nlog = NLog.LogManager.GetCurrentClassLogger(); //support use of NLog

        public IDisposable BeginScope<TState>(TState state) => default;

        public bool IsEnabled(LogLevel logLevel) => true;

        public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
        {
            var jsonLine = JsonConvert.SerializeObject(new
            {
                timestamp = DateTime.Now.ToLongTimeString(),
                logLevel,
                eventId,
                parameters = (state as IEnumerable<KeyValuePair<string, object>>)?.ToDictionary(i => i.Key, i => i.Value),
                message = formatter(state, exception),
                exception = exception?.GetType().Name
            });

            _sb.AppendLine(jsonLine);
            NLog.LogLevel nloglevel = logLevel == LogLevel.Debug ? NLog.LogLevel.Debug
                                    : logLevel == LogLevel.Information ? NLog.LogLevel.Info
                                    : logLevel == LogLevel.Warning ? NLog.LogLevel.Warn
                                    : logLevel == LogLevel.Error ? NLog.LogLevel.Error
                                    : logLevel == LogLevel.Critical ? NLog.LogLevel.Fatal : NLog.LogLevel.Trace;
            _nlog.Log(nloglevel, jsonLine);
        }

        public string LoggedText { get => _sb.ToString(); }
           
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58209076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档