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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 分享一个 .NET Core Console 项目中应用 NLog 写日志的详细例子

前言

日志在软件开发中扮演着非常重要的角色,通常我们用它来记录应用程序运行时发生的事件、错误信息、警告以及其他相关信息,帮助在调试和排查问题时更快速地定位和解决 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 怎么样呢?欢迎留言讨论。

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

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


相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
3月前
|
监控 安全 Linux
AWK在网络安全中的高效应用:从日志分析到威胁狩猎
本文深入探讨AWK在网络安全中的高效应用,涵盖日志分析、威胁狩猎及应急响应等场景。通过实战技巧,助力安全工程师将日志分析效率提升3倍以上,构建轻量级监控方案。文章详解AWK核心语法与网络安全专用技巧,如时间范围分析、多条件过滤和数据脱敏,并提供性能优化与工具集成方案。掌握AWK,让安全工作事半功倍!
71 0
|
6月前
|
存储 监控 算法
基于 PHP 语言的滑动窗口频率统计算法在公司局域网监控电脑日志分析中的应用研究
在当代企业网络架构中,公司局域网监控电脑系统需实时处理海量终端设备产生的连接日志。每台设备平均每分钟生成 3 至 5 条网络请求记录,这对监控系统的数据处理能力提出了极高要求。传统关系型数据库在应对这种高频写入场景时,性能往往难以令人满意。故而,引入特定的内存数据结构与优化算法成为必然选择。
124 3
|
7月前
|
运维 应用服务中间件 nginx
docker运维查看指定应用log文件位置和名称
通过本文的方法,您可以更高效地管理和查看Docker容器中的日志文件,确保应用运行状态可控和可监测。
706 28
|
6月前
|
SQL 数据库
【YashanDB知识库】应用绑定参数的慢查询,慢日志抓取不到
【YashanDB知识库】应用绑定参数的慢查询,慢日志抓取不到
|
8月前
|
开发框架 安全 .NET
【Azure Developer】.NET Aspire 项目本地调试遇 Grpc.Core.RpcException 异常( Error starting gRPC call ... )
Error starting gRPC call. HttpRequestException: The SSL connection could not be established, see inner exception. AuthenticationException: The remote certificate is invalid because of errors in the certificate chain: UntrustedRoot
160 12
|
7月前
|
SQL 分布式计算 Serverless
基于阿里云 EMR Serverless Spark 版快速搭建OSS日志分析应用
基于阿里云 EMR Serverless Spark 版快速搭建OSS日志分析应用
130 0
|
7月前
|
传感器 人工智能 机器人
D1net阅闻|OpenAI机器人项目招新 或自研传感器
D1net阅闻|OpenAI机器人项目招新 或自研传感器
|
7月前
|
存储 弹性计算 运维
海量日志接入 Elasticsearch Serverless 应用降本70%以上
本文将探讨在日志场景下,使用阿里云Elasticsearch Serverless相较于基于ECS自建Elasticsearch集群的成本与性能优势,展示如何通过Serverless架构实现高达 70%以上的成本节约。
393 0
|
9月前
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
205 5
|
12月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
186 7

热门文章

最新文章