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