接着讲基于ASP .net Core 的web开发,这节主要讲一下如何使用和配置Nlog进行日志记录。

日志在开发中的作用是很重要的,使用日志,程序出了错误可以及时捕获并记录下来,开发人员可以通过日志定位错误,进行修复。

ASP .net Core虽然也给我们提供了一个原生的日志系统,但是这个日志系统不够强大,不能满足我们的一些需求,我们可以使用第三方的日志库,比较优秀的就是Nlog,使用它,我们首先要安装这个包,打开Nuget包管理器(了解详细的安装程序包请点击.Net Core平台下,添加包的引用),搜索:NLog.Web.AspNetCore 将其下载安装。

安装完成后,需要添加一个Nlog的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">

<targets>

<target xsi:type="File"

name="logfile"

fileName="${basedir}/logs/${shortdate}.log"

keepFileOpen="false"

layout="${longdate}|${callsite:fileName=True}

|${uppercase:${level}}|${message} ${exception}" />

<target xsi:type="File"

name="debugfile"

fileName="${basedir}/logs/${shortdate}_debug.log"

keepFileOpen="false"

layout="${longdate}|${callsite:fileName=True}

|${uppercase:${level}}|${message} ${exception}" />

<target xsi:type="File"

name="errfile"

fileName="${basedir}/logs/${shortdate}_error.log"

keepFileOpen="false"

layout="${longdate}|${callsite:fileName=True}

|${uppercase:${level}}|${message} ${exception}" />

</targets>

<rules>

<logger name="*" level="Debug" writeTo="debugfile" />

<logger name="*" level="Error" writeTo="errfile" />

<logger name="*" minlevel="Trace" writeTo="logfile" />

</rules>

</nlog>

这个配置文件主要是配置日志规则,和存放日志文件的路径,有兴趣的同学可以去Nlog官网看一下配置文件的所有规则。

注意,配置文件还有很重要的一步,右键配置文件点击属性:

将复制到输入目录设置为总是复制:

这样,当你运行或者打包程序的时候,这个日志配置文件也会被打包在内。

接下来,我们要在Program.cs文件中配置使用Nlog,这个方法是用Nlog替代ASP.NetCore 自带的日志系统,也可以在Startup.cs中配置Nlog日志服务,两个方法都可以,先讲一下前者:

在Main方法的生成主机方法之前加入:

//配置Nlog
NLogBuilder.ConfigureNLog("Nlog.config");

这一步是加载配置文件,然后在CreateHostBuilder中添加几行配置:

.ConfigureLogging(l =>
{
//移除其余的Logger
l.ClearProviders();
//设置最低日志等级
l.SetMinimumLevel(LogLevel.Information);
//每次记录日志,都显示到控制台
l.AddConsole();
}).UseNLog()//使用Nlog

最终配置如下图:

这样,我们就可以使用Nlog记录日志了:

运行一遍以后,会在运行目录下生成log文件夹,和两个日志文件(路径可以在配置文件中修改):

接下来讲一下第二种方法,注册Nlog日志服务,首先在appsetting.json中添加如下配置:

"NLog": {
"autoReload": true,
"throwConfigExceptions": true,
"internalLogLevel": "info",
"internalLogFile": "${basedir}/logs/internal-nlog.txt",
"extensions": {
"NLog.Extensions.Logging": {
"assembly": "NLog.Extensions.Logging"
}
},
"variables": {
"var_logdir": "${basedir}"
},
"default-wrapper": {
"type": "AsyncWrapper",
"overflowAction": "Block"
},
"targets": {
"all-file": {
"type": "File",
"fileName": "${var_logdir}/logs/nlog-all-${shortdate}.log",
"layout": {
"type": "JsonLayout",
"Attributes": [
{
"name": "time",
"layout": "${longdate}"
},
{
"name": "level",
"layout": "${level}"
},
{
"name": "target",
"layout": "${callsite:className=true:methodName=true:skipFrames=1}"
},
{
"name": "message",
"layout": "${message:raw=true}",
"escapeUnicode": "false"
},
{
"name": "properties",
"encode": "false",
"layout": {
"type": "JsonLayout",
"includeallproperties": "true"
}
}
]
}
},
"own-console": {
"type": "LimitingWrapper",
"interval": "00:00:01",
"messageLimit": 100,
"target": {
"type": "Console",
"layout": "${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|${callsite}"
}
}
},
"rules": [
{
"logger": "*",
"minLevel": "Trace",
"writeTo": "all-file"
},
{
"logger": "Microsoft.*",
"maxLevel": "Info",
"final": true
},
{
"logger": "*",
"minLevel": "Debug",
"writeTo": "own-console",
"filters": {
"whenRepeated": {
"layout": "${message}",
"action": "Ignore"
}
}
}
]
}

这个跟Nlog.config作用是一样的,然后在ConfigServices中注册服务:

//读取配置文件
LogManager.Configuration= new NLogLoggingConfiguration(Configuration.GetSection("NLog"));
var currentClassLogger = NLog.Web.NLogBuilder.ConfigureNLog(LogManager.Configuration).GetCurrentClassLogger();
services.AddSingleton<Logger>(currentClassLogger);

然后在需要的地方正常添加依赖注入(NLog.Logger类):

这里要说明一点,通过这个方式配置的Nlog,是不会覆盖自带的日志系统的,如果要取消,可以在CreateHostBuilder中配置,怎么移除上方有讲。

记录日志的方式如下:

_nlogger.Properties.Clear();
_nlogger.Error("Read once Data");

