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站点名称 |