加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net核心 – 在ASP.NET核心应用程序中使用NLog

发布时间:2020-12-16 00:23:05 所属栏目:asp.Net 来源:网络整理
导读:我发现一个 CodeProject的例子,如何让这个工作,但它不工作。主要的问题似乎是Nuget中似乎不存在“Microsoft.Framework.Logging.NLog”:“1.0.0- *”包。我看过 this StackOverflow question,看了它引用的GitHub示例,但它似乎包含相同的问题。 我试图让
我发现一个 CodeProject的例子,如何让这个工作,但它不工作。主要的问题似乎是Nuget中似乎不存在“Microsoft.Framework.Logging.NLog”:“1.0.0- *”包。我看过 this StackOverflow question,看了它引用的GitHub示例,但它似乎包含相同的问题。

我试图让我自己工作,我想出来的最好的是:

public class NLogLogger : ILogger
{
    public NLogLogger()
    {
        new WebLoggerConfigurer().ConfigureDefault();
    }

    public void Log(LogLevel logLevel,int eventId,object state,Exception exception,Func<object,Exception,string> formatter)
    {
        // currently need the global:: for LogLevels because our namespace contains NLog in it. Is there a better naming convention we could use instead?
        var ll = logLevel == LogLevel.Debug ? global::NLog.LogLevel.Debug
                : logLevel == LogLevel.Verbose ? global::NLog.LogLevel.Trace
                : logLevel == LogLevel.Critical ? global::NLog.LogLevel.Fatal
                : logLevel == LogLevel.Error ? global::NLog.LogLevel.Error
                : logLevel == LogLevel.Information ? global::NLog.LogLevel.Info
                : logLevel == LogLevel.Warning ? global::NLog.LogLevel.Warn
                : global::NLog.LogLevel.Off;

        LogManager.GetCurrentClassLogger().Log(ll,formatter(state,exception));
    }

    public bool IsEnabled(LogLevel logLevel)
    {
        return true;
    }

    public IDisposable BeginScopeImpl(object state)
    {
        return new Disposable(() => { });
    }
}

public class NLogLoggerProvider : ILoggerProvider
{
    public void Dispose()
    {
    }

    public ILogger CreateLogger(string categoryName)
    {
        return new NLogLogger();
    }
}

public void Configure(IApplicationBuilder app,IHostingEnvironment env,ILoggerFactory loggerFactory)
{
    loggerFactory.AddProvider(new NLogLoggerProvider());
    ..
}

BeginScopeImpl的实现似乎是一个黑客,但我不确定如何最好地实现它。

>这看起来像一个有效的实现选项吗?
>有没有更好的方法来实现BeginScopeImpl?
>还有另一种让NLog与ASP.NET 5一起工作的方法?

解决方法

Microsoft.Framework.Logging.NLog已被替换为 NLog.Extensions.Logging on NuGet,由NLog团队维护。

对于ASP.NET Core,您需要NLog.Web.AspNetCore(依赖于
NLog.Extensions.Logging)

如何使用:

public void Configure(IApplicationBuilder app,ILoggerFactory loggerFactory)
{
    //add NLog to .NET Core
    loggerFactory.AddNLog();

    //Enable ASP.NET Core features (NLog.web) - only needed for ASP.NET Core users
    app.AddNLogWeb();

    //needed for non-NETSTANDARD platforms: configure nlog.config in your project root. NB: you need NLog.Web.AspNetCore package for this. 
    env.ConfigureNLog("nlog.config");
    ...
    //you could use LogManager.Configuration from here


public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    // e.g. services.AddMvc();

    //needed for NLog.Web
    services.AddSingleton<IHttpContextAccessor,HttpContextAccessor>();
}

示例如何配置,日志和过滤器,另请参见README.md in GitHub。

public class HomeController : Controller
{
    protected ILogger Logger { get; }

    public HomeController(ILoggerFactory loggerFactory,IServiceProvider serviceProvider)
    {
        Logger = loggerFactory.CreateLogger(GetType().Namespace);
        Logger.LogInformation("created homeController");
    }

配置:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="true"
      internalLogLevel="Warn"
      internalLogFile="c:tempinternal.txt">


  <extensions>
    <!--enable NLog.Web for ASP.NET Core-->
    <add assembly="NLog.Web.AspNetCore"/>
  </extensions>

  <!-- define various log targets -->
  <targets>
    <!-- write logs to file -->
    <target xsi:type="File" name="allfile" fileName="c:tempnlog-all-${shortdate}.log"
                 layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />

    <target xsi:type="File" name="ownFile" fileName="c:tempnlog-own-${shortdate}.log"
              layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />

    <target xsi:type="Null" name="blackhole" />
  </targets>

  <rules>
    <!--All logs,including from Microsoft-->
    <logger name="*" minlevel="Trace" writeTo="allfile" />

    <!--Skip Microsoft logs and so log only own logs-->
    <logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" />
    <logger name="*" minlevel="Trace" writeTo="ownFile" />
  </rules>
</nlog>

“nlog-own-2016-02-14.log”包含:

2016-02-14 16:27:04.0547|aspnet5application.Controllers|INFO|created homeController

2016-02-14 16:27:04.0547|aspnet5application.Controllers|INFO|created homeController

干杯,

朱利安(NLog)

编辑:更新为NLog.Web.AspNetCore 4.3

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读