日志记录库
NLog是一个功能强大且易于使用的.NET日志记录库,适用于各种.NET平台,包括.NET Core。它提供了完善的跟踪调试代码功能,并且可以灵活配置其表现样式后发送到一个或多个输出目标中。
NLog的重点是高性能
、易于使用
、易于扩展
和灵活配置
。
1.设置存放日志数据库
CREATE DATABASE TestNlog
use TestNlog
CREATE table _Nlog(
MachineName VARCHAR(200),
Logged VARCHAR(200),
Level VARCHAR(200),
Message FULLTEXT,
Logger VARCHAR(200),
Callsite VARCHAR(200),
Exception VARCHAR(200)
)
2.添加NuGet包
NLog --.net 使用这个包
NLog.WebAspNetCore -- .net Core才使用这个包
-- 以下是将日志写入到数据库中需要的包
NLog.Database -- 不管什么数据库都需要
以下是根据所需数据库需要的包
数据库 | 所需要的包 | 数据库的dbProvider配置 | 数据库连接字符串 |
---|---|---|---|
sql server | Microsoft.Data.SqlClient | dbProvider=“Microsoft.Data.SqlClient.SqlConnection, Microsoft.Data.SqlClient” | connectionString=“Server=服务器 ;Database=数据库 ;User Id=用户名 ;Password=密码 ;” |
Mysql | MySql.Data | dbProvider=“MySql.Data.MySqlClient.MySqlConnection, MySql.Data” | connectionString=“server=服务器 ;userid=用户名 ;pwd=密码 ;port=3306 ;database=数据库 ;sslmode=none” |
oracle | Oracle.ManagedDataAccess.core | dbProvider=“Oracle.ManagedDataAccess.Client.OracleConnection, Oracle.ManagedDataAccess” | connectionString=“Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=服务器 )(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcl)));User Id=用户名 ;Password=密码 ;” |
3.新建Nlog.config
(自定义名.config)文件
项目 右键
-添加
-新建项
<!--直接全部粘贴复制-->
<?xml version="1.0" encoding="utf-8" ?>
<!-- autoReload属性,true时,如果NLog.config文件有变动,会自动应用新配置(但是会有延迟,过几秒才会应用起来)
internalLogLevel属性,设定后,输出的是NLog内部自己的日志记录,如果遇到NLog异常/配置文件没配好,可以把Off改为Trace或Debug来查看NlogRecords.log里的内容
internalLogFile属性,可以设定路径,例如默认的D:\Logs\aspNet.log
-->
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
autoReload="true"
throwExceptions="true"
internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">
<!-- internalLogFile 日志文件存放路径 -->
<!-- variable 声明变量 使用 "${myvar}" -->
<variable name="myvar" value="myvalue"/>
<!-- 存放日志目标 -->
<targets>
<!--
xsi:type="File":写入txt
fileName是写入文件的文件名并按日期添加后缀
layout属性是写入日志的格式
name是决定 logger标签的writeTo的值
-->
<!-- 控制台输出 -->
<!--<target name="console" xsi:type="Console" layout="${longdate}|${level}|${message}"/>-->
<!--输出到文件上-->
<!--<target name="f" xsi:type="File" fileName="${basedir}/logs/${shortdate}.log" layout="${longdate}|${level}|${message}" />-->
<!--通过数据库记录日志 配置
dbProvider请选择mysql或是sqlserver,同时注意连接字符串,需要安装对应的sql数据提供程序
-->
<!-- 连接 sql server数据库 connectionString 连接字符串 commandText执行添加的sql语句 -->
<target name="database" xsi:type="Database"
dbProvider="MySql.Data.MySqlClient.MySqlConnection, MySql.Data"
connectionString="server=127.0.0.1;userid=root;pwd=123456;port=3306;database=TestNlog;sslmode=none"
commandText="insert into _Nlog (MachineName, Logged, Level, Message,Logger, Callsite, Exception) values (@MachineName, @Logged, @Level, @Message,@Logger, @Callsite, @Exception);">
<parameter name="@MachineName" layout="${machinename}" />
<parameter name="@Logged" layout="${date}" />
<parameter name="@Level" layout="${level}" />
<parameter name="@Message" layout="${message}" />
<parameter name="@Logger" layout="${logger}" />
<parameter name="@Callsite" layout="${callsite}" />
<parameter name="@Exception" layout="${exception:tostring}" />
</target>
</targets>
<rules>
<!-- 第一个logger配置跳过所有Microsoft日志记录,final 属性是否为最后一个规则,如果为true,其后的规则即便被匹配也不会被运行。
第二个logger name="logdb",该日志记录器名为logdb,是适配log_database规则,即写入数据库,如果要适配多条规则,用逗号隔开 -->
<!--跳过所有级别的Microsoft组件的日志记录-->
<!--<logger name="Microsoft.*" final="true" />-->
<!-- BlackHole without writeTo -->
<!--只通过数据库记录日志,如果给了name名字,cs里用日志记录的时候,取logger需要把name当做参数 minlevel最低等级-->
<!--<logger name="*" minlevel="Info" writeTo="console"/>-->
<!--<logger name="*" minlevel="Info" writeTo="f"/>-->
<!--至少Info级别以上:写入数据库-->
<logger name="*" minlevel="Info" writeTo="database" />
</rules>
</nlog>
默认存储log文件的地址是
项目文件\bin\Debug\net6.0\logs
targets 标签 配置输出类型 链接数据库的配置
nlog输出类型详解
$ {cached} - 将缓存应用于另一个布局输出。
$ {db-null} - 为数据库渲染DbNull
$ {exception} - 通过调用Logger方法之一提供的异常信息
$ {level} - 日志级别(例如ERROR,DEBUG)或级别序数(数字)
$ {literal} - 字符串文字。(文本)-有用,以逃避括号
$ {logger} - 记录器名称。GetLogger,GetCurrentClassLogger等
$ {message} - (格式化的)日志消息。
$ {newline} - 换行文字。
$ {object-path} - 渲染对象的(嵌套)属性
$ {onexception} - 仅在为日志消息定义了异常时才输出内部布局。
$ {var} - 渲染变量
呼叫站点和堆栈跟踪-------------------------------------------------------------
$ {callsite} - 调用站点(类名,方法名和源信息)
$ {callsite-linenumber} - 呼叫站点源行号。
$ {stacktrace} - 渲染堆栈跟踪
条件------------------------------------------------------------------------
$ {when} - 仅在满足指定条件时输出内部布局。
$ {whenempty} - 当内部布局产生空结果时,输出替代布局。
上下文信息-------------------------------------------------------------------
$ {activityid} - 将System.Diagnostics跟踪关联ID记录到日志中。
$ {all-event-properties} - 记录所有事件上下文数据。
$ {event-context} - 记录事件属性数据-替换为$ {event-properties}
$ {event-properties} - 记录事件属性数据-重命名$ {event-context}
$ {gdc} - 全局诊断上下文项。包含每个应用程序实例值的字典结构。
$ {install-context} - 安装参数(传递给InstallNLogConfig)。
$ {mdc} - 映射诊断上下文-线程局部结构。
$ {mdlc} - 异步映射诊断上下文-线程局部结构。MDC的异步版本
$ {ndc} - 嵌套诊断上下文-线程局部结构。
$ {ndlc} - 异步嵌套诊断上下文-线程本地结构。
专柜-----------------------------------------------------------------------
$ {counter} - 一个计数器值(在每个布局渲染中增加)
$ {guid} - 全局唯一标识符(GUID)。
$ {sequenceid} - 日志序列号
日期和时间------------------------------------------------------------------
$ {date} - 当前日期和时间。
$ {longdate} - 日期和时间,采用可排序的长格式yyyy-MM-dd HH:mm:ss.ffff
。
$ {qpc} - 高精度计时器,基于QueryPerformanceCounter返回的值。
$ {shortdate} - 短日期,格式为yyyy-MM-dd。
$ {ticks} - 当前日期和时间的“ Ticks”值。
$ {时间} - 在24小时,可排序的格式HH的时间:MM:ss.mmm。
编码和字符串转换--------------------------------------------------------------
$ {json-encode} - 使用JSON规则转义另一个布局的输出。
$ {left} - 文字的左半部分
$ {小写} - 将另一个布局输出的结果转换为小写。
$ {norawvalue} - 防止将另一个布局渲染器的输出视为原始值
$ {pad} - 将填充应用于另一个布局输出。
$ {replace} - 将另一个布局的输出中的字符串替换为另一个字符串。正则表达式可选
$ {replace-newlines} - 用另一个字符串替换换行符。
$ {right} - 文字的右侧
$ {rot13} - 使用ROT-13解码“加密”的文本。
$ {substring} - 文本的子字符串
$ {trim-whitespace} - 从另一个布局渲染器的结果修剪空白。
$ {uppercase} - 将另一个布局输出的结果转换为大写。
$ {url-encode} - 编码另一个布局输出的结果,以供URL使用。
$ {wrapline} - 以指定的行长包装另一个布局输出的结果。
$ {xml-encode} - 将另一个布局输出的结果转换为XML兼容的。
环境和配置文件----------------------------------------------------------------
$ {appsetting} -. config文件 NLog.Extended中的应用程序配置设置
$ {configsetting} - 来自appsettings.json或ASP.NET Core和.NET Core中其他配置的值 NLog.Extensions.Logging NLog.Extensions.Hosting NLog.Web.AspNetCore
$ {environment} - 环境变量。(例如PATH,OSVersion)
$ {environment-user} - 用户身份信息(用户名)。
$ {}注册表 - 从Windows注册表中的值。
文件和目录--------------------------------------------------------------------
$ {basedir} - 当前应用程序域的基本目录。
$ {currentdir} - 应用程序的当前工作目录。
$ {file-contents} - 呈现指定文件的内容。
$ {filesystem-normalize} - 通过将文件名替换为安全字符来过滤文件名中不允许的字符。
$ {} nlogdir - 其中NLog.dll所在的目录。
$ {specialfolder} - 系统专用文件夹路径(包括“我的文档”,“我的音乐”,“程序文件”,“桌面”等)。
$ {tempdir} - 临时目录。
身分识别----------------------------------------------------------------------
$ {identity} - 线程身份信息(名称和身份验证信息)。
$ {windows-identity} - 线程Windows身份信息(用户名)
$ {windows-identity} - 线程Windows身份信息(用户名) Nlog.WindowsIdentity
整合方式----------------------------------------------------------------------
$ {gelf} - 将日志转换为GELF格式 NLog.GelfLayout 外部
$ {log4jxmlevent} - 与log4j,Chainsaw和NLogViewer兼容的XML事件描述。
进程,线程和程序集--------------------------------------------------------------
$ {appdomain} - 当前的应用程序域。
$ {assembly-version} - 默认应用程序域中可执行文件的版本。
$ {gc} - 有关垃圾收集器的信息。
$ {hostname} - 运行该进程的计算机的主机名。
$ {local-ip} - 来自网络接口的本地IP地址。
$ {machinename} - 运行进程的计算机名。
$ {performancecounter} - 性能计数器。
$ {processid} - 当前进程的标识符。
$ {processinfo} - 有关正在运行的进程的信息。例如StartTime,PagedMemorySize
$ {processname} - 当前进程的名称。
$ {processtime} - 格式为HH:mm:ss.mmm的处理时间。
$ {threadid} - 当前线程的标识符。
$ {threadname} - 当前线程的名称。
Silverlight------------------------------------------------------------------------
$ {document-uri} - 承载当前Silverlight应用程序的HTML页面的URI。
$ {sl-appinfo} - 有关Silverlight应用程序的信息。
Web,ASP.NET和ASP.NET Core----------------------------------------------------------
$ {ASPNET-appbasepath} - ASP.NET应用程序的基本路径(内容根) NLog.Web NLog.Web.AspNetCore
$ {ASPNET应用} - ASP.NET应用程序变量。 网络日志
$ {ASPNET环境} - ASP.NET环境名称 NLog.Web.AspNetCore
$ {ASPNET项} - ASP.NETHttpContext
项变量。 NLog.Web NLog.Web.AspNetCore
$ {ASPNET-MVC-行动} - ASP.NET MVC动作名称 NLog.Web NLog.Web.AspNetCore
$ {ASPNET-MVC控制器} - ASP.NET MVC控制器名称 NLog.Web NLog.Web.AspNetCore
$ {ASPNET请求} - ASP.NET请求变量。 NLog.Web NLog.Web.AspNetCore
$ {ASPNET-请求的contentType} - ASP.NET Content-Type头(实施例应用/ JSON) NLog.Web.AspNetCore
$ {ASPNET请求,饼干} - ASP.NET请求的cookie的内容。 NLog.Web NLog.Web.AspNetCore
$ {ASPNET请求形式} - ASP.NET请求表的内容。 NLog.Web NLog.Web.AspNetCore
$ {ASPNET请求报头} - ASP.NET部首键/值对。 NLog.Web NLog.Web.AspNetCore
$ {ASPNET请求主机} - ASP.NET请求主机。 NLog.Web NLog.Web.AspNetCore
$ {aspnet-request-ip} - 客户端IP。 NLog.Web NLog.Web.AspNetCore
$ {ASPNET请求-方法} - ASP.NET请求方法(GET,POST等)。 NLog.Web NLog.Web.AspNetCore
$ {ASPNET请求,贴体} - ASP.NET贴体/净荷 NLog.Web NLog.Web.AspNetCore
$ {ASPNET-请求的查询字符串} - ASP.NET请求的查询字符串。 NLog.Web NLog.Web.AspNetCore
$ {ASPNET,请求引荐} - ASP.NET请求引用。 NLog.Web NLog.Web.AspNetCore
$ {ASPNET请求的URL} - ASP.NET请求URL。 NLog.Web NLog.Web.AspNetCore
$ {ASPNET请求,用户代理} - ASP.NET请求用户代理。 NLog.Web NLog.Web.AspNetCore
$ {ASPNET-响应的StatusCode} - ASP.NET响应状态代码的内容。 NLog.Web NLog.Web.AspNetCore
$ {ASPNET会话} - ASP.NET Session变量。 NLog.Web NLog.Web.AspNetCore
$ {ASPNET-的SessionID} - ASP.NET会话ID的变量。 NLog.Web NLog.Web.AspNetCore
$ {ASPNET-traceidentifier} - ASP.NET跟踪标识 NLog.Web NLog.Web.AspNetCore
$ {ASPNET用户-的authType} - ASP.NET用户验证。 NLog.Web NLog.Web.AspNetCore
$ {ASPNET用户身份} - ASP.NET用户变量。 NLog.Web NLog.Web.AspNetCore
$ {ASPNET用户-isauthenticated} - ASP.NET用户身份验证? NLog.Web NLog.Web.AspNetCore
$ {ASPNET-webrootpath} - ASP.NET Web根目录路径(wwwroot文件) NLog.Web NLog.Web.AspNetCore
$ {iis-site-name} - IIS网站的名称。 NLog.Web NLog.Web.AspNetCore
rules 真正输出配置
日志等级排序 自上而下,等级递增:
Trace
- 最常见的记录信息,一般用于普通输出
Debug
- 同样是记录信息,不过出现的频率要比Trace少一些,一般用来调试程序
Info
- 信息类型的消息
Warn
- 警告信息,一般用于比较重要的场合
Error
- 错误信息
Fatal
- 致命异常信息。一般来讲,发生致命异常之后程序将无法继续执行。
4.配置program.cs
文件
using NLog.Web;
//nlog日志文件
// 加载Nlog配置文件 (名字为需要读取的配置文件的文件名) 注意这里的AddNLog方法会引起NLog和NLog.WebAspNetCore冲突,使用NLog.Web命名空间即可
builder.Logging.AddNLog("Nlog.config");
自定义错误信息提示
//info自定义错误信息提示
_logger.LogInformation("------------------------Info---------------------");
//error 提示
_logger.LogError("------------------------Error---------------------");
//warn提示
_logger.LogWarning("------------------------Warning---------------------");
运行成功后,会将设定后的级别及以上的日志信息存放在数据库中了