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"
};
}
}