分享一个 .NET Core Console 项目中应用 NLog 写日志的详细例子

news2024/11/16 15:53:00

image

前言

日志在软件开发中扮演着非常重要的角色,通常我们用它来记录应用程序运行时发生的事件、错误信息、警告以及其他相关信息,帮助在调试和排查问题时更快速地定位和解决 Bug。

通过日志,我们可以做到:

  1. 故障排除和调试:帮助追踪程序的运行情况,定位问题并进行故障排除。

  2. 性能监控:通过日志记录关键性能指标,可以很方便地监控程序的性能并进行优化。

  3. 安全性:记录潜在的安全问题,帮助及时发现并解决安全漏洞。

  4. 审计和合规性:记录程序的行为,追踪用户的操作记录,确保操作合规性。

NLog 是一个流行的开源日志记录库,用于 .NET 平台的应用程序,可以通过配置文件或代码进行配置,支持多种日志输出方式,如文件、数据库、控制台、网络等,在不影响应用程序性能的情况下进行日志记录,是 .NET 程序员的好助手。

今天分享一个在 .NET Core Console 项目中如果配置和应用 NLog 写日志的详细例子。

Step By Step 步骤

  1. 下载 Nuget 包

    Microsoft.Extensions.DependencyInjection
    NLog.Extensions.Logging
    
  2. 添加 nlog.config 文件,并设置 复制到输出目录-如果较新则复制

    内容见《附录:NLog.config 内容》

  3. 在 Program.cs 注入 NLog 服务(留意注释

    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Logging;
    using NLog.Extensions.Logging;
    
    // 注入 NLog 服务
    services.AddLogging(loggingBuilder => {
    	loggingBuilder.ClearProviders();
    	loggingBuilder.SetMinimumLevel(LogLevel.Information);
    	loggingBuilder.AddNLog();
    });
    
  4. 新建一个 NetUtil.cs(留意注释

    using Microsoft.Extensions.Logging;
    
    class NetUtil
    {
       private readonly ILogger<NetUtil> logger;
    
    	// 构造方法注入 IOptionsSnapshot
    	public NetUtil(ILogger<NetUtil> logger)
    	{
    		this.logger = logger;
    	}
    
    	// 在方法中写日志内容
    	public async Task Test()
    	{
    		try
    		{
    			logger.LogInformation("Starting get data....");
    		}
    		catch (Exception ex)
    		{
    			logger.LogError(ex, "Error occurred when getting dashboard data.");
    		}
    	}
    }
    
  5. 在 Program.cs 调用 NetUtil 中的方法(留意注释

    // 注入 NetUtil 类
    services.AddScoped<NetUtil>();
    
    // 调用 NetUtil 类方法,里面有调用 NLog 方法
    using (var sp = services.BuildServiceProvider())
    {
    	// 建立了一个无限循环
    	using (var scope = sp.CreateScope())
    	{
    		var spScope = scope.ServiceProvider;
    		var demo = spScope.GetRequiredService<NetUtil>();
    		await demo.Test();
    	}
    }
    
  6. 运行程序,即可在程序输出目录如 Debug 中 logs 目录看到生成的日志文件

附录:完整的 Program.cs 代码

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using NLog.Extensions.Logging;

// 注入 NLog 服务
services.AddLogging(loggingBuilder => {
	loggingBuilder.ClearProviders();
	loggingBuilder.SetMinimumLevel(LogLevel.Information);
	loggingBuilder.AddNLog();
});

// 注入 NetUtil 类
services.AddScoped<NetUtil>();

// 调用 NetUtil 类方法,里面有调用 NLog 方法
using (var sp = services.BuildServiceProvider())
{
	using (var scope = sp.CreateScope())
	{
		var spScope = scope.ServiceProvider;
		var demo = spScope.GetRequiredService<NetUtil>();
		await demo.Test();
	}
}

附录: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"
	  internalLogLevel="Warn"
	  internalLogFile="internal-nlog.txt">

	<!-- define various log targets -->
	<targets>
		<!-- write logs to file -->
		<target xsi:type="File" name="allfile" fileName="logs/nlog-all-${shortdate}.log"
				layout="${longdate} ${uppercase:${level}} [${logger}] ${message} ${exception}"
				maxArchiveDays="3"
				maxArchiveFiles="10" />

		<target xsi:type="File" name="ownFile-web" fileName="logs/nlog-info-${shortdate}.log"
				layout="${longdate} ${uppercase:${level}} [${logger}] ${message} ${exception}"
				maxArchiveDays="3"
				maxArchiveFiles="10" />

		<target xsi:type="Null" name="blackhole" />
	</targets>

	<rules>
		<!--Skip Microsoft logs and so log only own logs-->
		<logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" />
		<!--All logs, including from Microsoft-->
		<logger name="*" minlevel="Trace" writeTo="allfile" />
		<logger name="*" minlevel="Info" writeTo="ownFile-web" />
	</rules>
</nlog>

最后

通过使用 NLog 这样的日志记录库,我们可以更轻松地实现日志记录功能,提高应用程序的可靠性和可维护性。

您觉得 NLog 怎么样呢?欢迎留言讨论。

我是老杨,一个奋斗在一线的资深研发老鸟,让我们一起聊聊技术,聊聊人生。

都看到这了,求个点赞、关注、在看三连呗,感谢支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1809473.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

让GNSSRTK不再难【第一天】

第1讲 GNSS系统组成以及应用 北斗导航科普动画_哔哩哔哩_bilibili 1.1 GNSS系统 1.1.1 基本概念 全球卫星导航系统&#xff08;Global Navigation Satellite System, GNSS&#xff09;&#xff0c;是能在地球表面或近地空间的任何地点为用户提供全天候的三维坐标、速度以及…

ISO 19115-2:2019 第6章 获取和处理元数据

6 获取和处理元数据 6.1 获取和处理要求的元数据 ISO 19115-1 确定了描述数字地理资源所需的元数据。本文件扩展了 ISO 19115-1 中确定的元数据,并确定了描述地理资源获取和处理所需的附加元数据。 6.2 获取和处理元数据包及其依赖关系 ISO 地理信息系列标准使用一个或多个…

【C语言】C语言—通讯录管理系统(源码)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

算法笔记1-高精度模板(加减乘除)个人模板

目录 加法 减法 乘法 ​编辑 除法 加法 #include <iostream> #include <cstring> #include <algorithm> #include <cmath> #include <queue>using namespace std;typedef pair<int,int> PII;const int N 1e5 10;int n; int a[N],…

nw.js 如何调用activeX控件 (控件是C++编写的dll文件)

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

《永生之后》读后

文章以2120年背景创作&#xff0c;人类进入永生之年&#xff0c;发现了延长寿命的药物。停滞的死亡&#xff0c;新生的继续造生了人口大爆炸&#xff0c;于是分成两个阵营-长生区&#xff08;不再繁衍后代&#xff09;与生死区&#xff08;不服用药物&#xff0c;仍然生老病死&…

665. 非递减数列(中等)

665. 非递减数列 1. 题目描述2.详细题解3.代码实现3.1 Python3.2 Java 1. 题目描述 题目中转&#xff1a;665. 非递减数列 2.详细题解 判断在最多改变 1 个元素的情况下&#xff0c;该数组能否变成一个非递减数列&#xff0c;一看到题目&#xff0c;不就是遍历判断有几处不…

【全网最简单的解决办法】vscode中点击运行出现仅当从 VS 开发人员命令提示符处运行 VS Code 时,cl.exe 生成和调试才可用

首先确保你是否下载好了gcc编译器&#xff01;&#xff01;&#xff01; 检测方法&#xff1a; winR 打开cmd命令窗 输入where gcc(如果出现路径则说明gcc配置好啦&#xff01;) where gcc 然后打开我们的vscode 把这个文件删除掉 再次点击运行代码&#xff0c;第一个出现…

一篇文章搞定Java数组初始化,从此告别迷惑

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

43【PS 作图】颜色速途

1 通过PS让画面细节模糊&#xff0c;避免被过多的颜色干扰 2 分析画面的颜色 3 作图 参考网站&#xff1a; 色感不好要怎么提升呢&#xff1f;分享一下我是怎么练习色感的&#xff01;_哔哩哔哩_bilibili https://www.bilibili.com/video/BV1h1421Z76p/?spm_id_from333.1007.…

Jenkins构建 Maven项目(微服务)并自动发布

前面讲了docker 安装Jenkins和gitlab代码管理工具&#xff0c;接下来我们讲一下Jenkins怎么构建 Maven项目。 1. 首先Jenkins配置下面3中工具类 首先是在本地安装三个jenkins自动配置相关的工具 1.1 JDK 由于我们使用docker来启动jenkins&#xff0c;其自带有jdk&#xff0c;…

AI大模型日报#0610:港大等1bit大模型“解决AI能源需求”、谷歌开源TimesFM时序预测模型

导读&#xff1a;AI大模型日报&#xff0c;爬虫LLM自动生成&#xff0c;一文览尽每日AI大模型要点资讯&#xff01;目前采用“文心一言”&#xff08;ERNIE 4.0&#xff09;、“零一万物”&#xff08;Yi-Large&#xff09;生成了今日要点以及每条资讯的摘要。欢迎阅读&#xf…

记录自己在xss-labs的通关记录

第十一关&#xff08;referer&#xff09; 直接查看网页源代码&#xff0c;发现四个input被隐藏&#xff0c;不难看出&#xff0c;第四个名为t_ref的<input>标签是http头referer的参数&#xff08;就是由啥地址转跳到这里的&#xff0c;http头的referer会记录有&#xf…

张大哥笔记:从古至今,赚钱最快的路子就一个,从未改变

从古至今&#xff0c;赚钱最快的路子就一个&#xff0c;而且从未改变&#xff0c;那就是信息差&#xff01; 不要误解信息差为某种高端复杂的概念&#xff1b;其本质很简单——它就是"你知道而别人不知道的信息"。 曾经我也认为&#xff0c;随着互联网的发展&#x…

牛客题目数据结构

做过线段树2模板大概可以写出一部分代码&#xff0c;这题主要关键点是怎么维护平方和 借图了 这样处理完maketag的代码就出来了 void maketag(int id,int l,int r,ll v,int opt){if(opt1){seg[id].val*v;seg[id].pfval*(v*v);seg[id].mul*v;}else{seg[id].pfvalv*v*(r-l1)2*v…

小程序 UI 风格,赏心悦目

小程序 UI 风格&#xff0c;赏心悦目

通过 Webhook 将消息推送至钉钉、飞书、企业微信

本文首发于只抄博客&#xff0c;欢迎点击原文链接了解更多内容。 前言 当我们在 VPS 与 NAS 上部署了大量的应用&#xff0c;如何优雅的接收推送消息就成了一个大问题&#xff0c;在“上古时代”最常用的莫过于 SMTP 直接发送邮件进行通知&#xff0c;但当推送的消息过多且频繁…

LabVIEW开发实验室超导体电流特性测试系统

本系统旨在为学校实验室提供一个基于LabVIEW的超导体电流特性测试平台&#xff0c;通过精确测量超导体在不同温度和电流条件下的电学特性&#xff0c;帮助学生和研究人员深入理解超导体的物理性质。本文将从背景、目标、工作原理、使用方法、操作流程和注意事项等方面详细介绍该…

简单聊聊大数据解决方案

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…