zoukankan      html  css  js  c++  java
  • How to use Nlog for ASP.NET Core with csproj

    1. Add dependency in csproj manually or using NuGet

    Install the latest:

    • NLog.Web.AspNetCore 4.5+
    • Update the NLog package if possible

    in csproj:

    <PackageReference Include="NLog.Web.AspNetCore" Version="4.5.1" />
    <PackageReference Include="NLog" Version="4.5.1" />

    2. Create a nlog.config file.

    Create nlog.config (lowercase all) file in the root of your project.

    We use this example:

     1 <?xml version="1.0" encoding="utf-8" ?>
     2 <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
     3       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4       autoReload="true"
     5       internalLogLevel="info"
     6       internalLogFile="c:	empinternal-nlog.txt">
     7 
     8   <!-- enable asp.net core layout renderers -->
     9   <extensions>
    10     <add assembly="NLog.Web.AspNetCore"/>
    11   </extensions>
    12 
    13   <!-- the targets to write to -->
    14   <targets>
    15     <!-- write logs to file  -->
    16     <target xsi:type="File" name="allfile" fileName="c:	emp
    log-all-${shortdate}.log"
    17             layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" />
    18 
    19     <!-- another file log, only own logs. Uses some ASP.NET core renderers -->
    20     <target xsi:type="File" name="ownFile-web" fileName="c:	emp
    log-own-${shortdate}.log"
    21             layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" />
    22   </targets>
    23 
    24   <!-- rules to map from logger name to target -->
    25   <rules>
    26     <!--All logs, including from Microsoft-->
    27     <logger name="*" minlevel="Trace" writeTo="allfile" />
    28 
    29     <!--Skip non-critical Microsoft logs and so log only own logs-->
    30     <logger name="Microsoft.*" maxLevel="Info" final="true" /> <!-- BlackHole without writeTo -->
    31     <logger name="*" minlevel="Trace" writeTo="ownFile-web" />
    32   </rules>
    33 </nlog>

    More details of the config file are here.

    If you like to include other targets or layout renderers, check the Platform support table, as there is a limited set implemented. Check the column NetStandard. To read more about NetStandard, see the docs from Microsoft

    3. Enable copy to bin folder

    Enable copy to bin folder for nlog.config

    image

    or edit .csproj file manually and add:

      <ItemGroup>
        <Content Update="nlog.config" CopyToOutputDirectory="PreserveNewest" />
      </ItemGroup>

    4. Update program.cs

    Update the program.cs

    add using NLog.Web; and using Microsoft.Extensions.Logging;

     1 public static void Main(string[] args)
     2 {
     3     // NLog: setup the logger first to catch all errors
     4     var logger = NLog.Web.NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
     5     try
     6     {
     7         logger.Debug("init main");
     8         BuildWebHost(args).Run(); 
     9     }
    10     catch (Exception ex)
    11     {
    12         //NLog: catch setup errors
    13         logger.Error(ex, "Stopped program because of exception");
    14         throw;
    15     }
    16     finally
    17     {
    18         // Ensure to flush and stop internal timers/threads before application-exit (Avoid segmentation fault on Linux)
    19         NLog.LogManager.Shutdown();
    20     }
    21 }
    22 
    23 public static IWebHost BuildWebHost(string[] args) =>
    24     WebHost.CreateDefaultBuilder(args)
    25         .UseStartup<Startup>()
    26         .ConfigureLogging(logging =>
    27         {
    28             logging.ClearProviders();
    29             logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
    30         })
    31         .UseNLog()  // NLog: setup NLog for Dependency injection
    32         .Build();

    5. Configure appsettings.json

    The Logging configuration specified in appsettings.json overrides any call to SetMinimumLevel. So either remove "Default": or adjust it correctly to your needs.

    1 {
    2     "Logging": {
    3         "LogLevel": {
    4             "Default": "Trace",
    5             "Microsoft": "Information"
    6         }
    7     }
    8 }

    Remember to also update any environment specific configuration to avoid any surprises. Ex appsettings.Development.json

    6. Write logs

    Inject the ILogger in your controller:

    
    
     1 using Microsoft.Extensions.Logging;
     2 
     3 public class HomeController : Controller
     4 {
     5     private readonly ILogger<HomeController> _logger;
     6 
     7     public HomeController(ILogger<HomeController> logger)
     8     {
     9         _logger = logger;
    10     }
    11 
    12     public IActionResult Index()
    13     {
    14         _logger.LogInformation("Index page says hello");
    15         return View();
    16     }
    
    
    
    
    

    7. Example Output

    When starting the ASP.NET Core website, we get two files:

    nlog-own-2017-10-10.log

    2017-10-10 23:40:29.5143||DEBUG|ASP.NET_Core_2___VS2017.Program|init main |url: |action: 
    2017-10-10 23:40:32.1326|0|INFO|ASP.NET_Core_2___VS2017.Controllers.HomeController|Hello, this is the index! |url: http://localhost/|action: Index
    

    nlog-all-2017-10-10.log

    2017-10-10 23:40:29.5143||DEBUG|ASP.NET_Core_2___VS2017.Program|init main 
    2017-10-10 23:40:30.9739|0|INFO|Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager|User profile is available. Using 'C:Usersj.verdurmenAppDataLocalASP.NETDataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest. 
    2017-10-10 23:40:30.9897|37|DEBUG|Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository|Reading data from file 'C:Usersj.verdurmenAppDataLocalASP.NETDataProtection-Keyskey-bfd1ce07-8dc6-4eef-a51a-d21ddb547109.xml'. 
    2017-10-10 23:40:31.0004|18|DEBUG|Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager|Found key {bfd1ce07-8dc6-4eef-a51a-d21ddb547109}. 
    2017-10-10 23:40:31.0124|13|DEBUG|Microsoft.AspNetCore.DataProtection.KeyManagement.DefaultKeyResolver|Considering key {bfd1ce07-8dc6-4eef-a51a-d21ddb547109} with expiration date 2017-12-28 19:01:07Z as default key. 
    2017-10-10 23:40:31.0422|0|DEBUG|Microsoft.AspNetCore.DataProtection.TypeForwardingActivator|Forwarded activator type request from Microsoft.AspNetCore.DataProtection.XmlEncryption.DpapiXmlDecryptor, Microsoft.AspNetCore.DataProtection, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60 to Microsoft.AspNetCore.DataProtection.XmlEncryption.DpapiXmlDecryptor, Microsoft.AspNetCore.DataProtection, Culture=neutral, PublicKeyToken=adb9793829ddae60 
    2017-10-10 23:40:31.0422|51|DEBUG|Microsoft.AspNetCore.DataProtection.XmlEncryption.DpapiXmlDecryptor|Decrypting secret element using Windows DPAPI. 
    2017-10-10 23:40:31.0422|0|DEBUG|Microsoft.AspNetCore.DataProtection.TypeForwardingActivator|Forwarded activator type request from Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.AuthenticatedEncryptorDescriptorDeserializer, Microsoft.AspNetCore.DataProtection, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60 to Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.AuthenticatedEncryptorDescriptorDeserializer, Microsoft.AspNetCore.DataProtection, Culture=neutral, PublicKeyToken=adb9793829ddae60 
    2017-10-10 23:40:31.0422|4|DEBUG|Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.CngCbcAuthenticatedEncryptorFactory|Opening CNG algorithm 'AES' from provider '(null)' with chaining mode CBC. 
    2017-10-10 23:40:31.0543|3|DEBUG|Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.CngCbcAuthenticatedEncryptorFactory|Opening CNG algorithm 'SHA256' from provider '(null)' with HMAC. 
    2017-10-10 23:40:31.0543|2|DEBUG|Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingProvider|Using key {bfd1ce07-8dc6-4eef-a51a-d21ddb547109} as the default key. 
    2017-10-10 23:40:31.0543|0|DEBUG|Microsoft.AspNetCore.DataProtection.Internal.DataProtectionStartupFilter|Key ring with default key {bfd1ce07-8dc6-4eef-a51a-d21ddb547109} was loaded during application startup. 
    2017-10-10 23:40:31.4080|3|DEBUG|Microsoft.AspNetCore.Hosting.Internal.WebHost|Hosting starting 
    2017-10-10 23:40:31.5508|4|DEBUG|Microsoft.AspNetCore.Hosting.Internal.WebHost|Hosting started 
    2017-10-10 23:40:31.5508|0|DEBUG|Microsoft.AspNetCore.Hosting.Internal.WebHost|Loaded hosting startup assembly ASP.NET Core 2 - VS2017 
    2017-10-10 23:40:31.5526|0|DEBUG|Microsoft.AspNetCore.Hosting.Internal.WebHost|Loaded hosting startup assembly Microsoft.AspNetCore.ApplicationInsights.HostingStartup 
    2017-10-10 23:40:31.5526|0|DEBUG|Microsoft.AspNetCore.Hosting.Internal.WebHost|Loaded hosting startup assembly Microsoft.AspNetCore.Server.IISIntegration 
    2017-10-10 23:40:31.6909|1|DEBUG|Microsoft.AspNetCore.Server.Kestrel|Connection id "0HL8G4U42CK64" started. 
    2017-10-10 23:40:31.6909|1|DEBUG|Microsoft.AspNetCore.Server.Kestrel|Connection id "0HL8G4U42CK65" started. 
    2017-10-10 23:40:31.7418|19|DEBUG|Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv|Connection id "0HL8G4U42CK65" reset. 
    2017-10-10 23:40:31.7418|10|DEBUG|Microsoft.AspNetCore.Server.Kestrel|Connection id "0HL8G4U42CK65" disconnecting. 
    2017-10-10 23:40:31.7418|7|DEBUG|Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv|Connection id "0HL8G4U42CK65" sending FIN. 
    2017-10-10 23:40:31.7591|2|DEBUG|Microsoft.AspNetCore.Server.Kestrel|Connection id "0HL8G4U42CK65" stopped. 
    2017-10-10 23:40:31.8153|1|INFO|Microsoft.AspNetCore.Hosting.Internal.WebHost|Request starting HTTP/1.1 GET http://localhost:56152/   
    2017-10-10 23:40:31.8607|4|DEBUG|Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware|The request path / does not match a supported file type 
    2017-10-10 23:40:32.0160|1|DEBUG|Microsoft.AspNetCore.Routing.RouteBase|Request successfully matched the route with name 'default' and template '{controller=Home}/{action=Index}/{id?}'. 
    2017-10-10 23:40:32.1120|1|DEBUG|Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker|Executing action ASP.NET_Core_2___VS2017.Controllers.HomeController.Index (ASP.NET Core 2 - VS2017) 
    2017-10-10 23:40:32.1326|1|INFO|Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker|Executing action method ASP.NET_Core_2___VS2017.Controllers.HomeController.Index (ASP.NET Core 2 - VS2017) with arguments ((null)) - ModelState is Valid 
    2017-10-10 23:40:32.1326|0|INFO|ASP.NET_Core_2___VS2017.Controllers.HomeController|Hello, this is the index! 
    2017-10-10 23:40:32.1620|2|DEBUG|Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker|Executed action method ASP.NET_Core_2___VS2017.Controllers.HomeController.Index (ASP.NET Core 2 - VS2017), returned result Microsoft.AspNetCore.Mvc.ViewResult. 
    2017-10-10 23:40:32.1620|1|DEBUG|Microsoft.AspNetCore.Mvc.Razor.RazorViewEngine|View lookup cache miss for view 'Index' in controller 'Home'. 
    2017-10-10 23:40:33.6906|1|DEBUG|Microsoft.AspNetCore.Mvc.Razor.Internal.RazorViewCompiler|Compilation of the generated code for the Razor file at 'X:
    logNLog.WebexamplesASP.NET Core 2Visual Studio 2017ASP.NET Core 2 - VS2017ViewsHomeIndex.cshtml' started. 
    2017-10-10 23:40:35.7180|2|DEBUG|Microsoft.AspNetCore.Mvc.Razor.Internal.RazorViewCompiler|Compilation of the generated code for the Razor file at 'X:
    logNLog.WebexamplesASP.NET Core 2Visual Studio 2017ASP.NET Core 2 - VS2017ViewsHomeIndex.cshtml' completed in 2024.1338ms. 
    2017-10-10 23:40:35.7988|1|DEBUG|Microsoft.AspNetCore.Mvc.Razor.Internal.RazorViewCompiler|Compilation of the generated code for the Razor file at 'X:
    logNLog.WebexamplesASP.NET Core 2Visual Studio 2017ASP.NET Core 2 - VS2017Views\_ViewStart.cshtml' started. 
    
  • 相关阅读:
    将博客搬至CSDN
    U盘启动盘 安装双系统 详细教程
    vmware安装linux6.3
    hadoop学习之路
    linux重定向总结:如何将shell命令的输出信息自动输出到文件中保存
    AVRO讲解
    MapReduce 工作原理
    lucene索引存储原理
    ES数据库系统
    分流器设备与交换机设备的区别
  • 原文地址:https://www.cnblogs.com/saodiseng2015/p/9649284.html
Copyright © 2011-2022 走看看