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

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;// 构造方法注入 IOptionsSnapshotpublic 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.mzph.cn/pingmian/25877.shtml

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

相关文章

【经验总结】ECU休眠后通过一帧NM报文唤醒ECU后在要求时间内通过第二帧NM报文需要唤醒网络

目录 前言 环境 1.需求描述 2.测试方法 3.完成需求的方法 4.原理详解 4.1 CanTrcv 接收到第一帧NM报文 4.2 EcuM接收到唤醒事件 4.3 CanTcv接收到第二帧NM报文 4.4 EcuM完成唤醒源校验 5. 总结 前言 关于CAN收发器参与下的ECU休眠唤醒问题我们已经写过很多文章,&l…

【C#/C++】C++定义一个返回uchar*的函数,调用函数时接收的数据异常

C定义一个返回uchar*的函数&#xff0c;调用函数时接收的数据异常 1、场景2、错误代码3.正确写法 1、场景 我是想实现一个图像畸变矫正的函数&#xff0c;由于相机的硬件原因&#xff08;相机内外参数&#xff0c;视野&#xff09;会导致我们取到的图有一定程度的畸变&#xff…

Reinforcement Learning学习(三)

前言 最近在学习Mujoco环境,学习了一些官方的Tutorials以及开源的Demo,对SB3库的强化学习标准库有了一定的了解,尝试搭建了自己的环境,基于UR5E机械臂,进行了一个避障的任务,同时尝试接入了图像大模型API,做了一些有趣的应用,参考资料如下: https://mujoco.readthedo…

MySQL普通表转换为分区表实战指南

码到三十五 &#xff1a; 个人主页 引言 本文将详细指导新手开发者如何将MySQL中的普通表转换为分区表。分区表在处理庞大数据集时展现出显著的性能优势&#xff0c;不仅能大幅提升查询速度&#xff0c;还能有效简化数据维护工作。通过掌握这一技巧能够更好地应对数据密集型应…

《编程小白变大神:DjangoBlog带你飞越代码海洋》

还在为你的博客加载速度慢而烦恼&#xff1f;DjangoBlog性能优化大揭秘&#xff0c;让你的网站速度飞跃提升&#xff01;本文将带你深入了解缓存策略、数据库优化、静态文件处理等关键技术&#xff0c;更有Gunicorn和Nginx的黄金搭档&#xff0c;让你的博客部署如虎添翼。无论你…

解决阿里云的端口添加安全组仍然无法扫描到

发现用线上的网站扫不到这个端口&#xff0c;这个端口关了&#xff0c;但是没有更详细信息了 我用nmap扫了一下我的这个端口&#xff0c;发现主机是活跃的&#xff0c;但是有防火墙&#xff0c;我们列出云服务器上面的这个防火墙list&#xff0c;发现确实没有5566端口 参考&a…

大数据解决方案案例:电商平台日志分析

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

AI作画工具介绍

目录 1.概述 2.Stable Diffusion 2.1.诞生背景 2.2.版本历史 2.3.优点 2.4.缺点 2.5.应用场景 2.6.未来展望 3.Midjourney 3.1.诞生背景 3.2.版本历史 3.3.优点 3.4.缺点 3.5.应用场景 3.6.未来展望 4.总结 1.概述 AI作画工具是一种运用人工智能技术&#xff…

万向节锁死(Gimbal Lock)

Gimbal Lock是一个常见的3D动画问题,主要由旋转顺序引起的。我来详细解释一下它的成因: 在三维空间中,任何旋转都可以分解为绕X,Y,Z三个轴的欧拉旋转(Euler Rotation)。每个轴的旋转是按照一定顺序进行的,比如XYZ或ZYX等。 理论上,通过这三个旋转值的组合,可以达到任意的空间…

require.context()函数介绍

