接着讲基于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. WorkSkill 面试之 字节跳动一面

  2. (2)MySQL进阶篇SQL优化(show status、explain分析)

    1.概述 在应用系统开发过程中,由于初期数据量小,开发人员写SQL语句时更重视功能上的实现,但是当应用系统正式上线后,随着生产数据量的急剧增长,很多SQL语句开始逐渐显露出性能问题,对生产环境的影响也 ...

  3. 网络对抗技术Exp2-后门原理与实践

    后门概念 后门就是不经过正常认证流程而访问系统的通道. 哪里有后门呢? 编译器留后门 操作系统留后门 最常见的当然还是应用程序中留后门 还有就是潜伏于操作系统中或伪装为特定应用的专用后门程序. 下面是 ...

  4. 从I/O多路复用到Netty,还要跨过Java NIO包

    本文是Netty系列第4篇 上一篇文章我们深入了解了I/O多路复用的三种实现形式,select/poll/epoll. 那Netty是使用哪种实现的I/O多路复用呢?这个问题,得从Java NIO包说 ...

  5. 第17 章 : 深入理解 etcd:etcd 性能优化实践

    深入理解 etcd:etcd 性能优化实践 本文将主要分享以下五方面的内容: etcd 前节课程回顾复习: 理解 etcd 性能: etcd 性能优化 -server 端: etcd 性能优化 -cl ...

  6. OO电梯系列总结与反思

    目录 前言 HW5 度量分析 UML类图与协作图 bug分析 HW6 度量分析 UML类图与协作图 bug分析 HW7 度量分析 UML类图与协作图 bug分析 SOLID原则 感想 前言 紧张刺激的 ...

  7. JavaWeb 补充(Json)

    HTML DOM alert() 方法 定义和用法 alert() 方法用于显示带有一条指定消息和一个 OK 按钮的警告框. 参数 描述 message 要在 window 上弹出的对话框中显示的纯文 ...

  8. Spring Boot 2.4 新特性,全新的Cron表达式处理机制

    说起 cron 表达式大家一定不陌生,我们常用来作为定时任务执行策略规则. 在 Spring Boot 框架中 cron 表达式主要配合 @Scheduled 注解在应用程序中使用. 在 Spring ...

  9. OAuth 2.0 单元测试解决方案

    为什么需要单元测试 单元测试拥有保证代码质量.尽早发现软件 Bug.简化调试过程.促进变化并简化集成.使流程更灵活等优势.单元测试是针对代码单元的独立测试,核心是"独立",优势来源 ...

  10. 解决Linux无法读写U盘中的NTFS问题

    1 问题描述 由于笔者因为某些需要把Windows装在了U盘上面(在这里建议一下如果有需要请使用固态U盘),在Linux下挂载时,能读取但并不能写. 2 尝试的解决方案 2.1 remount 一开始 ...