NLog文章系列——入门教程(上)

YOLOv8模型轻量化实战:基于稀疏化剪枝与L1正则化的高效目标检测模型优化-附源码 本文提出一种YOLOv8轻量化方案,通过L1正则化稀疏化训练和动态阈值通道剪枝,在边缘计算场景中优化模型性能。方案分三步:首先通过L1正则诱导权重稀疏化并动态衰减系数;然后基于BN层权重统计进行通道剪枝,保留80%关键通道;最后对剪枝模型微调恢复精度。在COCO128数据集上验证,模型体积压缩40%,推理速度提升2.3倍,mAP仅下降0.4%,实现了精度与效率的平衡。该方案为移动端部署提供了可行的轻量化技术路径。 阅读详情

作者:Jarosław Kowalski <jaak@jkowalski.net>

翻译:Dflying Chen:http://dflying.cnblogs.com/

原文:http://www.nlog-project.org/tutorial.html

本文为《NLog文章系列》的第二篇,将用实例程序演示用NLog书写日志的方法。

 

应用程序跟踪介绍

很久以前,在那个没有调试器,软件也大都是基于控制台的年代里,开发者习惯于使用printf()语句输出跟踪调试信息。而现在,世界发生了翻天覆地般的变化——printf()被Console.WriteLine()代替了……

我们都曾经书写过类似如下的代码:

static void Main() 
{ 
    Console.WriteLine("SuperApp started."); 
    DoSomething();          
    Console.WriteLine("SuperApp finished."); 
}

上面这段代码中的Console.WriteLine() 就是所谓的“跟踪”语句,因为这个语句除了输出当前程序的执行状态之外,并没有什么其他用处。由Console.WriteLine() 的输出也叫做应用程序跟踪。在上面的例子中,这两条跟踪语句就用来告诉我们DoSomething()方法是否执行完毕。

在开发以及测试完成之后,我们可能会想要删除这些跟踪代码,以提高序执行效率(因为跟踪调试语句执行效率很低)。通常我们将这些跟踪语句注释掉,以便今后需要的时候可以方便地再次启用。可是不幸的是,将跟踪语句注释掉之后,我们还需要重新编译一遍程序。

或许有一天,在经历过第N次将无数的调试语句注释和取消注释之后,你会依稀感觉到这样并不是一个好的解决方案,并期待着这样的功能:

  1. 能够通过简单的方法控制显示哪些等级的跟踪信息(例如只显示警告和错误级别的跟踪信息,或是显示所有级别的跟踪信息等)。
  2. 将控制跟踪信息的显示与否的逻辑与应用程序的视线代码分开,跟踪信息的显示与否并不需要重新编译应用程序。
  3. 将跟踪信息写至文件、系统日志、消息队列……
  4. 能够将一些极为重要的信息通过Email发送给指定收信人,或是存放在数据库中。
  5. 更多你能想到的……

有些朋友可能觉得,在图形化调试器大行其道的当今软件开发环境中,这种书写日志的跟踪调试方式似乎用处非常有限。不过,当你的程序每一秒都被成千上万人同时访问,哪怕是停机一分钟都不能接受的时候,你就会知道这些调试信息对定位Bug来说意味着什么了(即所谓的“Live Site Debugging”)。

 

NLog是什么?

