NLOG的使用

article/2025/10/11 17:23:42

目录

Tartget Properties

header

archiveFileName

archiveNumbering

 maxArchiveFiles

keepFileOpen

archiveOldFileOnStartup

rules

 加载配置文件

rules 的使用


最近在学习GRBL-PLOTTER代码,其日志系统用的是NLOG,将一些内容进行总结;

Config | NLog (nlog-project.org)

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"><variable name="basedir" value="${specialfolder:folder=CommonApplicationData}/GRBL-Plotter" />    <!-- default, optional --><targets><target name="file" xsi:type="File"layout="${longdate} | ${pad:padding=-5:inner=${level}} | ${pad:padding=-30:inner=${logger}} | ${message}${exception:format=ToString}" header="----- Possible levels: Trace, Debug, Info, Warn, Error, Fatal ----|&#xD;&#xA;"fileName="${var:basedir}/logfile.txt"archiveFileName="${var:basedir}/log_{#}.txt"keepFileOpen="true"maxArchiveFiles="20"encoding="utf-8" archiveNumbering="DateAndSequence"archiveOldFileOnStartup="true"/><target name="file2" xsi:type="File"layout="${message}${exception:format=ToString}" fileName="${var:basedir}/logpos.nc"keepFileOpen="false"encoding="utf-8" archiveNumbering="Rolling"archiveOldFileOnStartup="true"maxArchiveFiles="3"/></targets><rules><logger name="*" minlevel="Info" writeTo="file" /><logger name="LogPos" minlevel="Trace" writeTo="file2" /></rules>
</nlog>

在编写配置文件时,主要配置Targets,Layout和Layout renderers三项

The following types can be configured:

  • Targets - the destinations of a logevent, e.g. file, database, console
  • Layout - the layout e.g. json, csv, plain-text (default)
  • Layout renderers - the template markers, e.g. ${message}, ${exception}, ${date}

Targets是日志的目标系统,可以数据库、控制台,也可以是文件

Layout是日志内容的格式,利用Layout renderers来进行格式化

layout="${longdate} | ${pad:padding=-5:inner=${level}} | ${pad:padding=-30:inner=${logger}} | ${message}${exception:format=ToString}" 

如上述格式配置,形成的日志信息如下所示

2022-08-16 14:08:00.4998 | Info  | GrblPlotter.MainForm           | GetAppDataPath from Default: C:\Users\Thinkpad\Desktop\GRBL-Plotter-master\GRBL-Plotter-master\GRBL-Plotter\bin\x86\Debug

关于renderers的格式说明,参考renderers说明

Tartget Properties

参考:NLog属性

header是日志文件的标题

archiveFileName

