维嘉 發表於 2025-4-14 15:35:00

使用C#代码配置NLog Asp.Net Core

<p>在Asp.Net Core项目中,日志记录是至关重要的一环,它能帮助我们在开发和生产环境中快速定位问题。NLog是一个功能强大且灵活的日志记录框架,在Asp.Net Core项目中广泛应用。通常,我们可以通过配置文件来设置NLog,但有时,使用代码进行配置能带来更多的灵活性和动态性。本文将详细介绍如何在Asp.Net Core项目中使用C#代码配置NLog。</p>
<h2 id="一为什么使用代码配置nlog">一、为什么使用代码配置NLog</h2>
<ol>
<li><strong>动态性</strong>:通过代码配置,我们可以在运行时根据不同的条件(例如环境变量、用户配置等)动态地调整日志记录的行为。比如,在开发环境中,我们可能希望记录更详细的日志,而在生产环境中则只记录关键信息。</li>
<li><strong>简化部署</strong>:无需担心配置文件在部署过程中丢失或配置错误。所有的日志配置逻辑都包含在代码中,随着项目一同部署,减少了因配置文件问题导致的部署失败。</li>
<li><strong>更好的集成</strong>:代码配置能更好地与项目的其他部分集成,例如可以与依赖注入系统紧密结合,方便管理日志记录器的生命周期和作用域。</li>
</ol>
<h2 id="二配置步骤">二、配置步骤</h2>
<h3 id="一引入nlog相关包">(一)引入NLog相关包</h3>
<p>首先,在项目中引入NLog和NLog.Web.AspNetCore包。可以通过NuGet包管理器控制台执行以下命令:</p>
<pre><code>Install - Package NLog
Install - Package NLog.Web.AspNetCore
</code></pre>
<p>这两个包分别提供了NLog的核心功能和对Asp.Net Core的支持。</p>
<h3 id="二创建日志帮助类">(二)创建日志帮助类</h3>
<p>在项目中创建一个静态类,例如<code>LogHelp</code>,用于初始化和管理NLog配置。以下是一个示例代码:</p>
<pre><code class="language-csharp">public static class LogHelp
{
    static LogHelp()
    {
      // 初始化NLog配置 使用代码配置
      InitializeNLog();
    }
    public static LoggingConfiguration InitializeNLog()
    {
      // 创建日志配置对象
      var config = new LoggingConfiguration();

      // 配置文件目标
      var fileTarget = new FileTarget("ownFile-web")
      {
            FileName = "${basedir}/Logs/allLog-${shortdate}.log",
            Layout = "${newline}=======================================================================${newline}时间: [${date:format=yyyy-MM-dd HH:mm:ss}]" +
                     "${newline}类名: [${logger:shortName=true}]" +
                     "${newline}级别: [${uppercase:${level}}]" +
                     "${newline}消息: [${message}]" +
                     "${newline}异常: [${exception}]"
      };

      // 配置错误文件目标
      var errorFileTarget = new FileTarget("errorFile")
      {
            FileName = "${basedir}/Logs/ErrorLog/errorLog-${shortdate}.log",
            Layout = fileTarget.Layout
      };

      // 配置数据库目标
      var dbTarget = new DatabaseTarget("database")
      {
            ConnectionString = ConfigHelp.ConnectionString,
            CommandText = "insert into LogEntity (MachineName, Logged, Level, Message, Logger, Callsite, Exception) values (@MachineName, @Logged, @Level, @Message, @Logger, @Callsite, @Exception);",
      };
      switch (ConfigHelp.DbType)
      {
            case DbType.MySql:
                dbTarget.DBProvider = typeof(MySql.Data.MySqlClient.MySqlConnection).AssemblyQualifiedName;
                break;
            case DbType.SqlServer:
                dbTarget.DBProvider = typeof(Microsoft.Data.SqlClient.SqlConnection).AssemblyQualifiedName;
                break;
            case DbType.Sqlite:
                dbTarget.DBProvider = typeof(Microsoft.Data.Sqlite.SqliteConnection).AssemblyQualifiedName;
                break;
            case DbType.Kdbndp:
                dbTarget.DBProvider = typeof(Kdbndp.KdbndpConnection).AssemblyQualifiedName;
                break;
            default:
                throw new Exception($"日志组件不支持{ConfigHelp.DbTypeStr}数据库");
      }
      dbTarget.Parameters.Add(new DatabaseParameterInfo("@MachineName", "${machinename}"));
      dbTarget.Parameters.Add(new DatabaseParameterInfo("@Logged", "${date}"));
      dbTarget.Parameters.Add(new DatabaseParameterInfo("@Level", "${level}"));
      dbTarget.Parameters.Add(new DatabaseParameterInfo("@Message", "${message}"));
      dbTarget.Parameters.Add(new DatabaseParameterInfo("@Logger", "${logger}"));
      dbTarget.Parameters.Add(new DatabaseParameterInfo("@Callsite", "${callsite}"));
      dbTarget.Parameters.Add(new DatabaseParameterInfo("@Exception", "${exception:tostring}"));

      // 将目标添加到配置中
      config.AddTarget(fileTarget);
      config.AddTarget(errorFileTarget);
      config.AddTarget(dbTarget);

      // 配置日志规则
      config.LoggingRules.Add(new LoggingRule("Microsoft.*", NLog.LogLevel.Trace, fileTarget) { Final = true });
      config.LoggingRules.Add(new LoggingRule("*", NLog.LogLevel.Trace, fileTarget));
      config.LoggingRules.Add(new LoggingRule("*", NLog.LogLevel.Error, errorFileTarget));
      config.LoggingRules.Add(new LoggingRule("*", NLog.LogLevel.Trace, dbTarget));

      // 应用配置
      LogManager.Configuration = config;
      return config;
    }
    private static Logger logger = LogManager.GetCurrentClassLogger();
    public static void Info(string message)
    {
      Log(LogLevel.Info, message);
    }

    public static void Error(string message)
    {
      Log(LogLevel.Error, message);
    }

    public static void Error(Exception ex)
    {
      Log(LogLevel.Error, ex.Message, ex);
    }

    public static void LogError(string message, Exception? ex)
    {
      Log(LogLevel.Error, message, ex);
    }

    public static void Debug(string message)
    {
      Log(LogLevel.Debug, message);
    }

    public static void Warn(string message)
    {
      Log(LogLevel.Warn, message);
    }

    public static void Trace(string message)
    {
      Log(LogLevel.Trace, message);
    }

    private static void Log(LogLevel level, string message, Exception? ex = null)
    {
      try
      {
            if (ex != null)
                logger.Log(level, ex, message);
            else
                logger.Log(level, message);
      }
      catch (Exception e)
      {
            Console.WriteLine("记录日志失败:" + e.Message);
      }
    }
}
</code></pre>
<ol>
<li><strong>初始化部分</strong>:在<code>LogHelp</code>类的静态构造函数中,调用<code>InitializeNLog</code>方法来初始化NLog配置。</li>
<li><strong><code>InitializeNLog</code>方法</strong>:
<ul>
<li><strong>创建配置对象</strong>:首先创建一个<code>LoggingConfiguration</code>对象,它是NLog配置的核心。</li>
<li><strong>配置文件目标</strong>:
<ul>
<li>创建<code>FileTarget</code>对象<code>fileTarget</code>,用于将日志记录到文件中。<code>FileName</code>属性指定了日志文件的路径和命名规则,这里使用了NLog的变量<code>${basedir}</code>表示项目的基目录,<code>${shortdate}</code>表示短日期格式。</li>
<li><code>Layout</code>属性定义了日志记录的格式,包括时间、类名、日志级别、消息和异常信息等。</li>
</ul>
</li>
<li><strong>配置错误文件目标</strong>:创建另一个<code>FileTarget</code>对象<code>errorFileTarget</code>,专门用于记录错误日志。它的<code>FileName</code>指向错误日志文件的路径,<code>Layout</code>与普通日志文件相同。</li>
<li><strong>配置数据库目标</strong>:
<ul>
<li>创建<code>DatabaseTarget</code>对象<code>dbTarget</code>,用于将日志记录到数据库中。<code>ConnectionString</code>属性设置数据库连接字符串,<code>CommandText</code>属性定义了插入日志数据到数据库表的SQL语句。</li>
<li>通过<code>switch</code>语句根据<code>ConfigHelp.DbType</code>的值设置<code>DBProvider</code>属性,以支持不同类型的数据库,如MySQL、SqlServer、Sqlite和Kdbndp。</li>
<li>使用<code>Parameters</code>属性添加SQL语句中的参数,这些参数对应日志记录中的各个字段。</li>
</ul>
</li>
<li><strong>添加目标到配置</strong>:使用<code>config.AddTarget</code>方法将文件目标和数据库目标添加到配置中。</li>
<li><strong>配置日志规则</strong>:
<ul>
<li>使用<code>LoggingRules</code>属性添加多个日志规则。例如,<code>config.LoggingRules.Add(new LoggingRule("Microsoft.*", NLog.LogLevel.Trace, fileTarget) { Final = true });</code>这条规则表示对于所有以“Microsoft.”开头的日志记录器,记录所有级别的日志到<code>fileTarget</code>,并且设置<code>Final = true</code>表示这是一个最终规则,不再继续匹配其他规则。</li>
<li>类似地,其他规则分别定义了对于所有日志记录器的不同级别日志的记录目标。</li>
</ul>
</li>
<li><strong>应用配置</strong>:最后,将配置对象应用到<code>LogManager.Configuration</code>中,使配置生效。</li>
</ul>
</li>
<li><strong>日志记录方法</strong>:类中还提供了一系列静态方法,如<code>Info</code>、<code>Error</code>、<code>Debug</code>等,用于方便地记录不同级别的日志。这些方法最终都调用<code>Log</code>方法,在<code>Log</code>方法中,根据是否有异常信息,调用<code>logger.Log</code>方法进行实际的日志记录,并在记录失败时捕获异常并输出到控制台。</li>
</ol>
<h3 id="三在项目中使用配置">(三)在项目中使用配置</h3>
<p>在Asp.Net Core项目的<code>Program.cs</code>文件中,添加以下代码来使用我们配置好的NLog:</p>
<pre><code class="language-csharp">builder.Logging.AddNLog(LogHelp.InitializeNLog());
</code></pre>
<p>这里通过<code>builder.Logging.AddNLog</code>方法将我们在<code>LogHelp</code>类中初始化的NLog配置应用到项目的日志系统中。</p>
<h2 id="三总结">三、总结</h2>
<p>通过以上步骤,我们成功地在Asp.Net Core项目中使用C#代码配置了NLog。这种方式不仅让我们能够灵活地定制日志记录行为,还提高了项目的可维护性和部署的便利性。在实际项目中,可以根据具体需求进一步优化日志配置,例如添加更多的日志目标(如邮件、控制台等),调整日志级别和格式,以满足不同场景下的日志记录需求。希望本文能帮助你在Asp.Net Core项目中更好地利用NLog进行日志管理。</p><br><br>
来源:https://www.cnblogs.com/cyfj/p/18824994
頁: [1]
查看完整版本: 使用C#代码配置NLog Asp.Net Core