NLog is a flexible and free logging platform for various .NET platforms, including .NET standard. NLog makes it easy to write to several targets. (database, file, console) and change the logging configuration on-the-fly.

官网:https://nlog-project.org

开源地址:https://github.com/NLog/NLog

最佳实践

控制台项目

在项目中添加组件包

Install-Package Microsoft.Extensions.Configuration.Json

Install-Package NLog

Install-Package NLog.Extensions.Logging

{

"Logging": {

"LogLevel": {

"Default": "Information",

"Microsoft": "Warning",

"Microsoft.Hosting.Lifetime": "Information"

}

},

"AllowedHosts": "*"

}

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

autoReload="true"

internalLogLevel="Warn"

internalLogFile="internal-nlog.txt">

layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />

layout="${longdate}|${logger}|${uppercase:${level}}| ${message} ${exception}" />

添加一个类Runner.cs。

using Microsoft.Extensions.Logging;

namespace ConsoleDemo

{

public class Runner

{

private readonly ILogger _logger;

public Runner(ILogger logger)

{

_logger = logger;

}

public void DoAction(string name)

{

_logger.LogDebug(20, "Doing hard work! {Action}", name);

}

}

}

通过注入的方式调用。

using Microsoft.Extensions.Configuration;

using Microsoft.Extensions.DependencyInjection;

using Microsoft.Extensions.Logging;

using NLog;

using NLog.Extensions.Logging;

using System;

namespace ConsoleDemo

{

class Program

{

static void Main(string[] args)

{

var logger = LogManager.GetCurrentClassLogger();

try

{

var config = new ConfigurationBuilder().SetBasePath(System.IO.Directory.GetCurrentDirectory())

.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)

.Build();

var servicesProvider = BuildDi(config);

using (servicesProvider as IDisposable)

{

var runner = servicesProvider.GetRequiredService();

runner.DoAction("Action1");

Console.WriteLine("Press ANY key to exit");

Console.ReadKey();

}

}

catch (Exception ex)

{

// NLog: catch any exception and log it.

logger.Error(ex, "Stopped program because of exception");

throw;

}

finally

{

LogManager.Shutdown();

}

}

private static IServiceProvider BuildDi(IConfiguration config)

{

return new ServiceCollection()

.AddTransient() // Runner is the custom class

.AddLogging(loggingBuilder =>

{

// configure Logging with NLog

loggingBuilder.ClearProviders();

loggingBuilder.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);

loggingBuilder.AddNLog(config);

})

.BuildServiceProvider();

}

}

}

运行项目,项目根目录下会多出两个日志文件。

AspNetCore项目

在项目中添加组件包

Install-Package NLog

Install-Package NLog.Web.AspNetCore

{

"Logging": {

"LogLevel": {

"Default": "Trace",

"Microsoft": "Warning",

"Microsoft.Hosting.Lifetime": "Information"

}

},

"AllowedHosts": "*"

}

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

autoReload="true"

internalLogLevel="Warn"

internalLogFile="internal-nlog.txt">

layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />

layout="${longdate}|${logger}|${uppercase:${level}}| ${message} ${exception}" />

在Program.cs中使用NLog。

using Microsoft.AspNetCore.Hosting;

using Microsoft.Extensions.Hosting;

using Microsoft.Extensions.Logging;

using NLog.Web;

using System;

namespace WebDemo

{

public class Program

{

public static void Main(string[] args)

{

var logger = NLog.Web.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();

})

.ConfigureLogging(logging =>

{

logging.ClearProviders();

logging.SetMinimumLevel(LogLevel.Trace);

}).UseNLog(); // NLog: Setup NLog for Dependency injection

}

}

一切准备就绪,在任意地方写日志。

using Microsoft.AspNetCore.Mvc;

using Microsoft.Extensions.Logging;

using System;

using System.Collections.Generic;

using System.Linq;

namespace WebDemo.Controllers

{

[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 _logger;

public WeatherForecastController(ILogger logger)

{

_logger = logger;

}

[HttpGet]

public IEnumerable Get()

{

_logger.LogInformation("Hello, this is a Weather api!");

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();

}

}

}

调用上面api,查看日志文件。

更多用法,请查看官方wiki文档:https://github.com/NLog/NLog/wiki

查看原文