.NET 6 配置使用NLog日志框架的方法及示例代码

NLog是一个流行的开源日志记录框架,用于在.NET应用程序中记录日志。它提供了强大的日志记录功能,具有灵活的配置选项和多种目标,可将日志记录到不同的输出位置,例如文件、数据库、控制台等。本文主要介绍.NET 6 中配置使用NLog,以及相关示例代码。

1、安装引用NLog

使用NLog需要安装引用NLog.Extensions.Hosting,如配置文件使用类似 ${aspnet-request-url} 的配置,以aspnet-开头的则需要安装 NLog.Web.AspNetCore。

1)NLog.Extensions.Hosting

在Nuget管理程序中,搜索 "NLog.Extensions.Logging",然后点击安装。

2)NLog.Web.AspNetCore

在Nuget管理程序中,搜索 "NLog.Web.AspNetCore",然后点击安装。

相关文档VS(Visual Studio)中Nuget的使用

2、NLog 配置文件

NLog 中配置文件可以使用XML和JSONSON格式的, 具体如下,

1)XML格式的配置

<?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="${currentdir}/Logs/error.txt" >

  <!-- enable asp.net core layout renderers -->
  <extensions>
    <add assembly="NLog.Web.AspNetCore"/>
  </extensions>
  <!-- the targets to write to -->
  <targets>
    <!-- File Target for all log messages with basic details -->
    <target xsi:type="File" name="allfile" fileName="${currentdir}/Logs/${shortdate}/${level}/${level}.txt" maxArchiveFiles="30"  enableArchiveFileCompression="true"
          concurrentWrites="true"
          keepFileOpen="true"
            layout="${longdate}|${event-properties:item=EventId:whenEmpty=0}|${level:uppercase=true}|${logger}|${message} ${exception:format=tostring}" />

    <!-- File Target for own log messages with extra web details using some ASP.NET core renderers -->
    <target xsi:type="File" name="ownFile-web" fileName="${currentdir}/Logs/${shortdate}/${level}/web.txt" maxArchiveFiles="30"
            layout="${longdate}|${event-properties:item=EventId:whenEmpty=0}|${level:uppercase=true}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" />

    <!--Console Target for hosting lifetime messages to improve Docker / Visual Studio startup detection -->
    <target xsi:type="Console" name="lifetimeConsole" layout="${MicrosoftConsoleLayout}" />

  </targets>

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

    <!--Output hosting lifetime messages to console target for faster startup detection -->
    <logger name="Microsoft.Hosting.Lifetime" minlevel="Info" writeTo="lifetimeConsole, ownFile-web" final="true" />

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

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

2)JSON配置文件

"NLog":{
    "internalLogLevel":"Info",
    "internalLogFile":"${currentdir}/Logs/error.log",
    "extensions": [
      { "assembly": "NLog.Extensions.Logging" },
      { "assembly": "NLog.Web.AspNetCore" }
    ],
    "targets":{
        "allfile":{
            "type":"File",
            "fileName":"${currentdir}/Logs/${shortdate}/${level}/${level}.log",
            "layout":"${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}"
        },
        "ownFile-web":{
            "type":"File",
            "fileName":"${currentdir}/Logs/${shortdate}/${level}/${level}.log",
            "layout":"${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}"
        }
    },
    "rules":[
        {
            "logger":"*",
            "minLevel":"Trace",
            "writeTo":"allfile"
        },
        {
            "logger":"Microsoft.*",
            "maxLevel":"Info",
            "final":"true"
        },
        {
            "logger":"*",
            "minLevel":"Trace",
            "writeTo":"ownFile-web"
        }
    ]
}

3、NLog配置及使用示例

下面是NLog的两种配置方式的使用,如下,

1)使用NLog.config配置使用

using Microsoft.OpenApi.Models;

using NLog.Web;

var builder = WebApplication.CreateBuilder(args);

// 配置NLog
builder.Logging.ClearProviders();
builder.Host.UseNLog();
builder.Services.AddControllers();


app.UseDefaultFiles();
app.UseStaticFiles();
app.MapControllers();

app.Run();

使用示例:

using Microsoft.AspNetCore.Mvc;
using UtilityWeb.API.Services;
using UtilityWeb.Core;

using UtilityWeb.Tools;