归档的文件名,该文件名包括路径;如下所示,在进行归档时,将日志文件改名为log_{#}.txt进行保存;该属性与archiveOldFileOnStartup选项一起使用;表明在软件打开时,将上一次的日志文件进行归档,新的文件清空,重新记录

archiveFileName="${var:basedir}/log_{#}.txt"

其它选项暂时没有找到说明

archiveNumbering

日志文件归档时文件名格式,有以下四个选项;示例中使用到的DateAndSepuence,是用日期和序事情

Member name    Value	Description
Sequence        0	    Sequence style numbering. The most recent archive has the highest number.
Rolling	        1	    Rolling style numbering (the most recent is always #0 then #1, ..., #N.
Date	        2	    Date style numbering. Archives will be stamped with the prior period (Year, Month, Day, Hour, Minute) datetime.
DateAndSequence	3	    Date and sequence style numbering. Archives will be stamped with the prior period (Year, Month, Day) datetime. The most recent archive has the highest number (in combination with the date).

使用该DateAndSequence选项时,日志文件的存档内容如下图所示

 maxArchiveFiles

读取和设置最大存档的文件数

keepFileOpen

设置在每次录前后是否关闭和打开日志文件,还是一直保持日志文件处于打开状态

archiveOldFileOnStartup

为TRUE时,表示是在启动时,归档旧的日志文件

rules

<rules><logger name="*" minlevel="Warn" writeTo="target1,target2,target3" />
</rules>

上述 rules 生成的规则是满足所有 LOGGER 设备的,在信息的消息等级在 warn 以上时,就把日志信息写入 target1\target2 和 target3 设备中。

<rules><logger name="*" minlevel="Warn" writeTo="target1" /><logger name="*" levels="Debug,Warn,Info" writeTo="target2" />
</rules>

也可以指定具肯体的日志级别到指定的记录设备上。上述 rules 中,第二条定义将 debug\warn\info 三个级别的信息写到 target2 设备中。

 可以为 rules 设定 filter,如下

<rules><logger name="*" minlevel="Info" writeTo="target1"><filters defaultAction='Log'><when condition="contains('${message}','Common')" action="Ignore" /></filters></logger>
</rules>

且日志规则可以嵌套,如下所示

<rules><logger name="*" minlevel="Info" writeTo="target1"><logger name="*" minlevel="Warn" writeTo="target2" /></logger>
</rules>

 上述规则的意义是,如果某个日志信息的 warn, 就会将这条信息写到 target1 和 target2 中;如果某个信息的级别 info 的话,就只写到 target1 中

 加载配置文件

LogManager.Configuration = new XmlLoggingConfiguration("NLog.config");

rules 的使用

在使用 NLog 时,需要首先获得一个日志实例,如下

var commonLogger = LogManager.GetLogger("Common");

这时,NLog 会根据名名(Common)从缓存取得或者重新创造一个新的 logger;在创建时,遍历 rules 中的所有 logger 信息,找到对应的名称的 logger,再按照定义好的规则进行创建。

<rules><logger name="*" minlevel="Info" writeTo="target1"><filters defaultAction='Log'><when condition="contains('${message}','Common')" action="Ignore" /></filters></logger>
</rules>

 上述 rules 定义的 logger 带有过滤条件;

在使用时,NLog 会计算 condition 的结果,如果结果为 TRUE,则执行 action 后的操作;为 FALSE 的话,返回 Neutral,即不执行任何操作,进行以后条件的判断;如果没有后续条件了,就执行 defaultAction 操作;

 条件语句返回的结构是 FilterResult 类型,如下;具体返回值,NLog 采取的操作如下代码段的注释所示。

    public enum FilterResult{/// <summary>/// The filter doesn't want to decide whether to log or discard the message./// </summary>Neutral, /// <summary>/// The message should be logged./// </summary>Log, /// <summary>/// The message should not be logged./// </summary>Ignore, /// <summary>/// The message should be logged and processing should be finished./// </summary>LogFinal, /// <summary>/// The message should not be logged and processing should be finished./// </summary>IgnoreFinal, }


http://chatgpt.dhexx.cn/article/bwnhJQBU.shtml

相关文章

NLog日志的使用

文章目录 1.NuGet安装NLog2.添加Nlog.config文件(新建项 --> 应用程序配置文件)3.数据库建表4.代码使用 1.NuGet安装NLog 2.添加Nlog.config文件(新建项 --> 应用程序配置文件) 注意文件属性 → 复制到输出目录 一定要选择始终复制&#xff0c;否则无法输出日志&#xf…

【ns-3】Logging系统

文章目录 前言1. 概述2. 基本概念2.1 日志组件2.2 日志详细程度&#xff08;严重程度&#xff09;选项2.3 日志前缀选项 3. 控制日志输出参考文献 前言 本篇介绍Logging系统。 1. 概述 许多大型系统都会提供一种基于控制台的消息记录功能&#xff0c;用来向用户即时地反馈程序…

Nlog详解

Nlog详解 零、文章目录 一、Nlog详解 1、概述 NLog是一个基于.NET平台编写的日志记录类库&#xff0c;我们可以使用NLog在应用程序中添加极为完善的跟踪调试代码。可以在任何一种.NET语言中输出带有上下文的&#xff08;contextual information&#xff09;调试诊断信息&am…

iOS之深入解析NSLog的调试技巧

一、DEBUG 宏区分调试模式和发布模式进行特殊处理 ① 利用 Configuration 配置不同的编译环境 一个应用往往对应多个域名的情况&#xff0c;测试地址、生产地址、后台接口开发者的个人主机地址&#xff1a; 1.开发人员环境&#xff08;Other&#xff09;连接写服务人的电脑&…

TDD(测试驱动开发)死了吗?

01、前言 很早之前&#xff0c;曾在网络上见到过 TDD 这 3 个大写的英文字母&#xff0c;它是 Test Driven Development 这三个单词的缩写&#xff0c;也就是“测试驱动开发”的意思——听起来很不错的一种理念。 其理念主要是确保两件事&#xff1a; 确保所有的需求都能被照…

unitTest+Ddt数据驱动测试

我们设计测试用例时&#xff0c;会出现测试步骤一样&#xff0c;只是其中的测试数据有变化的情况&#xff0c;比如测试登录时的账号密码。这个时候&#xff0c;如果我们依然使用一条case一个方法的话&#xff0c;会出现大量的代码冗余&#xff0c;而且效率也会大大降低。此时&a…

测试驱动开发(TDD)的理论基础

在开始理论介绍之前&#xff0c;先思考一个问题&#xff1a;软件开发中最重要的是什么&#xff1f; 可能有的小伙伴就会说&#xff1a;良好的数据库设计&#xff0c;一个健壮可扩展的架构&#xff0c;规范的编码风格&#xff0c;设计文档等。没错这些在开发中都很重要&#xf…

什么时候应该编写单元测试?什么是TDD?

一、传统方法与TDD方法 1、有人认为软件编码完成后编写单元测试&#xff08;传统方法&#xff09;&#xff0c;流程如下&#xff1a; 缺点&#xff1a;编写完功能代码再写单元测试会导致单元测试“粒度”比较粗。对同样的功能代码&#xff0c;如果采用TDD方案&#xff0c;结果…

前端做自动化测试 —— 用TDD的思想做组件测试

Test-Driven Development(测试驱动开发,以下简述TDD)是一种设计方法论, 原理是在开发功能代码之前, 先编写单元测试用例代码, 通过测试来推动整个开发的进行. 本文详细描述了在创作 react-stillness-component, 组件的过程中, 是如何学习 TDD 的思想来完成功能开发以及测试的 一…

深度解读 - TDD(测试驱动开发)

本文结构&#xff1a; 什么是 TDD为什么要 TDD怎么 TDDFAQ学习路径延伸阅读 什么是 TDD TDD 有广义和狭义之分&#xff0c;常说的是狭义的 TDD&#xff0c;也就是 UTDD&#xff08;Unit Test Driven Development&#xff09;。广义的 TDD 是 ATDD&#xff08;Acceptance Tes…

【TDD】测试驱动开发

欢迎关注微信公众号“Python小灶&#xff0c;和我一起每天学习Python新知识”&#xff0c;还可添加博主Vx&#xff1a;yf03064131&#xff0c;方便一起交流学习。 或者B站搜索 有只小新 原视频地址链接&#xff1a;点击这里 代码地址&#xff1a;点击这里 本文为大致翻译以及…

测试驱动开发(TDD)的学习使用

测试驱动开发TDD 是一种不同于传统软件开发流程的新型开发方式 特点&#xff1a; 先编写测试代码 – 实现主要逻辑 再写功能代码 – 实现细节 通过测试来推动整个开发的进行。 有助于编写简洁可用和高质量的代码&#xff0c;并加速开发过程呢。 比如写一个Person类&#xff0c;…

从 TDD 到测试策略

“ 前端没法 TDD / 前端不容易做 TDD / 前端 TDD 收益不大 ” 这是进公司后无数人给我判的“死刑”。 事实上好像的确如此&#xff1f; 在这个崇尚敏捷的组织里&#xff0c;我们有毕业生的入职前培训&#xff0c;入职后培训&#xff0c;有 TwU&#xff0c;有无数定期不定期的…

使用ddt执行数据驱动测试

所谓数据驱动测试&#xff0c;简单的理解为数据的改变从而驱动自动化测试的执行&#xff0c;最终引起测试结果的改变。通过使用数据驱动测试的方法&#xff0c;可以在需要验证多组数据测试场景中&#xff0c;使用外部数据源实现对输入输出与期望值的参数化&#xff0c;避免在测…

先测试再开发?TDD测试驱动开发了解一下?

1、什么是TDD 我第一次接触TDD这个概念&#xff0c;是在<<代码整洁之道>>中&#xff0c;作者鲍勃大叔在书中&#xff0c;写了一些关于测试代码的代码规范&#xff0c;其实就提到了有关TDD三定律: - 定律一&#xff1a; 在编写不能通过的单元测试前&#xff0c;不…

测试驱动开发(TDD)前端篇

当你在写生产代码时&#xff0c;你处在高认知的状态&#xff08;obvious&#xff09;&#xff0c;你的研发流程和你的工程实践&#xff0c;有助于你一步一步的提升你的认知能力&#xff0c;把你的问题进行一个降解&#xff08;分解&#xff09;&#xff0c;只要你做到同样的事情…

TDD 开发测试

测试驱动开发(Test-Driven Development)。是敏捷开发中的一项核心实践和技术。 TDD是在开发功能代码之前&#xff0c;先编写单元测试用例代码&#xff0c;测试代码确定需要编写什么产品代码。 变红 ——> 变绿 ——> 重构 在进行 TDD 案例编写的时候&#xff0c;看一…

TDD测试驱动开发

TDD测试驱动开发 什么是测试驱动开发测试驱动开发该怎么做&#xff1f;需求一&#xff1a;输入一个非元音字符&#xff0c;并预期返回字符本身 (输入"h" 返回“h”)需求二&#xff1a;输入一个元音&#xff08;a,e,i,o,u&#xff09;&#xff0c;返回 mommy (输入&qu…

TDD测试驱动学习

gtest 和 gmock 安装 //如果不知道对应库名字可以执行这个命令查找对应库,如果没找到要去跟新对应的源sudo apt update sudo apt-cache search gtest sudo apt-cache search gmock 测试例子 #include <string> using std::string;// 定义 Soundex 类 class Soundex {pub…

TDD (test driver development)测试驱动开发

##为什么需要测试驱动/或者说需要单元测试 我们工作接触的软件项目&#xff0c;不是学生时代&#xff0c;玩一玩就不管了&#xff0c;工作的项目&#xff0c;需要长期维护&#xff0c;并且随着时间的推移需要增加新的需求&#xff0c;进行修改&#xff0c;优化。此时已经距离你…