【转】NetCore使用Nlog记录日志
原文地址:https://www.cnblogs.com/wtujvk/p/13222233.html
(说明:博主编写Demo自学项目,部分图片来源于自己Demo过程的截图)
当前环境: win10+vs2019+netcore3.1
添加Nuget包引用:NLog.Web.AspNetCore
1:新建ASP.NET Core Web应用程序,选择了带模型视图控制器的:

添加Nuget包引用:NLog.Web.AspNetCore

2. 添加 nlog.config配置文件 或者安装包 nlog.config

文件内容:
<?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="logs\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="logs\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="*" minlevel="Trace" writeTo="ownFile-web" /> </rules> </nlog>
autoReload自动再配置(Automatic reconfiguration)
一旦启动程序,这时候NLog.config文件被读取后,知道程序再启动都不会再读取配置文件了。假如我们不想停掉程序,比如说服务器哪能说停就停哈。这就用上这个配置了,这个配置功能是,一旦你对配置文件修改,程序将会重新读取配置文件,也就是自动再配置。
日志排错(Troubleshooting logging)
<nlog throwExceptions="true" /> <nlog internalLogFile=" c:\log\nlog.txt " />- 设置internalLogFile属性可以让NLog把内部的调试和异常信息都写入指定文件里。 <nlog internalLogLevel="Trace|Debug|Info|Warn|Error|Fatal" /> - 决定内部日志的级别,级别越高,输出的日志信息越简洁。internalLogLevel="Off" 关闭 <nlog internalLogToConsole="false|true" /> - 是否把内部日志输出到标准控制台。 <nlog internalLogToConsoleError="false|true" /> - 是否把内部日志输出到标准错误控制台 (stderr)。
设置throwExceptions属性为“true”可以让NLog不再阻挡这类异常,而是把它们抛给调用者。在部署是这样做可以帮我们快速定位问题。一旦应用程序已经正确配置了,我们建议把throwExceptions的值设为“false”,这样由于日志引发的问题不至于导致应用程序的崩溃。
实战配置:
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true" internalLogLevel="Off" throwExceptions="false">
如果nlog.config在其他位置配置,要设置始终复制或者有新的复制
其他补充:csv配置
<?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"
throwExceptions="false" internalLogLevel="Off" internalLogFile="NlogRecords.log"> <!--Nlog内部日志记录为Off关闭。除非纠错,不可以设为Trace否则速度很慢,起码Debug以上--> <extensions> <add assembly="NLog.Web.AspNetCore" /> </extensions> <targets> <!--通过数据库记录日志 配置 dbProvider请选择mysql或是sqlserver,同时注意连接字符串,需要安装对应的sql数据提供程序 MYSQL: dbProvider="MySql.Data.MySqlClient.MySqlConnection, MySql.Data" connectionString="server=localhost;database=BaseMIS;user=root;password=123456" MSSQL: dbProvider="Microsoft.Data.SqlClient.SqlConnection, Microsoft.Data.SqlClient" connectionString="Server=127.0.0.1;Database=BaseMIS;User ID=sa;Password=123456" --> <target name="log_database" xsi:type="Database" dbProvider="Microsoft.Data.SqlClient.SqlConnection, Microsoft.Data.SqlClient"
connectionString="Server=127.0.0.1;uid=sa;Pwd=pwd;Database=dbname;MultipleActiveResultSets=true;pooling=true;
min pool size=5;max pool size=32767;connect timeout=20;Encrypt=True;TrustServerCertificate=True;"> <commandText> INSERT INTO SysNLogRecords (LogDate,LogLevel,LogType,LogTitle,Logger,Message,MachineName,MachineIp,NetRequestMethod ,NetRequestUrl,NetUserIsauthenticated,NetUserAuthtype,NetUserIdentity,Exception) VALUES (@LogDate,@LogLevel,@LogType,@LogTitle,@Logger,@Message,@MachineName,@MachineIp,@NetRequestMethod ,@NetRequestUrl,@NetUserIsauthenticated,@NetUserAuthtype,@NetUserIdentity,@Exception); </commandText> <parameter name="@LogDate" layout="${date}" /> <parameter name="@LogLevel" layout="${level}" /> <parameter name="@LogType" layout="${event-properties:item=LogType}" /> <parameter name="@LogTitle" layout="${event-properties:item=LogTitle}" /> <parameter name="@Logger" layout="${logger}" /> <parameter name="@Message" layout="${message}" /> <parameter name="@MachineName" layout="${machinename}" /> <parameter name="@MachineIp" layout="${aspnet-request-ip}" /> <parameter name="@NetRequestMethod" layout="${aspnet-request-method}" /> <parameter name="@NetRequestUrl" layout="${aspnet-request-url}" /> <parameter name="@NetUserIsauthenticated" layout="${aspnet-user-isauthenticated}" /> <parameter name="@NetUserAuthtype" layout="${aspnet-user-authtype}" /> <parameter name="@NetUserIdentity" layout="${aspnet-user-identity}" /> <parameter name="@Exception" layout="${exception:tostring}" /> </target> <target xsi:type="File" name="log_file" fileName="${basedir}/App_Data/nlog/${date:format=yyyy-MM}/${level}-${shortdate}.csv" encoding="utf-8"> <layout xsi:type="CSVLayout"> <column name="date" layout="${date}" /> <column name="LogTitle" layout="${event-properties:item=LogTitle}" /> <column name="message" layout="${message}" /> <column name="exception" layout="${exception:format=tostring}" /> <column name="machinename" layout="${machinename}" /> <column name="appdomain" layout="${appdomain}" /> <column name="assembly-version" layout=" ${assembly-version}" /> <column name="basedir" layout="${basedir}" /> <column name="callsite" layout="${callsite}" /> <column name="counter" layout="${counter}" /> <column name="nlogdir" layout="${nlogdir}" /> <column name="processid" layout="${processid}" /> <column name="processname" layout="${processname}" /> <column name="specialfolder" layout="${specialfolder}" /> <column name="stacktrace" layout="${stacktrace}" /> <column name="longdate" layout="${longdate}" /> <column name="event-properties" layout="${event-properties:item=EventId_Id}" /> <column name="uppercase" layout="${uppercase:${level}}" /> <column name="logger" layout="${logger}" /> <column name="url" layout="${aspnet-request-url}" /> <column name="action" layout="${aspnet-mvc-action}" /> </layout> </target> </targets> <rules> <!--跳过所有级别的Microsoft组件的日志记录--> <logger name="Microsoft.*" final="true" /> <!-- BlackHole without writeTo --> <!--只通过数据库记录日志,如果给了name名字,cs里用日志记录的时候,取logger需要把name当做参数--> <logger name="logdb" writeTo="log_database" /> <logger name="logfile" writeTo="log_file" /> </rules> </nlog>
3. 在CreateHostBuilder 中添加使用Nlog ( ConfigureLogging)
using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using NLog.Web; namespace WebApplication2 { public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }) .ConfigureLogging( logging => { // 清除系统默认的日志 //logging.ClearProviders(); logging.SetMinimumLevel(LogLevel.Trace); }).UseNLog(); } }
4. 调用
using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using System.Diagnostics; using WebApplication2.Models; namespace WebApplication2.Controllers { public class HomeController : Controller { //创建好的项目自带的 private readonly ILogger<HomeController> _logger; public HomeController(ILogger<HomeController> logger) { //创建好的项目自带的 _logger = logger; //自己添加的部分 _logger.LogDebug(1, "NLog injected into HomeController"); } public IActionResult Index() { //自己添加的部分 _logger.LogInformation("Hello, this is the index!"); return View(); } } }
6. 效果
在bin\Debug\netcoreapp3.1 目录下生成了logs文件夹

配置信息处internalLogFile如果配置成(internalLogFile="internal-nlog-ttttt.txt")
生成的位置在项目的根目录


浙公网安备 33010602011771号