因为每次记录日志都会将属性值连带记录,它的属性值又是共有的,不清除的话,会有上次记录的冗余数据,这个当然是不友好的,所以要先清除,如果要记录额外数据的话,就可以为属性值赋值,它是一个键值对集合。

这是我的公众号二维码,获取最新文章,请关注此号

Asp.NetCore Web开发之Nlog日志配置的更多相关文章

  1. Asp.NetCore Web开发之RazorPage

    这节讲一下Razor页面. 首先要明确,Razor 不是一种编程语言.它是服务器端的标记语言,配合C#语言,就可以像PHP语言语言一样(但它们并不相同),处理HTML页面逻辑.它是Asp.NetCor ...

  2. Asp.NetCore Web开发之ADO.Net

     Asp.NetCore可以说是.Net平台开发网站的一大利器,最近的一大段时间,就要跟大家分享,如何使用这一利器开发网站项目. 要学习网站开发,首先要学习如何使用ADO.Net进行数据库数据的增删改 ...

  3. Asp.NetCore Web开发之模型验证

    在开发中,验证表单数据是很重要的一环,如果对用户输入的数据不加限制,那么当错误的数据提交到后台后,轻则破坏数据的有效性,重则会导致服务器瘫痪,这是很致命的. 所以进行数据有效性验证是必要的,我们一般通 ...

  4. Web开发之Tomcat&Servlet

    <!doctype html>01 - JavaEE - Tomcat&Servlet figure:first-child { margin-top: -20px; } #wri ...

  5. Asp.NetCore Web应用程序中的请求管道和中间件

    你是否会迷惑当我们请求一个ASP.NetWeb应用程序以后,它是怎么处理这些请求的,后台是怎么工作的,今天就讲一下Asp.NetCore Web应用程序中的请求处理过程. 上一节,我们讲到,Start ...

  6. Vim下的Web开发之html,CSS,javascript插件

    Vim下的Web开发之html,CSS,javascript插件   HTML 下载HTML.zip 解压HTML.zip,然后将里面的所有文件copy到C:\Program Files\Vim\vi ...

  7. Asp.NetCore源码学习[2-1]:配置[Configuration]

    Asp.NetCore源码学习[2-1]:配置[Configuration] 在Asp. NetCore中,配置系统支持不同的配置源(文件.环境变量等),虽然有多种的配置源,但是最终提供给系统使用的只 ...

  8. Asp.NetCore源码学习[1-2]:配置[Option]

    Asp.NetCore源码学习[1-2]:配置[Option] 在上一篇文章中,我们知道了可以通过IConfiguration访问到注入的ConfigurationRoot,但是这样只能通过索引器IC ...

  9. 移动web开发之rem适配布局

    移动web开发之rem适配布局 方案: 页面布局文字能否随着屏幕大小变化而变化 流式布局和flex布局主要针对于宽度布局,那高度如何布局? 怎样让屏幕发生变化的时候元素高度和宽度等比例缩放? 1. r ...

随机推荐

  1. 一些比较好的国外IT网站

    1.在线编程练习: LintCode --在线刷题网站,阶梯式训练,可帮助你更快速深入地了解各类面试题型,提供专业导师写的最优代码作为参考 (Lintcode 标准答案查询--lintcode 的参考 ...

  2. Vue 全家桶学习资源(转)

    companion: React 全家桶学习资源(持续更新) 下面整理了一些关于Vue以及Vue衍生的学习资源: 官网文档 官网API ECMAScript 6 入门 30分钟掌握ES6/ES2015 ...

  3. python之对象与类

    1.类的定义 类是一个用户定义类型,类似与c语言中的结构体 class <ClassName>: "类的帮助信息"#类文档字符串 class_suite #类体 其中C ...

  4. P1164_小A点菜(JAVA语言)

    思路 简单动态规划问题 题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家--餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:"随便点" ...

  5. 《C++反汇编与逆向分析技术揭秘》--算术运算和赋值

    一.加法 1.Debug下: 14: int nVarOne0 = 1 + 5 - 3 * 6;//编译时计算得到结果 00C0550E C7 45 F8 F4 FF FF FF mov dword ...

  6. PTA 统计二叉树度为2的结点个数

    6-4 统计二叉树度为2的结点个数 (11 分)   本题要求实现一个函数,可统计二叉树中度为2的结点个数. 函数接口定义: int NodeCount ( BiTree T); T是二叉树树根指针, ...

  7. 攻防世界 reverse serial-150

    serial-150 suctf-2016 直接使用ida发现main函数中夹杂大片数据,应该是自修改代码,动态调试: 调试中发现,输入为16位,验证方法为:从头开始取一字符进行比较,比较通过检验后, ...

  8. [Fundamental of Power Electronics]-PART II-9. 控制器设计-9.3 关键项1/(1+T)和T/(1+T)以及闭环传递函数的构建

    9.3 关键项\(1/(1+T)\)和\(T/(1+T)\)以及闭环传递函数的构建 从式(9.4)到(9.9)的传递函数可以很容易的由图形代数方法进行构建.假设我们已经分析了反馈系统模块,并且已经画出 ...

  9. Dynamics CRM安装教程五:ADFS安装配置

    ADFS即联合身份认证是一种更加安全的身份验证方式下面开始进行ADFS打开服务器管理器,到添加角色和功能向导下一步到下面界面勾选Active Directory 联合身份认证服务,下一步 默认,下一步 ...

  10. 如何用 Electron + WebRTC 开发一个跨平台的视频会议应用

    在搭建在线教育.医疗.视频会议等场景时,很多中小型公司常常面临 PC 客户端和 Web 端二选一的抉择.Electron 技术的出现解决了这一难题,只需前端开发就能完成一个跨平台的 PC 端应用.本文 ...