当前位置: 首页 > news >正文

C# 使用 NLog 输出日志到文件夹

  1. 在项目中使用 NuGet 安装 NLog 包以及 NLog.Config

在这里插入图片描述

  1. 配置 nlog.config

在项目的根目录下创建一个 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"xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"autoReload="true"throwExceptions="false"internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">
<!-- 定义日志目标 async="true" 异步写日志--><targets async="true"><!-- log_file 配置,按天生成日志文件夹,保留时间7--><target name="log_file" xsi:type="File"fileName="logs/${shortdate}/LogFile_${shortdate}.log"layout="${longdate}|${level:uppercase=true}|${message}${onexception:${newline}${exception:format=tostring}}${newline}"archiveEvery="Day"archiveNumbering="Rolling"maxArchiveDays="7"archiveAboveSize="5242880"keepFileOpen="false"concurrentWrites="true" /><!-- err_file 配置 --><target name="err_file" xsi:type="File"fileName="logs/${shortdate}/ErrorFile_${shortdate}.log"layout="${longdate}|${level:uppercase=true}|${message}${onexception:${newline}${exception:format=tostring}}${newline}"archiveEvery="Day"archiveNumbering="Rolling"archiveAboveSize="5242880"maxArchiveDays="7"keepFileOpen="false"concurrentWrites="true" /></targets><!-- 定义日志规则 --><rules><!-- 将所有输出日志和错误日志分别写入 log_file 和 err_file--><logger name="*" minlevel="Debug"  writeTo="log_file" /><logger name="*" minlevel="Error"  writeTo="err_file" /></rules>
</nlog>

实现异步写入的另外一种配置:

<?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"xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"autoReload="true"throwExceptions="false"internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log"><targets><!-- log_file 配置,按天生成日志文件夹,保留时间7--><target  name="logfile"  xsi:type="AsyncWrapper" queueLimit="5000" overflowAction="Discard"><target xsi:type="File"fileName="logs/${shortdate}/ZJNLogFile_${shortdate}.log"layout="${longdate}|${level:uppercase=true}|${message}${onexception:${newline}${exception:format=tostring}}${newline}"archiveEvery="Day"archiveNumbering="Rolling"maxArchiveDays="7"archiveAboveSize="5242880"keepFileOpen="false"concurrentWrites="true" /></target><target  name="errfile"  xsi:type="AsyncWrapper" queueLimit="5000" overflowAction="Discard"><!-- err_file 配置 --><target xsi:type="File"fileName="logs/${shortdate}/ZJNErrorFile_${shortdate}.log"layout="${longdate}|${level:uppercase=true}|${message}${onexception:${newline}${exception:format=tostring}}${newline}"archiveEvery="Day"archiveNumbering="Rolling"archiveAboveSize="5242880"maxArchiveDays="7"keepFileOpen="false"concurrentWrites="true" /></target></targets><rules><logger name="*" minlevel="Debug"  writeTo="logfile" /><logger name="*" minlevel="Error"  writeTo="errfile" /></rules>
</nlog>

配置说明:

  • fileName 属性: 使用 ${shortdate} 占位符来按天生成文件夹和日志文件名。例如,logs/${shortdate}/Logfile_${shortdate}.log 将创建一个名为 logs/2024-08-03/ 的文件夹,并在其中创建 Logfile_2024-08-03.log 文件。

  • layout属性:日志内容输出的模板

  • archiveEvery="Day": 这表示每天生成一个新的日志文件。

  • archiveNumbering="Rolling": 日志文件归档使用滚动编号,避免创建大量的备份文件。

  • maxArchiveFiles="30": 指定最多保留 30 个归档文件。如果不设置或者maxArchiveFiles值等于0,则不删除旧文件。不设置默认值:0

  • keepFileOpen="false"concurrentWrites="true": 这些设置确保文件可以在多个进程中安全写入,同时不保持文件句柄打开。

  • archiveAboveSize=“5242880”: 文件归档大小尺寸,如果单文凭超过 5242880,则重新创建一个新的文件

  • maxArchiveDays="7": 保留日志归档文件最长期限。通过设置 ·maxArchiveDays·,可以实现自动管理日志文件的归档和清理,避免日志文件过多导致存储空间的浪费。

  1. 在代码中初始化 NLog