NLog((http://www.nlog-project.org)是一个基于.NET平台编写的类库,我们可以使用NLog在应用程序中添加极为完善的跟踪调试代码。NLog完全实现了我们上面的期望目标,并且还远远不止这些……

NLog允许我们自定义从跟踪消息的来源(source)到记录跟踪信息的目标(target)的规则(rules)。记录跟踪信息的目标(target)可以为如下几种形式:

  1. 文件
  2. 文本控制台
  3. Email
  4. 数据库
  5. 网络中的其它计算机(通过TCP或UDP)
  6. 基于MSMQ的消息队列
  7. Windows系统日志
  8. 其他形式,请参考http://www.nlog-project.org/targets.html

除此之外,每一条跟踪消息都可以自动带有上下文信息(contextual information),并将其发送给记录跟踪信息的目标。这些上下文信息可以包含如下内容:

  1. 当前的日期和时间(多种格式)
  2. 记录等级
  3. 来源名称
  4. 输出跟踪消息的方法的堆栈信息
  5. 环境变量的值
  6. 异常的详细信息
  7. 计算机、进程和线程名称
  8. 其他,请参考:http://www.nlog-project.org/layoutrenderers.html 

每条跟踪信息都包含一个记录等级(log level)信息,用来描述该条信息的重要性。NLog支持如下几种记录等级:

  1. Trace - 最常见的记录信息,一般用于普通输出
  2. Debug - 同样是记录信息,不过出现的频率要比Trace少一些,一般用来调试程序
  3. Info - 信息类型的消息
  4. Warn - 警告信息,一般用于比较重要的场合
  5. Error - 错误信息
  6. Fatal - 致命异常信息。一般来讲,发生致命异常之后程序将无法继续执行。

NLog是一个免费的、基于BSD license发布的开源类库。即使将其应用于商业使用中,也基本上不会有任何的限制。NLog的二进制可执行文件以及原文件均可在http://www.nlog-project.org/download.html页面中下载。我们同时还为NLog提供了图形界面的安装程序,您可以选择NLog的安装路径,并可在安装过程中添加如下内容到Visual Studio集成开发环境中(同样支持Express版本):

  1. 配置文件模板
  2. NLog配置文件智能感知支持
  3. 代码片断(code snippet)
  4. 集成至“Add Reference...”对话框

 

我们的第一个NLog应用程序

接下来让我们用Visual Studio 2005创建第一个使用NLog的应用程序。该示例程序将从把日志输出到控制台开始,并不断添加新的功能,以演示在NLog中对日志进行配置的方法。

首先在Visual Studio 2005中创建一个新项目(本示例程序将使用C#演示),然后在“Add New Item...”对话框中为该程序添加一个NLog配置文件。这里我们选择“Empty NLog Configuration File”,并命名为“NLog.config"”:

 

注意到NLog.dll的引用被自动添加到了我们的项目中。刚刚添加的NLog.config文件的内容如下,这也正是我们在本示例程序中将要配置的:

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
  <targets> 
  </targets> 
  <rules> 
  </rules> 
</nlog> 

接下来需要一个额外的步骤:设置该配置文件的“Copy To Output Directory”选项为“Copy always”。这样该配置文件将自动被部署到*.exe所在的目录下。这样以后,无需任何设置,NLog即可自动搜寻到并加载该配置文件。

 

接下来让我们配置一下日志的输出,在<targets />节中,添加一个新条目让日志输出到控制台中,并添加必要的输出布局(layout):

<targets> 
  <target name="console" xsi:type="Console" 
          layout="${longdate}|${level}|${message}"/> 
</targets> 

在输入上述代码时,可以看到Visual Studio的智能感知功能发挥了作用:输入xsi:之后,将得到当前可用的输出目标列表:

 

然后,我们要在<rules />节中添加必要的规则,将所有记录等级等于或高于Debug的信息输出至控制台。这段XML配置文件字解释能力足够强,无需多言:

<rules> 
  <logger name="*" minlevel="Debug" writeTo="console"/> 
</rules> 

若希望生成并输出诊断信息,我们还需要添加一个Logger对象。Logger对象的方法名和记录等级的名称一样(Debug()、Info()、Fatal()……)。Logger对象是通过LogManager对象创建的。建议Logger对象的名称和程序的类名保持一致。调用LogManager的GetCurrentClassLogger()方法即可自动为当前类创建一个Logger对象。

接下来开始修改Visual Studio自动生成的这个C#文件。首先在文件头部添加“using NLog”语句,引入NLog程序集的命名空间。然后添加创建Logger对象的代码,注意在这里我们可以使用随NLog的安装而添加的Visual Studio的代码片断:输入“nlogger”,然后按两次Tab键即可。

using System; 
using System.Collections.Generic; 
using System.Text; 
using NLog; 
 
namespace NLogExample 
{ 
    class Program 
    { 
        private static Logger logger = LogManager.GetCurrentClassLogger(); 
         
        static void Main(string[] args) 
        { 
            logger.Debug("Hello World!"); 
        } 
    } 
}

运行该程序,将看到一条日志信息输出到了控制台,该信息包含当前的时间,记录等级,以及“Hello World”消息。

最后,让我们总结一下实现该功能的步骤:

  1. 用LogManager.GetCurrentClassLogger(); 创建了一个Logger对象。该Logger对象代表与当前类相关联的日志消息的来源。
  2. 通过调用Logger对象的Debug()方法,发出一条Debug记录等级的诊断信息。
  3. 因为记录等级和消息来源符合配置文件中的<rules />声明,所以该消息将以指定的布局(layout)格式化后输出到控制台中。

 

稍微复杂一些的场景

接下来让我们将这些日志信息,包括其中的一些上下文信息(例如堆栈信息等),输出到文件和命令行两个地方。要实现这个需求,我们只要修改NLog的配置文件,并添加一个类型为“File”的目标即可。

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
  <targets> 
    <target name="console" xsi:type="ColoredConsole" 
            layout="${date:format=HH/:mm/:ss}|${level}|${stacktrace}|${message}"/> 
    <target name="file" xsi:type="File" fileName="${basedir}/file.txt" 
            layout="${stacktrace} ${message}"/> 
  </targets> 
  <rules> 
    <logger name="*" minlevel="Trace" writeTo="console,file"/> 
  </rules> 
</nlog> 

接下来这段C#代码生成了更多的日志信息,还使用了NLog提供的一些其他方法用来输出堆栈信息。

static void C() 
{ 
    logger.Info("Info CCC"); 
} 
static void B() 
{ 
    logger.Trace("Trace BBB"); 
    logger.Debug("Debug BBB"); 
    logger.Info("Info BBB"); 
    C(); 
    logger.Warn("Warn BBB"); 
    logger.Error("Error BBB"); 
    logger.Fatal("Fatal BBB"); 
} 
static void A() 
{ 
    logger.Trace("Trace AAA"); 
    logger.Debug("Debug AAA"); 
    logger.Info("Info AAA"); 
    B(); 
    logger.Warn("Warn AAA"); 
    logger.Error("Error AAA"); 
    logger.Fatal("Fatal AAA"); 
} 
static void Main(string[] args) 
{ 
    logger.Trace("This is a Trace message"); 
    logger.Debug("This is a Debug message"); 
    logger.Info("This is an Info message"); 
    A(); 
    logger.Warn("This is a Warn message"); 
    logger.Error("This is an Error message"); 
    logger.Fatal("This is a Fatal error message"); 
}

运行该程序,如下日志信息将被写入应用程序所在目录中的“file.txt”文件中。

Program.Main This is a Trace message 
Program.Main This is a Debug message 
Program.Main This is an Info message 
Program.Main => Program.A Trace AAA 
Program.Main => Program.A Debug AAA 
Program.Main => Program.A Info AAA 
Program.Main => Program.A => Program.B Trace BBB 
Program.Main => Program.A => Program.B Debug BBB 
Program.Main => Program.A => Program.B Info BBB 
Program.A => Program.B => Program.C Info CCC 
Program.Main => Program.A => Program.B Warn BBB 
Program.Main => Program.A => Program.B Error BBB 
Program.Main => Program.A => Program.B Fatal BBB 
Program.Main => Program.A Warn AAA 
Program.Main => Program.A Error AAA 
Program.Main => Program.A Fatal AAA 
Program.Main This is a Warn message 
Program.Main This is an Error message 
Program.Main This is a Fatal error message

同时,控制台中也输出了如下漂亮的日志信息。

 

再来修改一下配置文件——开发中一个很常见的需求就是让不同记录等级的日志输出到不同的目标中。例如,让记录等级等于或高于Info的信息输出至控制台,同时将任意记录等级的信息都存放在文件中保存。在NLog中,实现这个需求只要修改配置文件的<rules />节即可,无需修改应用程序。

<rules> 
  <logger name="*" minlevel="Info" writeTo="console"/> 
  <logger name="*" minlevel="Trace" writeTo="file"/> 
</rules> 

再次运行程序,可以看到Trace和Debug等级的信息只出现在了文件中,而并不显示在控制台中。

(待续……)

SAP SmartForms字体 :从OTF缓存溢出到完美解决 精准诊断:遇到错误,首先区分是图片过大还是字体嵌入导致。删除图片测试是最快的判别方法。字体上传规范始终从SE73入口上传用于表单打印的字体。强烈建议应用SAP Note 1301018,确保上传时勾选“不替换其他字体”,避免系统自动替换引发的意外问题。如需为同一字体族上传粗体、斜体等变体,请在SE73初始屏幕上勾选对应的属性框(如BOLD),然后分别上传对应的字体文件(如上传过程中,系统会提示输入RTF控制序列信息,这是确保打印预览正常显示的关键步骤,必须正确填写。方案选型快速止血:采用方案一( 阅读详情

相关推荐

告别连接难题:Windows 11下Multisim主数据库稳定运行终极配置指南

本文详细解析了Windows 11下Multisim 14.0主数据库连接失败的三大根源,并提供了四步终极解决方案,包括系统环境优化、软件权限配置、注册表修复和网络验证绕过技巧。通过实测数据对比,本方案显著提升了启动速度和稳定性,解决了电子仿真中的常见连接问题。

weixin_33738555的博客 435

.NET使用NLog记录日志信息(一)

应用程序跟踪介绍 很久以前,在那个没有调试器,软件也大都是基于控制台的年代里,开发者习惯于使用printf()语句输出跟踪调试信息。而现在,世界发生了翻天覆地般的变化——printf()被Console.WriteLine()代替了…… 我们都曾经书写过类似如下的代码: static void Main() { Console.WriteLine("SuperA...

Jason 的专栏 978

使用 arxiv-sanity 实时跟进自己研究领域的Paper

介绍 arxiv.org是一个非常大的预印本资源库,里面有大量的最新的论文,但缺点是浏览、搜索和排序不是很方便。这个资源库每天会更新大量的论文,如果通过手动搜索和浏览则效率很低,高引用的好文章难以及时的找到并阅读,造成时间的浪费。因此 使用 ...

John's Blogs 8280

.Net8 NLog安装与使用

1、安装Nlog包 1、1: NLog.Web.AspNetCore 1、2:NLog 2、在项目添加nlog.config文件 2.1、nlog.config <?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="http://www.nlog-project.org/schem...

873149745 2091

SAR成像系列:【9】合成孔径雷达(SAR)成像算法-波数域(omega-K)成像算法[也叫距离徙动(RM)算法](附Matlab代码)

合成孔径雷达(SAR)波数域(wK)成像算法也称为距离徙动(RM)算法,它不存在近似条件,可以对整个成像区域基于散射点模型进行精确聚焦。有的文章中称它为SAR成像的最佳实现。

zr2006_7的专栏 1万+

基于Xilinx的I2S Receiver IP核和I2S Transmitter IP核音频验证

基于Xilinx的I2S Receiver IP核和I2S Transmitter IP核音频验证 文章目录前言一、工程构架二、Xilinx IP的配置1.I2S Transmitter IP配置:2.I2S Receiver IP配置:3.WM8960的配置:总结 前言 本实验基于Xilinx ZU4EV平台,也适用于ZYNQ平台。音频验证完成,记录调过程。 ①Xilinx 音频IP只支持主模式,左对齐或右对齐方式,16bit或24bit字长。 ②WM8960器件作为从模式;24bit字长;数据传输格

weixin_45637597的博客 6815

.net8系列-图文并茂手把手教你使用Nlog记录.net日志

NLog是一个为.NET平台设计的灵活且免费的日志记录库。它适用于包括.NET Framework、.NET Core和.NET Standard在内的多种.NET环境。

tangdou369098655的博客 3924

告别Keil!用VSCode+PlatformIO玩转STC单片机(附自动下载配置)

本文详细介绍了如何从Keil迁移到VSCode+PlatformIO进行STC单片机开发,包括环境搭建、自动下载配置等实用技巧。通过对比传统IDE与现代工具链的差异,展示了VSCode+PlatformIO在代码编辑体验、跨平台支持和开发效率上的优势,帮助开发者实现更流畅的STC单片机开发流程。

weixin_27252001的博客 459

.NET性能优化-使用SourceGenerator-Logger记录日志

随着C#SourceGenerator的出现,编写高性能的日志记录API变得更加容易。使用SourceGenerator方法有几个主要好处允许保留日志记录结构,并启用消息模板所需的确切格式语法。允许为模板占位符提供替代名称,允许使用格式说明符。允许按原样传递所有原始数据,在对其进行处理之前,不需要进行任何复杂的存储(除了创建string)。提供特定于日志记录的诊断,针对重复的事件ID发出警告。与手动使用LoggerMessage.Define相比,还有一些好处。...

萌兔兔MMQ!! 370

STM32F407+HAL库+W5500实现TCP通讯 个人项目总结

推荐阅读此博客 cv即可成功首先需要一个可以进行串口调试的工程,方便进行调试。1.在W5500官网移植库文件重点是Ethernet这个文件夹将里面的 socket.c,socket.h,wizchip_conf.c,wizchip_conf.h,还有根据W5500文件夹里的w5500.c和w5500.h移植到自己的工程里面。然后再创建一个.c和.h文件 我的叫w5500_port_hal.c 和w5500_port_hal.h 记得将.h文件链接到工程里。

a234abr的博客 2251

RK3588 实战级 YOLOv5 Android 全解析:NPU 量化 + 多线程 + 跟踪算法,源码一次买齐

本文将带你完成一个完整的AI视觉项目:在搭载RK3588芯片的Android开发板上运行实时目标检测与跟踪应用。实战目标:成功运行官方YOLOV5摄像头实时检测案例技术深度:深入理解RKNN开发框架和源码实现核心技能:掌握NPU推理、多线程并发、目标跟踪等关键技术。

FJN110的博客 157

ASP.NET 8 日志处理之NLog

日志处理之NLog

医药/LIMS实验室IT · Office自动化 · .NET+Vue全栈 · 鸿蒙实战 · 欢迎技术交流 1249

Linux----Ubuntu系统官网下载iso镜像文件

Linux----Ubuntu系统官网下载iso镜像文件

MQ0522的博客 5万+

NLog文章系列——入门教程(下)

作者:Jarosław Kowalski <jaak@jkowalski.net> 翻译:Dflying Chen:http://dflying.cnblogs.com/ 原文:http://www.nlog-project.org/tutorial.html 本文为《NLog文章系列》的第四篇,即入门教程的最后一篇。将继续描述演示用NLog书写日志的方法。 自动...

weixin_30363981的博客 181

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

NLog文章系列——入门教程(中)

  作者:Jarosław Kowalski &lt;jaak@jkowalski.net&gt; 翻译:Dflying Chen:http://dflying.cnblogs.com/ 原文:http://www.nlog-project.org/tutorial.html 本文为《NLog文章系列》的第三篇,将继续描述演示用NLog书写日志的方法。本想今天就能搞定整个入门教程,无奈时...

weixin_34199405的博客 104

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

NLog文章系列——入门教程(转)

作者:Jarosław Kowalski &lt;jaak@jkowalski.net&gt; 翻译:Dflying Chen:http://dflying.cnblogs.com/ 原文:http://www.nlog-project.org/tutorial.html 本文为《NLog文章系列》的第二篇,将用实例程序演示用NLog书写日志的方法。   应用程序跟踪介绍 很久...

weixin_34001430的博客 114

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

NLog文章系列——如何配置NLog

作者:Jarosław Kowalski <jaak@jkowalski.net> 翻译:CrazyCoder(由衷感谢他的热心!!) 原文:http://www.nlog-project.org/config.html 更多关于NLog的中文文章,请参考《NLog文章系列》。 NLog支持以多种不同方式配置,目前同时支持直接编程和使用配置文件两种方法。本文...

weixin_30729609的博客 636

NLog文章系列——系列文章目录以及简要介绍

早晨看到TerryLee的文章《.NET开源项目介绍及资源推荐:日志记录》,其中说到NLog这个同样开源且非常不错的日志记录工具却没什么中文资料。在TerryLee介绍前,我也不知道NLog这个东西,于是就随便尝试了一下。 简单使用了一下之后,觉得NLog真的非常不错。如此漂亮的类库却没有中文资料,似乎有些可惜,于是尝试联系其作者Jaroslaw Kowalski请求翻译NLog网站中的一部分内...

weixin_33962621的博客 208

NLog文章系列——如何排错

作者:Jarosław Kowalski &lt;jaak@jkowalski.net&gt; 翻译:CrazyCoder(由衷感谢他的热心!!) 原文:http://www.nlog-project.org/howto_troubleshoot.html 更多关于NLog的中文文章,请参考《NLog文章系列》。   Nlog – 如何排错 当NLog不能正常工作时,需要输出一些调试信息来判断到底...

weixin_34006965的博客 167
上一篇: NLog文章系列——系列文章目录以及简要介绍
下一篇: NLog文章系列——入门教程(中)
ning0123456
博客等级 码龄20年 12粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值