ASP.NET Core使用NLog作为日志记录组件

引言

NLog 是一款基于 .NET 与 .NET Core 的日志记录神器,可以帮我们记录下应用程序每一个环节所做的详细记录,以及运行过程中所引发的异常、警告、错误等。 NLog 可以方便我们快速的引用整合到 .NET 与 .NET Core 的应用程序的平台中。可通过三种形式对其进行配置:
1、XML 配置
2、代码 进行配置
3、appsettings.json 进行配置

一、XML形式配置

1.1 NuGet包

1、NLog
2、NLog.Web.AspNetCore
3、MySql.Data

在这里插入图片描述在这里插入图片描述

1.2 根目录下直接创建nlog.config的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">

  <!--自定义变量-->
  <variable name="dir" value="${basedir}" />
  
  <!-- the targets to write to -->
  <targets>
    <!--控制台-->
    <target xsi:type="ColoredConsole" 
            name="colorconsole"
            layout="${level}:${logger}${newline}     ${message}${exception:format=tostring}"/>

    <!-- 全部日志 -->
    <target xsi:type="File" 
            name="nlog-allfile" 
            fileName="${dir}/logs/nlog-allfile-${shortdate}.log"
            layout="${longdate}:【${level}】【${machinename}】【${logger}】【${callsite}】【${message}${exception:tostring}】"/>
     
    <target xsi:type="File"
            name="webfile"
            fileName="${dir}/logs/nlog-webfile-${shortdate}.log"
            layout="${longdate}:【${level}】【${aspnet-request-ip}】【${machinename}】【${logger}】【${callsite}】【${aspnet-request-url}】【${message}${exception:tostring}】"/>
    
    <!-- 写入MySQL -->
    <target xsi:type="database"
            name="database"
            dbProvider="MySql.Data.MySqlClient.MySqlConnection,MySql.Data"
            connectionString="server=localhost;uid=root;password=123@456;database=db_api;charset=utf8">
      <commandText>
        INSERT INTO db_nlog(machinename,clientip,logged,level,message,logger,requesturl,callsite,exception) VALUES(@machinename,@clientip,@logged,@level,@message,@logger,@requesturl,@callsite,@exception)
      </commandText>
      <parameter name="@machinename" layout="${machinename}" />
      <parameter name="@clientip" layout="${aspnet-request-ip}" />
      <parameter name="@logged" layout="${longdate}" />
      <parameter name="@level" layout="${level}" />
      <parameter name="@message" layout="${message}" />
      <parameter name="@logger" layout="${logger}" />
      <parameter name="@requesturl" layout="${aspnet-request-url}" />
      <parameter name="@callsite" layout="${callsite}" />
      <parameter name="@exception" layout="${exception:tostring}" />
    </target>
  </targets>

  <!-- rules to map from logger name to target -->
  <rules>
    <!-- Microsoft.Hosting.Lifetime管道 -->
    <logger name="*" minlevel="Info" writeTo="colorconsole,webfile,database" />

    <!-- 写入全部日志 -->
    <logger name="*" minlevel="Trace" writeTo="allfile" />
  </rules>
</nlog>

1.3 在数据库中创建表

CREATE TABLE `db_nlog` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `machinename` VARCHAR(50) DEFAULT NULL,
  `clientip` VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `logged` DATETIME DEFAULT NULL,
  `level` VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `message` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci,
  `logger` VARCHAR(50) DEFAULT NULL,
  `requesturl` VARCHAR(255) DEFAULT NULL,
  `callsite` TEXT,
  `exception` TEXT,
  PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=979 DEFAULT CHARSET=utf8;

在这里插入图片描述

1.4 在Prgram.cs中配置NLog

在这里插入图片描述

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 =>
                {
    
    
                    //清除.NET Core默认配置
                    logging.ClearProviders();
                    logging.SetMinimumLevel(LogLevel.Trace);
                })
                .UseNLog();
    }

1.5 Web层调用