namespace UtilityWeb.API.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<WeatherForecastController> _logger;


        public WeatherForecastController(ILogger<WeatherForecastController> logger)
        {
            _logger = logger;
        }

        [HttpGet(Name = "GetWeatherForecast")]
        public IEnumerable<string> Get([FromServices] UtilityWebContext context,
            [FromServices] IUser userService,
            [FromServices] SwaggerService swaggerService)
        {
            _logger.LogError("error message");
            return new List<string>() { _logger.ToString() };
            
        }
    }
}

2)使用appsettings.json配置使用

public static void Main(string[] args)
{
    var config = new ConfigurationBuilder()
        .SetBasePath(System.IO.Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true).Build();
    LogManager.Configuration = new NLogLoggingConfiguration(config.GetSection("NLog"));

    var logger = NLog.Web.NLogBuilder.ConfigureNLog(LogManager.Configuration).GetCurrentClassLogger();
    try
    {
        logger.Debug("Init main");
        CreateWebHostBuilder(args).Build().Run();
    }
    catch (Exception ex)
    {
        logger.Error(ex, "Stopped program because of exception");
    }
    finally {
        LogManager.Shutdown();
    }
}

4、NLog配置文件中布局渲染器(layout renderers)

布局渲染器(layout renderers)是一种机制,用于在日志消息中插入动态内容或格式化信息。它们允许您将变量、属性、日期时间信息等添加到日志消息中,以便更详细地记录和分析日志。布局渲染器是在${}中包含的占位符,会在运行时替换为实际值。

1)所有的布局参数

变量名

描述

${cached}

将缓存应用于另一个布局输出。

${db-null}

为数据库呈现 DbNull。

${exception}

通过调用记录器方法之一提供的异常信息。

${level}

日志级别(例如错误、调试)或级别序号(数字)。

${literal}

字符串 literal。(文本) - 用于转义括号。

${logger}

记录器名称。GetLogger,GetCurrentClassLogger 等。

${message}

(格式化的)日志消息。

${newline}

换行符文字。

${object-path}

呈现对象的(嵌套)属性。

${onexception}

仅在为日志消息定义了异常时才输出内部布局。

${onhasproperties}

仅当事件属性包含在日志事件中时才输出内部布局。

${var}

渲染变量

2)调用站点和堆栈跟踪

变量名

描述

${callsite}

调用站点(类名、方法名和源信息)。

${callsite-filename}

调用站点源文件名。

${callsite-linenumber}

呼叫站点源行编号。

${stacktrace}

呈现堆栈跟踪。

3)条件

变量名

描述

${when}

仅在满足指定条件时输出内部布局。

${whenempty}

当内部布局生成空结果时输出备用布局。

4)上下文信息

变量名

描述

${activity}

从 System.Diagnostics.Activity.Current NLog.DiagnosticSource External 捕获跟踪上下文。

${activityid}

将 System.Diagnostics 跟踪关联 ID 放入日志中。

${all-event-properties}

记录所有事件上下文数据。

${event-context}

记录事件属性数据 - 替换为 ${事件属性}。

${event-properties}

记录事件属性数据 - 重命名 ${事件-上下文}。

${gdc}

全局诊断上下文项。用于保存每个应用程序实例值的字典结构。

${install-context}

安装参数(传递给 InstallNLogConfig)。

${mdc}

映射的诊断上下文 - 线程本地结构。

${mdlc}

异步映射诊断上下文 - 作用域内上下文的线程本地结构。MDC 的异步版本。

${ndc}

嵌套诊断上下文 - 线程本地结构。

${ndlc}

异步嵌套诊断上下文 - 线程本地结构。

5)计数器

变量名

描述

${counter}

计数器值(在每次布局呈现时增加)。

${guid}

全局唯一标识符(GUID)。

${sequenceid}

日志序列 ID。

6)日期和时间

变量名

描述

${date}

当前日期和时间。

${longdate}

日期和时间采用长而可排序的格式"yyyy-MM-dd HH:mm:ss.ffff"。

${qpc}

高精度计时器,基于从 QueryPerformanceCounter 返回的值。

${shortdate}

可排序格式为 yyyy-MM-dd 的短日期。

${ticks}

当前日期和时间的分笔报价值。

${time}

24 小时可排序格式的时间 HH:mm:ss.mmm。

7)编码和字符串转换

变量名

描述

${json-encode}

使用 JSON 规则转义另一个布局的输出。

${left}

文本的剩余部分。

${lowercase}

将另一个布局输出的结果转换为小写。

${norawvalue}

防止将另一个布局呈现器的输出视为原始值。

${pad}

将填充应用于另一个布局输出。

${replace}