业务需求&#xff1a; 前端Vue项目怎样读取src/assets目录下所有jpg文件 require.context()方法来读取src/assets目录下的所有.jpg文件 <template><div><img v-for"image in images" :src"image" :key"image" /></div> …

代码随想录打卡第一天(补)

数组理论基础&#xff0c;704. 二分查找&#xff0c;27. 移除元素 704. 二分查找 最简单的二分思想的应用&#xff0c;主要锻炼写两种方法 两种方法的区别就是&#xff1a;右指针的每次变化&#xff0c;可能还有就是最后找到目标值后的一个下标到底是什么 二分思想&#xff1…

Python实现Stack

你好&#xff0c;我是悦创。 Python 中的栈结构是一种后进先出&#xff08;LIFO, Last In, First Out&#xff09;的数据结构&#xff0c;这意味着最后添加到栈中的元素将是第一个被移除的。栈通常用于解决涉及到反转、历史记录和撤销操作等问题。在 Python 中&#xff0c;你可…

九、C语言:隐式类型转换(整型提升与算数转换)

一、隐式类型转换 C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度&#xff0c;表达式中的字符和短整型操作数在使用之前被转换为普通整型&#xff0c;这种转换称为整型提升。 二、整型提升 //1.表达式的整型运算要在CPU的相应运算器件内执行&#xff…

I/O 设备与设备控制器

目录 I/O 设备 1. 键盘和鼠标 2. 显示器 3. 磁盘 4. 打印机 5. 网络适配器 设备控制器 1. 数据传输 2. 缓冲管理 3. 中断处理 4. 设备初始化 5. 错误检测与恢复 6. 设备控制器的组成部分 7. 示例图解 内存映像 I/O 原理 优点 实现方式 应用场景 I/O 通道 I…

Nginx 精解:正则表达式、location 匹配与 rewrite 重写

一、常见的 Nginx 正则表达式 在 Nginx 配置中&#xff0c;正则表达式用于匹配和重写 URL 请求。以下是一些常见的 Nginx 正则表达式示例&#xff1a; 当涉及正则表达式时&#xff0c;理解各个特殊字符的含义是非常重要的。以下是每个特殊字符的例子&#xff1a; ^&#xff1…

langchainJS -结构化输出(StructuredOutputParser )

在LangChain的帮助下&#xff0c;我们可以为输出定义模式。StructuredOutputParser 使用定义的名称和描述来分析和构建模型预测的输出。 const productParser StructuredOutputParser.fromNamesAndDescriptions({Name: "Name of The Product",Description: "De…

JS中split的用法

在JavaScript中&#xff0c;split() 方法用于将字符串分割成字符串数组&#xff0c;并返回这个数组。该方法接受一个参数&#xff0c;该参数定义了用于分割字符串的字符或正则表达式。 以下是一些使用 split() 方法的示例&#xff1a; 示例 1&#xff1a;使用字符串作为分隔符…

【笔记2】Python编程:从入门到实践(第2版) - 埃里克·马瑟斯

第二部分 1、外星人入侵 Pygame包 2、数据可视化 Matplotlib 、Plotly 3、Web应用程序 Django 项目1&#xff1a;外星人入侵 第12章&#xff5e;第14章 使用Pygame包来开发一款2D游戏。 它在玩家每消灭一群向下移动的外星人后&#xff0c;将玩家提高一个等级。等级越高&…

spring 事务隔离级别

一、理解 脏读、不可重复读和幻读 脏读、不可重复读和幻读是数据库事务处理中可能出现的三种并发问题&#xff0c;它们都与事务的隔离性有关。下面是这三种现象的简要说明&#xff1a; 1. 脏读&#xff08;Dirty Read&#xff09;: 当一个事务读取了另一个事务尚未提交的更改…

【Python】pandas中的read_excel()和to_excel()函数解析与代码实现

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。 &#x1f913; 同时欢迎大家关注其他专栏&#xff0c;我将分享Web前后端开发、人工智能、机器学习、深…