• 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. 
    
  • 相关阅读:
    系统调用与库函数
    在树莓派上 搭建sqlite数据库
    (转)inux Read系统调用
    查看当前日期是这一年的第几天
    求解某个范围内的全部完数
    求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。
    输入三个整数x,y,z,请把这三个数据由大到小输出。
    模仿ArrayList底层实现
    可视化日历
    Oracle之约束条件1:主键约束
  • 原文地址:https://www.cnblogs.com/saodiseng2015/p/9649284.html
Copyright © 2020-2023  润新知