将另一个布局输出中的字符串替换为另一个字符串。使用正则表达式可选。

${replace-newlines}

将换行符替换为另一个字符串。

${right}

文本的右侧部分。

${rot13}

使用 ROT-13 解码"加密"的文本。

${substring}

文本的子字符串。

${trim-whitespace}

从另一个布局呈现器的结果中修剪空格。

${uppercase}

将另一个布局输出的结果转换为大写。

${url-encode}

对另一个布局输出的结果进行编码,以便与 URL 一起使用。

${wrapline}

以指定的行长度换行另一个布局输出的结果。

${xml-encode}

将另一个布局输出的结果转换为符合 XML 标准。

8)环境和配置文件

变量名

描述

${appsetting}

来自 .config 文件 NLog.Extended 的应用程序配置设置。

${configsetting}

来自 appsettings.json 的值或

ASP.NET Core & .NET Core

${environment}

环境变量(例如 PATH、OSVersion)。

${environment-user}

用户标识信息(用户名)。

${registry}

来自 Windows 注册表的值。

9)文件和目录

变量名

描述

${basedir}

当前应用程序域的基目录。

${currentdir}

应用程序的当前工作目录。

${dir-separator}

操作系统相关的目录分隔符。

${file-contents}

呈现指定文件的内容。

${filesystem-normalize}

通过将文件名中不允许使用的字符替换为安全字符来筛选它们。

${nlogdir}

NLog.dll所在的目录。

${processdir}

应用程序的可执行进程目录。

${specialfolder}

系统特殊文件夹路径(包括"我的文档"、"我的音乐"、"程序文件"、"桌面"等)。

${tempdir}

一个临时目录。

10)进程、线程和程序集

变量名

描述

${appdomain}

当前应用域。

${assembly-version}

默认应用程序域中可执行文件的版本。

${gc}

有关垃圾回收器的信息。

${hostname}

运行进程的计算机的主机名。

${local-ip}

来自网络接口的本地 IP 地址。

${machinename}

运行进程的计算机名称。

${performancecounter}

性能计数器。

${processid}

当前进程的标识符。

${processinfo}

有关正在运行的进程的信息,例如 StartTime、PagedMemorySize。

${processname}

当前进程的名称。

${processtime}

格式为 HH:mm:ss.mmm 的处理时间。

${threadid}

当前线程的标识符。

${threadname}

当前线程的名称。

11)ASP.NET 和 ASP.NET Core

变量名

描述

${aspnet-appbasepath}

ASP.NET应用程序基本路径(Content Root)

${aspnet-application}

ASP.NET应用程序变量

${aspnet-environment}

ASP.NET环境名称

${aspnet-item}

ASP.NET

'HttpContext' 项变量

${aspnet-mvc-action}

从路由参数获取的ASP.NET

MVC动作名称

${aspnet-mvc-controller}

从路由参数获取的ASP.NET

MVC控制器名称

${aspnet-request}

ASP.NET请求变量

${aspnet-request-contenttype}

ASP.NET

Content-Type头部(例如:application/json)

${aspnet-request-cookie}

ASP.NET请求cookie内容

${aspnet-request-form}

ASP.NET请求表单内容

${aspnet-request-headers}

ASP.NET请求头部键/值对

${aspnet-request-host}

ASP.NET请求主机

${aspnet-request-ip}

客户端IP

${aspnet-request-method}

ASP.NET请求方法(GET,POST等)

${aspnet-request-posted-body}

ASP.NET请求的提交主体/负载

${aspnet-request-querystring}

ASP.NET请求查询字符串

${aspnet-request-referrer}

ASP.NET请求引用者

${aspnet-request-routeparameters}

ASP.NET请求路由参数

${aspnet-request-url}

ASP.NET请求URL

${aspnet-request-useragent}

ASP.NET请求用户代理

${aspnet-response-statuscode}

ASP.NET响应状态码内容

${aspnet-session}

ASP.NET会话变量

${aspnet-sessionid}

ASP.NET会话ID变量

${aspnet-traceidentifier}

ASP.NET跟踪标识符

${aspnet-user-authtype}

ASP.NET用户身份验证类型

${aspnet-user-claim}

ASP.NET用户声明授权值

${aspnet-user-identity}

ASP.NET用户变量

${aspnet-user-isauthenticated}

ASP.NET用户是否已验证

${aspnet-webrootpath}

ASP.NET

Web根路径(wwwroot)

${iis-site-name}

IIS站点名称

推荐阅读
cjavapy编程之路首页