【转】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")

生成的位置在项目的根目录

 

posted @ 2021-04-17 14:21  花影疏帘  阅读(462)  评论(0)    收藏  举报