NLog之快速入门

前言

今天小区例可以下楼了但是还不能出去,不多少说了,言归正传,.Net项目中关于日志的组件还是很多的,包括log4net,Nlog,以及.net core 框架自带的Logging,今天就简单介绍一下Nlog。

环境

  • Win10
  • VS2022
  • .NET5.0

NLog介绍

NLog是一个基于.NET平台编写的类库,我们可以使用NLog在应用程序中添加即为完善的跟踪调试代码。
NLog是一个简单灵活的.NET日志记录类库。通过使用NLog,我们可以在任何一种.NET语言中输出带有上下文的调试诊断信息,根据个人的爱好配置其输出的样式,然后发送到一个或多个输出目标(target)中。
NLog的API非常类似于log4net,且配置方式非常简单。NLog使用路由表进行配置,这样就让NLog的配置文件非常容易阅读,并便于今后维护。
NLog遵循BSD license,即允许商业应用且完全开放源代码。任何人都可以免费使用并对其进行测试,然后通过邮件列表反馈问题以及建议。
NLog支持.NET、C/C++以及COM组件,因此我们的程序、组件、包括用C++/COM编写的遗留模块都可以通过同一个路由引擎将信息发送至NLog中。
简单来说,NLog就是用来记录项目日志的组件。

项目实践

新建WebAPI项目,项目如下:

image

引用Nlog依赖如下:

<P>NLog.Web.AspNetCore</P>

<P>NLog</P>


创建一个nlog.config文件

Step1: 在项目的根目录中创建nlog.config文件。

image

配置如下:

<?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="Info"
      internalLogFile="c:\temp\internal-nlog.txt">


    <!-- enable asp.net core layout renderers -->
    <extensions>
        <add assembly="NLog.Web.AspNetCore"/>
    </extensions>


    <!-- the targets to write to -->
    <targets>
        <!-- write logs to file  -->
        <target xsi:type="File" name="allfile" fileName="c:\temp\nlog-all-${shortdate}.log"
                layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" />


        <!-- another file log, only own logs. Uses some ASP.NET core renderers -->
        <target xsi:type="File" name="ownFile-web" fileName="c:\temp\nlog-own-${shortdate}.log"
                layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" />
    </targets>


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


        <!--Skip non-critical Microsoft logs and so log only own logs-->
        <logger name="Microsoft.*" maxlevel="Info" final="true" />
        <!-- BlackHole without writeTo -->
        <logger name="System.Net.Http.*" maxlevel="Info" final="true" />
        <!-- BlackHole without writeTo -->


        <logger name="*" minlevel="Trace" writeTo="ownFile-web" />
    </rules>
</nlog>

注意,如果删除所有其他LoggingProviders(如控制台)并且仅使用NLog,则可能必须特别注意Hosting Lifetime Startup Messages。因为这可能导致托管环境(Visual Studio / Docker / Azure容器)看不到已启动的应用程序。


更新program.cs

代码:

public class Program
    {
        public static void Main(string[] args)
        {
            var logger = NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
            try
            {
                logger.Debug("init main");
                CreateHostBuilder(args).Build().Run();
            }
            catch (Exception exception)
            {
                //NLog: catch setup errors
                logger.Error(exception, "Stopped program because of exception");
                throw;
            }
            finally
            {
                // Ensure to flush and stop internal timers/threads before application-exit (Avoid segmentation fault on Linux)
                NLog.LogManager.Shutdown();
            }

        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                }).ConfigureLogging(logging =>
                {
                    logging.ClearProviders();
                    logging.SetMinimumLevel(LogLevel.Trace);
                })
                .UseNLog();// NLog: Setup NLog for Dependency injection
    }


配置appsettings.json / appsettings.Development.json

代码如下:

{
  "Logging": {
    "LogLevel": {
      "Default": "Trace",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}

注意:

指定的日志记录配置appsettings.json会覆盖对的任何调用SetMinimumLevel。因此"Default":,请根据您的需要删除或正确调整它。

修改天气WeatherForecast接口

代码:

[ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        private static readonly string[] Summaries = new[]
        {
            "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
        };

        private readonly ILogger<WeatherForecastController> _logger;

        public WeatherForecastController(ILogger<WeatherForecastController> logger)
        {
            _logger = logger;
            _logger.LogDebug(1, "NLog injected into WeatherForecastController");

        }

        [HttpGet]
        public IEnumerable<WeatherForecast> Get()
        {
            _logger.LogInformation("Hello, this is the GetWeatherForecast!");
            var rng = new Random();
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateTime.Now.AddDays(index),
                TemperatureC = rng.Next(-20, 55),
                Summary = Summaries[rng.Next(Summaries.Length)]
            })
            .ToArray();
        }
    }


运行结果

image

image


总结

如果引入了Nlog.Config这个组件的话,配置文件是会自动创建的,不过文件还是得修改一下,所以,自己添加之后修改也是一样的。

因为 .net core自身的Dependency injection(依赖注入),可以允许在控制器中注入logger进行日志记录。

鸣谢

https://blog.csdn.net/sD7O95O/article/details/114908326?spm=1001.2101.3001.6650.13&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-13.pc_relevant_paycolumn_v3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-13.pc_relevant_paycolumn_v3&utm_relevant_index=17

https://blog.csdn.net/u012869793/article/details/122341838

源码

https://github.com/yandaniugithub/NETCore

posted @ 2022-05-01 21:59  春光牛牛  阅读(564)  评论(0编辑  收藏  举报