ASP.NET Core -NLog
1.安装NuGet包
2.准备Nlog的配置文件 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" throwExceptions="false" internalLogLevel="Info" internalLogFile="internal-nlog.txt"> <!-- 定义日志输出目标 --> <targets> <target name="FileError" xsi:type="File" fileName="${basedir}/Logs/Error/${var:logfilename}_Error.txt" layout="${longdate} ${level:uppercase=true} ${message} ${exception}" archiveEvery="Day" archiveAboveSize="10240" maxArchiveFiles="20" archiveNumbering="Date" archiveDateFormat="yyyy-MM-ddTHH" archiveFileName="${basedir}/Logs/Error/${var:logfilename}_Error.{#}.txt" /> <target name="FileWarn" xsi:type="File" fileName="${basedir}/Logs/Warn/${var:logfilename}_Warn.txt" layout="${longdate} ${message}" archiveEvery="Day" archiveAboveSize="10240" maxArchiveFiles="20" archiveNumbering="Date" archiveDateFormat="yyyy-MM-ddTHH" archiveFileName="${basedir}/Logs/Warn/${var:logfilename}_Warn.{#}.txt" /> <target name="FileInfo" xsi:type="File" fileName="${basedir}/Logs/Info/${var:logfilename}_Info.txt" layout="${longdate} ${message}" archiveEvery="Day" archiveAboveSize="10240" maxArchiveFiles="20" archiveNumbering="Date" archiveDateFormat="yyyy-MM-ddTHH" archiveFileName="${basedir}/Logs/Info/${var:logfilename}_Info.{#}.txt" /> <target name="FileDebug" xsi:type="File" fileName="${basedir}/Logs/Debug/${var:logfilename}_Debug.txt" layout="${longdate} ${message}" archiveEvery="Day" archiveAboveSize="10240" maxArchiveFiles="20" archiveNumbering="Date" archiveDateFormat="yyyy-MM-ddTHH" archiveFileName="${basedir}/Logs/Debug/${var:logfilename}_Debug.{#}.txt"/> </targets> <!-- 定义日志规则 --> <rules> <logger name="*" minlevel="Error" maxlevel="Fatal" writeTo="FileError" /> <logger name="*" level="Warn" writeTo="FileWarn" /> <logger name="*" level="Info" writeTo="FileInfo" /> <logger name="*" level="Debug" writeTo="FileDebug" /> </rules> </nlog>
Targets 配置项
用于定义日志输出文件的格式、输出位置等方面内容
-
maxArchiveFiles:允许生成的副本文件最大数量
-
archiveAboveSize:允许单个文件得最大容量 (如设置为10240则为10kb,超出大小就按存档命名规则自动存档)
-
archiveEvery:指示是否在每次指定时间过后自动存档日志文件(如:值为Day表示按天存档日志文件)
-
archiveNumbering:用于定义归档日志文件的编号方式(如:值为Date表示按日期编号文件,日期格式可设置archiveDateFormat)
-
archiveDateFormat:指定归档日志文件的日期格式通常用于archiveNumbering、archiveEvery
-
name:输出目标的名称,用于rules中路由规则writeTo指定
-
fileName:包含完整的生成文件的路径和文件名
-
layout:用来规定输出内容格式,语法“${属性}”,可以把上下文信息插入到日志中
Rules
用于定义不同日志等级,且输出与target 中定义的哪个文件格式下
-
name:匹配记录器对象的记录器名称 - 可能包含通配符(* 和 ?)
-
minlevel:日志记录最低等级
-
maxlevel:日志记录最大等级
-
level:单级日志记录
-
levels:以逗号分隔的要记录的级别列表
-
writeTo:日志输出,以逗号分隔的要写入的目标列表,与target的name对应
-
enabled:设置为False禁用规则,默认为True
3.添加注入NLog服务的扩展
private static string LogPath { get { return Path.Combine(AppContext.BaseDirectory, "nlog.config"); } } public static ILoggingBuilder AddNLog(this ILoggingBuilder log,string? filename=null) { //删除其他的日志记录提供程序 log.ClearProviders(); #region 手动加载配置方式 //显示加载NLog配置 LogManager.Configuration.LogFactory.Setup().LoadConfigurationFromFile(LogPath);
//设置配置变量值,对应配置文件中archiveFileName属性中的变量logfilename LogManager.Configuration.Variables["logfilename"] = filename; //启用NLog作为日志记录的提供程序 log.AddNLogWeb(LogManager.Configuration); #endregion #region 自动加载配置 //log.AddNLogWeb(); #endregion return log; }
注:
1.启动时,NLog 会自动在各种文件中搜索其配置,如下所述。它加载找到的第一个 nlog 配置。当找到第一个 nlog 配置时,搜索结束。如果未找到配置,NLog 将不会执行任何日志记录。以上的方式可以去掉手动加载配置
2.Variables 可定义变量值用于配置文件
4.Program.cs注入NLog服务
//日志 builder.Logging.AddNLog();
5.使用
[ApiController] [Route("[controller]")] public class UserController(ILogger<UserController> logger) : ControllerBase { [HttpGet("GetUserExit")] public void GetUserExit(string account) { logger.LogInformation("调用方法->GetUserExit"); } }
针对无法使用构造函数依赖注入使用日志的,建立如下Helper
public class LogHelper { private static string logPath { get { return Path.Combine(AppContext.BaseDirectory, "nlog.config"); } } private static ISetupBuilder _factory = LogManager.Configuration.LogFactory.Setup().LoadConfigurationFromFile(logPath); private static Logger _logger = null; /// <summary> /// 日志操作对象 /// </summary> public static Logger Log { get { if (_logger == null) _logger = _factory.LogFactory.GetCurrentClassLogger(); return _logger; } } }
如在Program中调用