界面与控件 · 2025-11-24

只要三步!基于NLog实现日志追溯

大家好!我是付工。

前面跟大家介绍了如何实现实时日志。

超简单!C#上位机必备技能之实时日志

在工业级C#上位机开发中,项目部署后常面临不可复现的现场问题。此时,一份完善的日志记录就是救命稻草,让我们可以不用去现场就可以分析出故障原因,基本上我每个项目都会包含日志模块。

今天跟大家分享如何快速实现日志记录。

NLog日志组件

NLog是一个记录日志组件,和log4net一样被广泛使用,它可以将日志保存到文本文件、CSV、控制台、VS调试窗口、数据库等。一般情况下,我们使用保存到文本文件即可。

首先我们要安装一下Nuget组件,Nuget搜索NLog,如下图所示:

原文配图 1

NLog日志配置

1、我们需要为NLog创建一个xml配置文件,选择项目,添加新建项,选择XML文件,将文件名称命名为NLog.config,如下图所示:

原文配图 2

2、将配置文件属性中的复制到输出目录修改为始终复制或如果较新则复制,如下图所示:

原文配图 3

3、下面是我常用的配置文件,主要是输出到文本文件中,注释的代码是输出数据库或控制台,供大家参考使用:

<?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">
<targets>
<!-- write logs to file -->
<target name="infoLog" xsi:type="File"
fileName="${basedir}/logs/Info/${shortdate}.log"/>
<target name="debugLog" xsi:type="File"
fileName="${basedir}/logs/Debug/${shortdate}.log"/>
<!-- write log message to database -->
<!--<target name="db" xsi:type="AsyncWrapper" queueLimit="5000" overflowAction="Discard">
			<target type="Database" dbProvider="mssql" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=EFinance;Persist Security Info=True;User ID=sa;Password=123456;">
				<commandText>
					INSERT INTO Log(Timestamp,Level,Message,Action,Amount,StackTrace) VALUES(@time_stamp, @level, @message, @action, @amount, @stacktrace);
				</commandText>
				--> database connection parameters <!--
				<parameter name="@time_stamp" layout="${date}" />
				<parameter name="@level" layout="${level:uppercase=true}" />
				<parameter name="@message" layout="${message}" />
				<parameter name="@action" layout="${event-context:item=Action}" />
				<parameter name="@amount" layout="${event-context:item=Amount}" />
				<parameter name="@stacktrace" layout="${stacktrace}" />
			</target>
		</target>-->
<!--write log message to Visual Studio Output-->
<!--<target name="debugger" xsi:type="Debugger" layout="NLog: ${date:format=HH\:mm\:ss} | ${level:uppercase=true:padding=-5} | ${message}" />-->
</targets>
<rules>
<logger name="*" writeTo="infoLog" levels="Info"/>
<logger name="*" writeTo="debugLog" levels="Debug"/>
</rules>
</nlog>

4、第一次使用需要按照上面的步骤来做,后面其他项目可以直接复制NLog.dll和NLog.config两个文件到项目中,直接使用即可。

LogHelper封装

1、创建一个LogHelper类,主要是对NLog库进行二次封装,代码如下:

public class LogHelper
{
    private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
    public static void Debug(string msg, params object[] args)
    {
        logger.Debug(msg, args);
    }
    public static void Debug(string msg, Exception err)
    {
        logger.Debug(err, msg);
    }
    public static void Info(string msg, params object[] args)
    {
        logger.Info(msg, args);
    }
    public static void Info(string msg, Exception err)
    {
        logger.Info(err, msg);
    }
    public static void Warn(string msg, params object[] args)
    {
        logger.Warn(msg, args);
    }
    public static void Warn(string msg, Exception err)
    {
        logger.Warn(err, msg);
    }
    public static void Trace(string msg, params object[] args)
    {
        logger.Trace(msg, args);
    }
    public static void Trace(string msg, Exception err)
    {
        logger.Trace(err, msg);
    }
    public static void Error(string msg, params object[] args)
    {
        logger.Error(msg, args);
    }
    public static void Error(string msg, Exception err)
    {
        logger.Error(err, msg);
    }
}

2、调用非常简单,根据需要调用不同的方法即可:

private void btn_Info_Click(object sender, EventArgs e)
{
    LogHelper.Info("这是一条正常信息");
}
private void btn_Warn_Click(object sender, EventArgs e)
{
    LogHelper.Warn("这是一条警告信息");
}
private void btn_Error_Click(object sender, EventArgs e)
{
    LogHelper.Info("这是一条错误信息");
}

3、执行之后,我们通过文本文件就能查到对应的信息了。在项目根目录中会自动创建一个logs文件夹,logs文件夹中会按照日志等级,分别创建各自的文件夹。

原文配图 4

4、文件夹中会每天自动产生一个文件,文件内容如下所示:

原文配图 5

5、实际项目使用时,其实非常简单,直接将NLog.dll、NLog.config、LogHelper.cs复制到项目中,添加现有项和引用即可。

本文为原文文字快照,已收录 5 张技术配图;二维码与推广图未收录。
标签:#NLog #日志