.net core中的那些常用的日志框架(NLog篇)
前言
咱们上回讲到,.net core中内置的Logging日志框架的使用,以及浅显的讲解,接下来,给大家介绍一个第三方日志框架(NLog)。
NLog简介
NLog是适用于各种.NET平台(包括.NET标准)的灵活,免费的日志记录平台。NLog使写入多个目标变得容易 。(数据库,文件,控制台)并即时更改日志记录配置。
NLog的优势
- NLog支持结构化 和传统日志记录。
- NLog的重点是:高性能,易于使用,易于扩展和灵活配置。

1.NuGet安装NLog
NLog.Web.AspNetCore
NLog.Config
简短说明:
- NLog.Web.AspNetCore:引入第三方的服务,可以在程序中使用
- NLog.Config:安装之后,会自动生成一个配置文件模板(NLog.Config)。

2.引入服务(Program)
public class Program
{
public static void Main(string[] args)
{
//添加Nlog的配置项
NLogBuilder.ConfigureNLog("NLog.config");
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureLogging(log => {
//从builder移除内置的日志框架(如果引用第三方,一定要设置这属性)
log.ClearProviders();
//将日志添加到控制台
log.AddConsole();
//将日志添加到Debug窗口
log.AddDebug();
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
}).
UseNLog();//引用第三方日志框架
}
需要注意的几个地方:
- NLogBuilder.ConfigureNLog("NLog.config");引入配置文件
- log.ClearProviders();移除内置的日志框架(Logging)
- log.AddConsole();将日志添加到控制台
- log.AddDebug();将日志添加到debug窗口
- UseNLog()在末尾引入第三方的日志框架(一定要写)
3.修改NLog.Config文件
简单介绍配置文件中的配置信息
+ xmlns,xsi是引入命名空间
+ autoReload="true"是热更新,在程序运行过程中也可以修改配置文件
+ throwExceptions:NLog日志系统抛出异常
+ internalLogLevel:日志级别
+ internalLogFile:内部日志文件
+ variable:定义变量
+ targets:日志输出地方
+ rules:日志的路由规则
3.1日志显示控制台版本
<?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"
xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
autoReload="true"
throwExceptions="false"
internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">
<variable name="myvar" value="myvalue"/>
<targets>
<!--使用可自定义的着色将日志消息写入控制台-->
<target name="colorConsole" xsi:type="ColoredConsole" layout="[${date:format=HH\:mm\:ss}]:${message} ${exception:format=message}" />
</targets>
<rules>
<logger name="*" minlevel="Warn" writeTo="colorConsole" />
</rules>
</nlog>
效果如下:
3.2日志存入本地txt版本
需要注意的地方
target中的参数
- name:是指的输出地方的一个名词(给rules调用的)
- xsi:type:输出文件的类型,File指的是文件
- fileName:输出到目标文件的地址,使用的相对路径,可以自行配置输出的地点。
- layout:在最简单的形式中,布局是带有嵌入标记的文本,这些嵌入标记由${和分隔}
- archiveFileName:表示滚动日志存放路径
- archiveAboveSize:单次日志的存储大小(单位是KB),超过配置,会archiveFileName中创建新的日志
- archiveNumbering:Sequence(排序),Rolling(滚动)
- concurrentWrites:支持多个并发一起写文件,提高文件写入性能。
- keepFileOpen:为了提高文件写入性能,避免每次写入文件都开关文件
- autoFlush:为了提高日志写入性能,不必每次写入日志都直接写入到硬盘
- createDirs:若设置的日志文件夹不存在,则自动创建文件夹。
rules中的参数
- logger:代表一个路由的规则
- name:logger名称,若为*则表示适用于所有日志
- minlevel:表示当前日志的最低日志级别,只有等于或大于该值的日志级别才会被记录
- writeTo:和target的name匹配,一个rules对应一个target
<?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"
xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
autoReload="true"
throwExceptions="false"
internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">
<!-- optional, add some variables
https://github.com/nlog/NLog/wiki/Configuration-file#variables
-->
<variable name="myvar" value="myvalue"/>
<targets>
<!--项目日志保存文件路径说明fileName="${basedir}/保存目录,以年月日的格式创建/${shortdate}/${记录器名称}-${单级记录}-${shortdate}.txt"-->
<target name="log_file" xsi:type="File"
fileName="${basedir}/Logs/${shortdate}/${logger}-${level}-${shortdate}.txt"
layout="${longdate} | ${message} ${onexception:${exception:format=message} ${newline} ${stacktrace} ${newline}"
archiveFileName="${basedir}/archives/${logger}-${level}-${shortdate}-{#####}.txt"
archiveAboveSize="1024"
archiveNumbering="Sequence"
concurrentWrites="true"
keepFileOpen="false"
autoFlush="false"
encoding="utf-8"
createDirs="true"
/>
<!--使用可自定义的着色将日志消息写入控制台-->
<target name="colorConsole" xsi:type="ColoredConsole" layout="[${date:format=HH\:mm\:ss}]:${message} ${exception:format=message}" />
</targets>
<rules>
<logger name="Microsoft.*" minlevel="Info" writeTo="log_file" final="true" />
<logger name="*" minlevel="Info" writeTo="log_file" />
<!--logger name="*" minlevel="Warn" writeTo="colorConsole" /-->
</rules>
</nlog>
效果如下
正如大家看到一样,是以日志的类型进行区分建立txt日志文档,这样不仅可以区分不同的日志级别,还可以根据不同的Controller生成对应的日志,在以后分析日志的问题的时候,可以精确到某一个点的日志问题。
3.3日志存入数据库版本
您可以将此目标与各种数据库提供程序一起使用,例如System.Data,Microsoft.Data,Oracle,MySql,SqlLite等,本文以SQL为例。
注意事项
- 在.net core中使用Nlog,dbProvider需要设置说明(是什么数据库,在Nlog的官方文档有明确提示)
- 根据不同的数据库,安装不同的驱动,本文使用的是SQL Server,所以需要在NuGet安装:Microsoft.Data.SqlClient
3.3.1需要创建数据库
CREATE TABLE [dbo].[NLog] (
[ID] [int] IDENTITY(1,1) NOT NULL,
[MachineName] [nvarchar](200) NULL,
[Logged] [datetime] NOT NULL,
[Level] [varchar](5) NOT NULL,
[Message] [nvarchar](max) NOT NULL,
[Logger] [nvarchar](300) NULL,
[Properties] [nvarchar](max) NULL,
[Callsite] [nvarchar](300) NULL,
[Exception] [nvarchar](max) NULL,
CONSTRAINT [PK_dbo.Log] PRIMARY KEY CLUSTERED ([ID] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
)
3.3.2配置Nlog
<?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"
xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
autoReload="true"
throwExceptions="false"
internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">
<!-- optional, add some variables
https://github.com/nlog/NLog/wiki/Configuration-file#variables
-->
<variable name="myvar" value="myvalue"/>
<targets>
<!--存储数据库-->
<target name="apiUsageLog"
xsi:type="Database"
dbProvider="Microsoft.Data.SqlClient.SqlConnection,Microsoft.Data.SqlClient"
connectionString="Data Source=.;Initial Catalog=test;User ID=sa;Password=123456;">
<commandText>
INSERT INTO [dbo].[NLog] (
[MachineName],
[Logged],
[Level],
[Message],
[Logger],
[Properties],
[Callsite],
[Exception]
) VALUES (
@machineName,
@logged,
@level,
@message,
@logger,
@properties,
@callsite,
@exception
);
</commandText>
<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="@properties" layout="${all-event-properties:separator=|}" />
<parameter name="@callsite" layout="${callsite}" />
<parameter name="@exception" layout="${exception:tostring}" />
</target>
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="apiUsageLog" />
</rules>
</nlog>
3.3.3如何使用?
//获取Nlog对象
private Logger _logger = LogManager.GetCurrentClassLogger();
public void Get()
{
_logger.Info("asd");
_logger.Debug("测试消息Debug");
_logger.Warn("测试消息Warn");
_logger.Trace("测试消息Trace");
_logger.Error("测试消息Error");
}
3.3.4实际效果

3.4邮箱发送日志版本
这个比较简单,只需要简单配置即可
<?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"
xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
autoReload="true"
throwExceptions="false"
internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">
<!-- optional, add some variables
https://github.com/nlog/NLog/wiki/Configuration-file#variables
-->
<variable name="myvar" value="myvalue"/>
<targets>
<!--邮箱-->
<target xsi:type="Mail"
name="emial"
header="=============================================="
footer="=============================================="
html="true"
addNewLines="true"
encoding="UTF-8"
subject="测试日志信息${machinename}"
body="${newline}${message}${newline}"
enableSsl="true"
to="接受邮件的邮箱地址"
from="发送邮件的邮箱地址"
smtpPassword="发送邮件的邮箱密码"
smtpAuthentication="Basic"
smtpServer="smtp.163.com"
smtpPort="25"
smtpUserName="发送邮件的邮箱地址">
</target>
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="emial" />
</rules>
</nlog>
效果如下图:

4.总结
想比较Logging日志框架,NLog的好处就不必多说,多样的存储方式,简洁明了的配置信息,在项目中使用,来给我带来很好的分析问题的好帮手,日志类型还可以分块,日志大小还能切割,极大的满足了我们的日常需求。需要注意一点,发邮件可以群发,需要配置,存数据库可以用存储过程,可以查看官方文档。
5.参考文档
.net core中的那些常用的日志框架(NLog篇)的更多相关文章
- .net core中的那些常用的日志框架(Serilog篇)
前言 上文说到Nlog日志框架,感觉它功能已经很强大,今天给大家介绍一个很不错的日志框架Serilog,根据我的了解,感觉它最大的优势是,结构化日志,它输出的日志是Json的格式,如果你使用的是Mon ...
- .net core中的那些常用的日志框架(Logging篇)
前言 日志,在我们每个项目中是必不可少的,它不仅能在调试的时候测试数据,而且在项目上线,也是我们排查错误的得力助手,那我就能谈谈,用的多的几个日志框架吧!如果有不对的地方,欢迎来指教错误,谢谢! As ...
- 一个简单好用的日志框架NLog
之前我介绍过如何使用log4net来记录日志,但最近喜欢上了另一个简单好用的日志框架NLog. 关于NLog和log4net的比较这里就不多讨论了,感兴趣的朋友可以参看.NET日志工具介绍和log4n ...
- Java常用的日志框架
1.Java常用日志框架对比 https://www.jianshu.com/p/bbbdcb30bba8 2.Log4j,Log4j2,Logback日志框架性能对比 https://bbs.hua ...
- 来,带你鸟瞰 Java 中4款常用的并发框架!
1. 为什么要写这篇文章 几年前 NoSQL 开始流行的时候,像其他团队一样,我们的团队也热衷于令人兴奋的新东西,并且计划替换一个应用程序的数据库. 但是,当深入实现细节时,我们想起了一位智者曾经说过 ...
- 日志框架 NLog
这里按老规矩先进行和其它产品进行比较: 目前在.net平台存在两个比较老牌的日志框架分别为Log4net和NLog. 我们进行对这两种框架进行比较下 Log4net Log4net是一个老牌的日志框架 ...
- net core中动态给log4net添加日志类型
private static object m_Lock = new object(); /// <summary> /// 根据类型获取对应的日志操作类 /// </summary ...
- JAVA中几种常用的RPC框架介绍
原文:https://blog.csdn.net/zhaowen25/article/details/45443951
- 玩转ASP.NET Core中的日志组件
简介 日志组件,作为程序员使用频率最高的组件,给程序员开发调试程序提供了必要的信息.ASP.NET Core中内置了一个通用日志接口ILogger,并实现了多种内置的日志提供器,例如 Console ...
随机推荐
- 如何让css样式只在当前组件起作用?
当前组件<style>写成<style scoped>
- vue 图片路径问题
图片路径问题 module.exports = { // 根据环境区分 生产服务器production比如php服务器的地址 和 开发服务器dev的地址 // npm run serve是开发环境de ...
- 阿里面试官:HashMap 熟悉吧?好的,那就来聊聊 Redis 字典吧!
最近,小黑哥的一个朋友出去面试,回来跟小黑哥抱怨,面试官不按套路出牌,直接打乱了他的节奏. 事情是这样的,前面面试问了几个 Java 的相关问题,我朋友回答还不错,接下来面试官就问了一句:看来 Jav ...
- Git——从安装到连接GitHub
安装Git Windows平台上很轻松的,直接点击地址Git下载进行下载,之后基本就是下一步,安装成功. 在所需要操作的项目下右键,点击"Git Bash Here"弹出Git命令 ...
- leetcode刷题-36有效的数独
题目 判断一个 9x9 的数独是否有效.只需要根据以下规则,验证已经填入的数字是否有效即可. 数字 1-9 在每一行只能出现一次.数字 1-9 在每一列只能出现一次.数字 1-9 在每一个以粗实线分隔 ...
- JWT伪造攻击
JWT修改伪造攻击 什么是JWT? JSON Web Token(JSON Web令牌)是一种跨域验证身份的方案.JWT不加密传输的数据,但能够通过数字签名来验证数据未被篡改(但是做完下面的WebGo ...
- vscode代码格式化
第一种解决方案 ctrl + shift + X eslint 安装 ctrl + , 或者打开C:\Users\Administrator\AppData\Roaming\Code\User\set ...
- spring boot 源码之SpringApplicationRunListeners
SpringApplicationRunListeners SpringApplicationRunListener的集合,内部存储了SpringApplicationRunListener的集合,提 ...
- vue 项目中实时请求接口 建立长连接
需求:在项目中需要每隔五秒请求一次接口 第一种方法:直接在mounted钩子函数中处理 mounted() { window.setInterval(() => { setTimeout(thi ...
- 代码检查工具 Sonar 安装&使用
本文主要说明Sonar的安装方式并附上依赖安装包,本文目标只实现本地搭建测试的Sonar环境,以及本地的测试项目的非定制化扫描 本机测试环境:Win10-X64,.vs2017 依赖包: 1 ...