public class ValuesController : ControllerBase
    {
    
    
        private readonly ILogger _logger;

        public ValuesController(ILogger<ValuesController> logger
        {
    
    
            _logger = logger;
        }

        // GET: api/<ValuesController>
        [HttpGet]
        public IEnumerable<string> Get()
        {
    
    
            _logger.LogInformation("ILogger Web Info 这是");
            _logger.LogWarning("ILogger Web Warn 这是");
            _logger.LogError("ILogger Web Error 这是");
            _logger.LogCritical("ILogger Web Fatal 这是");;
                       
            return new string[]
            {
    
                
                "value1","value2"
            };
        }
    }

在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述

二、通过代码进行配置

2.1 创建一个辅助类,读取appsettings.json

代码配置需要使用数据库的连接字符串,直接写在代码中并不美观,也不符合要求,所以我们需要读取 appsettings.json 配置文件中的配置字符串 DBContext ,用于将日志记录存储到MySQL数据库中。
NuGet如下:
1、Microsoft.Extensions.Configuration
2、Microsoft.Extensions.Configuration.FileExtensions
3、Microsoft.Extensions.Configuration.Json
4、Microsoft.Extensions.Configuration.EnvironmentVariables

在这里插入图片描述

public class AppSettingsHelper
    {
    
    
        /// <summary>
        /// 读取配置文件,如:appsettings.json
        /// </summary>
        /// <returns></returns>
        private static IConfiguration configuration
        {
    
    
            get
            {
    
    
                var config = new ConfigurationBuilder()
                    .SetBasePath(Directory.GetCurrentDirectory())
                    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                    .AddInMemoryCollection()
                    .AddEnvironmentVariables()
                    .Build();
                return config;
            }
        }

        /// <summary>
        /// 获取Section,如:NLog,ConnectionStrings等
        /// </summary>
        /// <param name="key">key</param>
        /// <returns></returns>
        public static IConfigurationSection GetSection(string key)
        {
    
    
            return configuration.GetSection(key);
        }

        /// <summary>
        /// 获取Section的属性,如:NLog:LogLevel,NLog:Logging:Default等
        /// </summary>
        /// <param name="key">key</param>
        /// <returns></returns>
        public static string GetSectionString(string key)
        {
    
    
            return configuration.GetSection("key").Value;
        }

        /// <summary>
        /// 获取ConnectionString,如:DBContext
        /// </summary>
        /// <param name="key">key</param>
        /// <returns></returns>
        public static string GetConnectionString(string key)
        {
    
    
            return configuration.GetConnectionString(key);
        }
    }

2.2 appsettings.json配置

{
    
    
  "ConnectionStrings": {
    
    
    "DBContext": "server=localhost;uid=root;password=123@456;database=db_api;charset=utf8"
  },
  "Logging": {
    
    
    "LogLevel": {
    
    
      "Default": "Information"
    }
  }
  "AllowedHosts": "*"
}

2.3 使用代码对NLog进行配置

NuGet 包如下:
1、NLog
2、NLog.Extensions.Logging
3、MySql.Data

在这里插入图片描述在这里插入图片描述

public class NLogFromCodeHelper
    {
    
    
        /// <summary>
        /// 获取配置好的NLog
        /// </summary>
        private static ILogger _logger
        {
    
    
            get
            {
    
    
                LogManager.Configuration = configuration;
                return LogManager.GetCurrentClassLogger();
            }
        }     

        /// <summary>
        /// 配置NLog
        /// </summary>
        private static LoggingConfiguration configuration
        {
    
    
            get
            {
    
    
                //声明
                var config = new LoggingConfiguration();

                //文件
                var allfile = new FileTarget()
                {
    
    
                    Name = "allfile",
                    FileName = "${basedir}/logs/nlog-allfile-${shortdate}.log",
                    Layout = "${longdate}:【${level}】【${machinename}】【${logger}】【${callsite}】【${message}${exception:tostring}】"
                };

                var webfile = new FileTarget()
                {
    
    
                    Name = "webfile",
                    FileName = "${basedir}/logs/nlog-webfile-${shortdate}.log",
                    Layout = "${longdate}:【${level}】【${aspnet-request-ip}】【${machinename}】【${logger}】【${callsite}】【${aspnet-request-url}】【${message}${exception:tostring}】"
                };

                //控制台输出
                var colorConsole = new ColoredConsoleTarget()
                {
    
    
                    Name = "logconsole",
                    Layout = "${level}:${logger}${newline}     ${message}${exception:format=tostring}"
                };

                //数据库
                var db = new DatabaseTarget("db")
                {
    
    
                    DBProvider = "MySql.Data.MySqlClient.MySqlConnection,MySql.Data",
                    ConnectionString = AppSettingsHelper.GetConnectionString("DBContext"),
                    CommandText = "INSERT INTO db_nlog(machinename,clientip,logged,level,message,logger,requesturl,callsite,exception) VALUES(@machinename,@clientip,@logged,@level,@message,@logger,@requesturl,@callsite,@exception)",
                    Parameters =
                    {
    
    
                        new DatabaseParameterInfo("@machinename","${machinename}"),
                        new DatabaseParameterInfo("@clientip","${aspnet-request-ip}"),
                        new DatabaseParameterInfo("@logged","${longdate}"),
                        new DatabaseParameterInfo("@level","${level}"),
                        new DatabaseParameterInfo("@message","${message}"),
                        new DatabaseParameterInfo("@logger","${logger}"),
                        new DatabaseParameterInfo("@requesturl","${aspnet-request-url}"),
                        new DatabaseParameterInfo("@callsite","${callsite}"),
                        new DatabaseParameterInfo("@exception","${exception:tostring}")
                    }
                };

                //写入
                config.AddRule(LogLevel.Trace, LogLevel.Fatal, allfile);
                config.AddRule(LogLevel.Info, LogLevel.Fatal, webfile);
                config.AddRule(LogLevel.Info, LogLevel.Fatal, colorConsole);
                config.AddRule(LogLevel.Info, LogLevel.Fatal, db);

                return config;
            }
        }

        /// <summary>
        /// Trace:追踪时使用
        /// </summary>
        /// <param name="message">内容</param>
        /// <param name="args">可格式化参数</param>
        public static void LogTrace(string message, params object[] args)
        {
    
    
            _logger.Trace(message, args);
        }

        /// <summary>
        /// Debug:调试时使用
        /// </summary>
        /// <param name="message">内容</param>
        /// <param name="args">可格式化参数</param>
        public static void LogDebug(string message, params object[] args)
        {
    
    
            _logger.Debug(message, args);
        }

        /// <summary>
        /// Information:程序正常运行时使用
        /// </summary>
        /// <param name="message">内容</param>
        /// <param name="args">可格式化参数</param>
        public static void LogInformation(string message, params object[] args)
        {
    
    
            _logger.Info(message, args);
        }

        /// <summary>
        /// Warning:程序运行出现警告时使用
        /// </summary>
        /// <param name="message">内容</param>
        /// <param name="args">可格式化参数</param>
        public static void LogWarning(string message, params object[] args)
        {
    
    
            _logger.Warn(message, args);
        }

        /// <summary>
        /// Warning:程序运行出现警告时使用
        /// </summary>
        /// <param name="e">exception</param>
        /// <param name="message">内容</param>
        /// <param name="args">可格式化参数</param>
        public static void LogWarning(Exception e,string message, params object[] args)
        {
    
    
            _logger.Warn(e,message, args);
        }

        /// <summary>
        /// Error:程序运行出现错误时使用
        /// </summary>
        /// <param name="message">内容</param>
        /// <param name="args">可格式化参数</param>
        public static void LogError(string message, params object[] args)
        {
    
    
            _logger.Error(message, args);
        }

        /// <summary>
        /// Error:程序运行出现错误时使用
        /// </summary>
        /// <param name="e">exception</param>
        /// <param name="message">内容</param>
        /// <param name="args">可格式化参数</param>
        public static void LogError(Exception e, string message, params object[] args)
        {
    
    
            _logger.Error(e, message, args);
        }

        /// <summary>
        /// Critical(级别最高):程序运行出现严重警告或错误时使用
        /// </summary>
        /// <param name="message">内容</param>
        /// <param name="args">可格式化参数</param>
        public static void LogCritical(string message, params object[] args)
        {
    
    
            _logger.Fatal(message, args);
        }

        /// <summary>
        /// Critical(级别最高):程序运行出现严重警告或错误时使用
        /// </summary>
        /// <param name="e">exception</param>
        /// <param name="message">内容</param>
        /// <param name="args">可格式化参数</param>
        public static void LogCritical(Exception e, string message, params object[] args)
        {
    
    
            _logger.Fatal(e, message, args);
        }
    }

2.4 Web层调用

public class ValuesController : ControllerBase
    {
    
    
        private readonly ILogger _logger;

        public ValuesController(ILogger<ValuesController> logger
        {
    
    
            _logger = logger;
        }

        // GET: api/<ValuesController>
        [HttpGet]
        public IEnumerable<string> Get()
        {
    
    
            NLogFromCodeHelper.LogInformation("ILogger NLogFromCodeHelper Info 这是");
            NLogFromCodeHelper.LogWarning("ILogger NLogFromCodeHelper Warn 这是");
            NLogFromCodeHelper.LogError("ILogger NLogFromCodeHelper Error 这是");
            NLogFromCodeHelper.LogCritical("ILogger NLogFromCodeHelper 
                       
            return new string[]
            {
    
                
                "value1","value2"
            };
        }
    }

在这里插入图片描述

三、appsettings.json进行配置

3.1 appsettings.json配置

{
    
    
  "ConnectionStrings": {
    
    
    "DBContext": "server=localhost;uid=root;password=123@456;database=db_api;charset=utf8"
  },
  "Logging": {
    
    
    "LogLevel": {
    
    
      "Default": "Information"
    }
  },
  "NLog": {
    
    
    "autoReload": true,
    "throwConfigExceptions": true,
    "variables": {
    
    
      "dir":"${basedir}" 
    },
    "targets": {
    
    
      "colorconsole": {
    
    
        "type": "ColoredConsole",
        "layout": "${level}:${logger}${newline}      ${message}${exception:format=tostring}"
      },
      "allfile": {
    
    
        "type": "File",
        "fileName": "${dir}/logs/nlog-allfile-${shortdate}.json",
        "layout": {
    
    
          "type": "JsonLayout",
          "Attributes": [
            {
    
    
              "name": "logged",
              "layout": "${longdate}"
            },
            {
    
    
              "name": "level",
              "layout": "${level}"
            },
            {
    
    
              "name": "machinename",
              "layout": "${machinename}"
            },
            {
    
    
              "name": "message",
              "layout": "${message}"
            },
            {
    
    
              "name": "logger",
              "layout": "${logger}"
            },
            {
    
    
              "name": "callsite",
              "layout": "${callsite}"
            },
            {
    
    
              "name": "exception",
              "layout": "${exception:tostring}"
            }
          ]
        }
      },
      "webfile": {
    
    
        "type": "File",
        "fileName": "${dir}/logs/nlog-webfile-${shortdate}.json",
        "layout": {
    
    
          "type": "JsonLayout",
          "Attributes": [
            {
    
    
              "name": "logged",
              "layout": "${longdate}"
            },
            {
    
    
              "name": "level",
              "layout": "${level}"
            },
            {
    
    
              "name": "machinename",
              "layout": "${machinename}"
            },
            {
    
    
              "name": "clientip",
              "layout": "${aspnet-request-ip}"
            },
            {
    
    
              "name": "message",
              "layout": "${message}"
            },
            {
    
    
              "name": "logger",
              "layout": "${logger}"
            },
            {
    
    
              "name": "callsite",
              "layout": "${callsite}"
            },
            {
    
    
              "name": "requesturl",
              "layout": "${aspnet-request-url}"
            },
            {
    
    
              "name": "@exception",
              "layout": "${exception:tostring}"
            }
          ]
        }
      },
      "database": {
    
    
        "type": "Database",
        "dbProvider": "MySql.Data.MySqlClient.MySqlConnection,MySql.Data",
        "connectionString": "server=localhost;uid=root;password=123@456;database=db_api;charset=utf8",
        "commandText": "INSERT INTO db_nlog(machinename,clientip,logged,level,message,logger,requesturl,callsite,exception) VALUES(@machinename,@clientip,@logged,@level,@message,@logger,@requesturl,@callsite,@exception)",
        "parameters": [
          {
    
    
            "name": "@machinename",
            "layout": "${machinename}"
          },
          {
    
    
            "name": "@clientip",
            "layout": "${aspnet-request-ip}"
          },
          {
    
    
            "name": "@logged",
            "layout": "${longdate}"
          },
          {
    
    
            "name": "@level",
            "layout": "${level}"
          },
          {
    
    
            "name": "@message",
            "layout": "${message}"
          },
          {
    
    
            "name": "@logger",
            "layout": "${logger}"
          },
          {
    
    
            "name": "@requesturl",
            "layout": "${aspnet-request-url}"
          },
          {
    
    
            "name": "@callsite",
            "layout": "${callsite}"
          },
          {
    
    
            "name": "@exception",
            "layout": "${exception:tostring}"
          }
        ]
      }
    },
    "rules": [
      {
    
    
        "logger": "*",
        "minLevel": "Info",
        "writeTo": "colorconsole,database,webfile"
      },
      {
    
    
        "logger": "*",
        "minLevel": "Trace",
        "writeTo": "allfile"
      }
    ]
  },
  "AllowedHosts": "*"
}

3.2 NLog使用appsettings.json的配置

public class NLogFromJsonHelper
    {
    
    
        /// <summary>
        /// 读取NLog的配置文件
        /// </summary>
        private static ILogger _logger
        {
    
    
            get
            {
    
    
                LogManager.Configuration = new NLogLoggingConfiguration(AppSettingsHelper.GetSection("NLog"));
                var logger = LogManager.Setup().GetCurrentClassLogger();
                return logger;
            }
        }

        /// <summary>
        /// Trace:追踪时使用
        /// </summary>
        /// <param name="message">内容</param>
        /// <param name="args">可格式化参数</param>
        public static void LogTrace(string message, params object[] args)
        {
    
    
            _logger.Trace(message, args);
        }

        /// <summary>
        /// Debug:调试时使用
        /// </summary>
        /// <param name="message">内容</param>
        /// <param name="args">可格式化参数</param>
        public static void LogDebug(string message, params object[] args)
        {
    
    
            _logger.Debug(message, args);
        }

        /// <summary>
        /// Information:程序正常运行时使用
        /// </summary>
        /// <param name="message">内容</param>
        /// <param name="args">可格式化参数</param>
        public static void LogInformation(string message, params object[] args)
        {
    
    
            _logger.Info(message, args);
        }

        /// <summary>
        /// Warning:程序运行出现警告时使用
        /// </summary>
        /// <param name="message">内容</param>
        /// <param name="args">可格式化参数</param>
        public static void LogWarning(string message, params object[] args)
        {
    
    
            _logger.Warn(message, args);
        }

        /// <summary>
        /// Warning:程序运行出现警告时使用
        /// </summary>
        /// <param name="e">exception</param>
        /// <param name="message">内容</param>
        /// <param name="args">可格式化参数</param>
        public static void LogWarning(Exception e, string message, params object[] args)
        {
    
    
            _logger.Warn(e, message, args);
        }

        /// <summary>
        /// Error:程序运行出现错误时使用
        /// </summary>
        /// <param name="message">内容</param>
        /// <param name="args">可格式化参数</param>
        public static void LogError(string message, params object[] args)
        {
    
    
            _logger.Error(message, args);
        }

        /// <summary>
        /// Error:程序运行出现错误时使用
        /// </summary>
        /// <param name="e">exception</param>
        /// <param name="message">内容</param>
        /// <param name="args">可格式化参数</param>
        public static void LogError(Exception e, string message, params object[] args)
        {
    
    
            _logger.Error(e, message, args);
        }

        /// <summary>
        /// Critical(级别最高):程序运行出现严重警告或错误时使用
        /// </summary>
        /// <param name="message">内容</param>
        /// <param name="args">可格式化参数</param>
        public static void LogCritical(string message, params object[] args)
        {
    
    
            _logger.Fatal(message, args);
        }

        /// <summary>
        /// Critical(级别最高):程序运行出现严重警告或错误时使用
        /// </summary>
        /// <param name="e">exception</param>
        /// <param name="message">内容</param>
        /// <param name="args">可格式化参数</param>
        public static void LogCritical(Exception e, string message, params object[] args)
        {
    
    
            _logger.Fatal(e, message, args);
        }
    }

3.4 Web层调用

public class ValuesController : ControllerBase
    {
    
    
        private readonly ILogger _logger;

        public ValuesController(ILogger<ValuesController> logger
        {
    
    
            _logger = logger;
        }

        // GET: api/<ValuesController>
        [HttpGet]
        public IEnumerable<string> Get()
        {
    
    
            NLogFromJsonHelper.LogInformation("ILogger NLogFromJsonHelper Info 这是");
            NLogFromJsonHelper.LogWarning("ILogger NLogFromJsonHelper Warn 这是");
            NLogFromJsonHelper.LogError("ILogger NLogFromJsonHelper Error 这是");
            NLogFromJsonHelper.LogCritical("ILogger NLogFromJsonHelper Fatal 这是");
                       
            return new string[]
            {
    
                
                "value1","value2"
            };
        }
    }

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42799562/article/details/115410820