using NLog;class Program
{private static readonly ILogger Logger = LogManager.GetCurrentClassLogger();static void Main(string[] args){Logger.Info("Application started.");// 其他代码...}
}

或者创建一个共用的写日志静态类,需要输出日志的代码逻辑处,通过调用当前静态类即可。

public static class Logger
{private static readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();public static void Write(string message){try{if (logger.IsInfoEnabled) // 检查日志级别是否启用{logger.Info(message);}}catch (Exception ex){// 记录异常到日志中,避免掩盖潜在问题NLog.LogManager.GetLogger("ExceptionLogger").Error(ex, "Logging failed in Write method.");}}public static void WriteDebug(string message){try{if (logger.IsDebugEnabled) // 检查日志级别是否启用{logger.Debug(message);}}catch (Exception ex){// 记录异常到日志中,避免掩盖潜在问题NLog.LogManager.GetLogger("ExceptionLogger").Error(ex, "Logging failed in WriteDebug method.");}}public static void Write(Exception ex){try{logger.Error(ex);}catch (Exception innerEx){// 记录异常到日志中,避免掩盖潜在问题NLog.LogManager.GetLogger("ExceptionLogger").Error(innerEx, "Logging failed in Write(Exception ex) method.");}}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • springboot新农村综合展示平台-计算机毕业设计源码41793
  • 震惊!一男子深夜燥热难耐,竟然偷偷起身打开电脑并开始 学习c++入门基础(下)
  • 一个很变态却非常实用的发论文的新方向,【Transformer+目标检测】
  • 为什么有的地方笔记本经常连不上wifi,而手机可以?
  • Linux学习第56天:RGB转HDMI
  • Radiant Photo 1.4.1 AI智能完美照片修图插件支持PS ai beta
  • 珠海市举办“数智赋能产业转型与创新培训专场”活动
  • 【天机学堂】面试总结
  • 繁简之争:为什么手机芯片都是 ARM
  • 【Material-UI】Autocomplete 组件的局限性(Limitations)详解
  • [最短路SPFA]--启动!!!!!
  • 微信小程序开发优惠券制作源码
  • 分享一个基于人脸识别的小区物业管理系统Spring Boot(源码、调试、LW、开题、PPT)
  • Cocos Creator2D游戏开发(10)-飞机大战(8)-计分和结束
  • Oracle的RAC集群安装和配置 NFS 共享存储(NAS共享存储)
  • [译]CSS 居中(Center)方法大合集
  • Facebook AccountKit 接入的坑点
  • Making An Indicator With Pure CSS
  • mongodb--安装和初步使用教程
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • vue 个人积累(使用工具,组件)
  • 编写符合Python风格的对象
  • 给Prometheus造假数据的方法
  • 简单实现一个textarea自适应高度
  • 配置 PM2 实现代码自动发布
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 如何胜任知名企业的商业数据分析师?
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • Spring Batch JSON 支持
  • 我们雇佣了一只大猴子...
  • 移动端高清、多屏适配方案
  • ​力扣解法汇总946-验证栈序列
  • #《AI中文版》V3 第 1 章 概述
  • #include到底该写在哪
  • #pragma data_seg 共享数据区(转)
  • #window11设置系统变量#
  • #数据结构 笔记一
  • #微信小程序(布局、渲染层基础知识)
  • #微信小程序:微信小程序常见的配置传值
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (生成器)yield与(迭代器)generator
  • (一) 初入MySQL 【认识和部署】
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (一)认识微服务
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)VC++中ondraw在什么时候调用的
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .NET C# 操作Neo4j图数据库
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)