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

打印 上一主题 下一主题

主题 1759|帖子 1759|积分 5277

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在Asp.Net Core项目中,日记记录是至关紧张的一环,它能帮助我们在开辟和生产环境中快速定位题目。NLog是一个功能强大且灵活的日记记录框架,在Asp.Net Core项目中广泛应用。通常,我们可以通过配置文件来设置NLog,但有时,使用代码进行配置能带来更多的灵活性和动态性。本文将具体先容如何在Asp.Net Core项目中使用C#代码配置NLog。
一、为什么使用代码配置NLog


  • 动态性:通过代码配置,我们可以在运行时根据不同的条件(例如环境变量、用户配置等)动态地调整日记记录的行为。比如,在开辟环境中,我们可能希望记录更具体的日记,而在生产环境中则只记录关键信息。
  • 简化摆设:无需担心配置文件在摆设过程中丢失或配置错误。所有的日记配置逻辑都包含在代码中,随着项目一同摆设,减少了因配置文件题目导致的摆设失败。
  • 更好的集成:代码配置能更好地与项目的其他部分集成,例如可以与依赖注入体系精密结合,方便管理日记记录器的生命周期和作用域。
二、配置步骤

(一)引入NLog相关包

首先,在项目中引入NLog和NLog.Web.AspNetCore包。可以通过NuGet包管理器控制台执行以下命令:
  1. Install - Package NLog
  2. Install - Package NLog.Web.AspNetCore
复制代码
这两个包分别提供了NLog的核心功能和对Asp.Net Core的支持。
(二)创建日记帮助类

在项目中创建一个静态类,例如LogHelp,用于初始化和管理NLog配置。以下是一个示例代码:
  1. public static class LogHelp
  2. {
  3.     static LogHelp()
  4.     {
  5.         // 初始化NLog配置 使用代码配置
  6.         InitializeNLog();
  7.     }
  8.     public static LoggingConfiguration InitializeNLog()
  9.     {
  10.         // 创建日志配置对象
  11.         var config = new LoggingConfiguration();
  12.         // 配置文件目标
  13.         var fileTarget = new FileTarget("ownFile-web")
  14.         {
  15.             FileName = "${basedir}/Logs/allLog-${shortdate}.log",
  16.             Layout = "${newline}=======================================================================${newline}时间: [${date:format=yyyy-MM-dd HH:mm:ss}]" +
  17.                      "${newline}类名: [${logger:shortName=true}]" +
  18.                      "${newline}级别: [${uppercase:${level}}]" +
  19.                      "${newline}消息: [${message}]" +
  20.                      "${newline}异常: [${exception}]"
  21.         };
  22.         // 配置错误文件目标
  23.         var errorFileTarget = new FileTarget("errorFile")
  24.         {
  25.             FileName = "${basedir}/Logs/ErrorLog/errorLog-${shortdate}.log",
  26.             Layout = fileTarget.Layout
  27.         };
  28.         // 配置数据库目标
  29.         var dbTarget = new DatabaseTarget("database")
  30.         {
  31.             ConnectionString = ConfigHelp.ConnectionString,
  32.             CommandText = "insert into LogEntity (MachineName, Logged, Level, Message, Logger, Callsite, Exception) values (@MachineName, @Logged, @Level, @Message, @Logger, @Callsite, @Exception);",
  33.         };
  34.         switch (ConfigHelp.DbType)
  35.         {
  36.             case DbType.MySql:
  37.                 dbTarget.DBProvider = typeof(MySql.Data.MySqlClient.MySqlConnection).AssemblyQualifiedName;
  38.                 break;
  39.             case DbType.SqlServer:
  40.                 dbTarget.DBProvider = typeof(Microsoft.Data.SqlClient.SqlConnection).AssemblyQualifiedName;
  41.                 break;
  42.             case DbType.Sqlite:
  43.                 dbTarget.DBProvider = typeof(Microsoft.Data.Sqlite.SqliteConnection).AssemblyQualifiedName;
  44.                 break;
  45.             case DbType.Kdbndp:
  46.                 dbTarget.DBProvider = typeof(Kdbndp.KdbndpConnection).AssemblyQualifiedName;
  47.                 break;
  48.             default:
  49.                 throw new Exception($"日志组件不支持{ConfigHelp.DbTypeStr}数据库");
  50.         }
  51.         dbTarget.Parameters.Add(new DatabaseParameterInfo("@MachineName", "${machinename}"));
  52.         dbTarget.Parameters.Add(new DatabaseParameterInfo("@Logged", "${date}"));
  53.         dbTarget.Parameters.Add(new DatabaseParameterInfo("@Level", "${level}"));
  54.         dbTarget.Parameters.Add(new DatabaseParameterInfo("@Message", "${message}"));
  55.         dbTarget.Parameters.Add(new DatabaseParameterInfo("@Logger", "${logger}"));
  56.         dbTarget.Parameters.Add(new DatabaseParameterInfo("@Callsite", "${callsite}"));
  57.         dbTarget.Parameters.Add(new DatabaseParameterInfo("@Exception", "${exception:tostring}"));
  58.         // 将目标添加到配置中
  59.         config.AddTarget(fileTarget);
  60.         config.AddTarget(errorFileTarget);
  61.         config.AddTarget(dbTarget);
  62.         // 配置日志规则
  63.         config.LoggingRules.Add(new LoggingRule("Microsoft.*", NLog.LogLevel.Trace, fileTarget) { Final = true });
  64.         config.LoggingRules.Add(new LoggingRule("*", NLog.LogLevel.Trace, fileTarget));
  65.         config.LoggingRules.Add(new LoggingRule("*", NLog.LogLevel.Error, errorFileTarget));
  66.         config.LoggingRules.Add(new LoggingRule("*", NLog.LogLevel.Trace, dbTarget));
  67.         // 应用配置
  68.         LogManager.Configuration = config;
  69.         return config;
  70.     }
  71.     private static Logger logger = LogManager.GetCurrentClassLogger();
  72.     public static void Info(string message)
  73.     {
  74.         Log(LogLevel.Info, message);
  75.     }
  76.     public static void Error(string message)
  77.     {
  78.         Log(LogLevel.Error, message);
  79.     }
  80.     public static void Error(Exception ex)
  81.     {
  82.         Log(LogLevel.Error, ex.Message, ex);
  83.     }
  84.     public static void LogError(string message, Exception? ex)
  85.     {
  86.         Log(LogLevel.Error, message, ex);
  87.     }
  88.     public static void Debug(string message)
  89.     {
  90.         Log(LogLevel.Debug, message);
  91.     }
  92.     public static void Warn(string message)
  93.     {
  94.         Log(LogLevel.Warn, message);
  95.     }
  96.     public static void Trace(string message)
  97.     {
  98.         Log(LogLevel.Trace, message);
  99.     }
  100.     private static void Log(LogLevel level, string message, Exception? ex = null)
  101.     {
  102.         try
  103.         {
  104.             if (ex != null)
  105.                 logger.Log(level, ex, message);
  106.             else
  107.                 logger.Log(level, message);
  108.         }
  109.         catch (Exception e)
  110.         {
  111.             Console.WriteLine("记录日志失败:" + e.Message);
  112.         }
  113.     }
  114. }
复制代码

  • 初始化部分:在LogHelp类的静态构造函数中,调用InitializeNLog方法来初始化NLog配置。
  • InitializeNLog方法

    • 创建配置对象:首先创建一个LoggingConfiguration对象,它是NLog配置的核心。
    • 配置文件目标

      • 创建FileTarget对象fileTarget,用于将日记记录到文件中。FileName属性指定了日记文件的路径和命名规则,这里使用了NLog的变量${basedir}表示项目的基目次,${shortdate}表示短日期格式。
      • Layout属性定义了日记记录的格式,包括时间、类名、日记级别、消息和异常信息等。

    • 配置错误文件目标:创建另一个FileTarget对象errorFileTarget,专门用于记录错误日记。它的FileName指向错误日记文件的路径,Layout与普通日记文件相同。
    • 配置数据库目标

      • 创建DatabaseTarget对象dbTarget,用于将日记记录到数据库中。ConnectionString属性设置数据库连接字符串,CommandText属性定义了插入日记数据到数据库表的SQL语句。
      • 通过switch语句根据ConfigHelp.DbType的值设置DBProvider属性,以支持不同类型的数据库,如MySQL、SqlServer、Sqlite和Kdbndp。
      • 使用Parameters属性添加SQL语句中的参数,这些参数对应日记记录中的各个字段。

    • 添加目标到配置:使用config.AddTarget方法将文件目标和数据库目标添加到配置中。
    • 配置日记规则

      • 使用LoggingRules属性添加多个日记规则。例如,config.LoggingRules.Add(new LoggingRule("Microsoft.*", NLog.LogLevel.Trace, fileTarget) { Final = true });这条规则表示对于所有以“Microsoft.”开头的日记记录器,记录所有级别的日记到fileTarget,并且设置Final = true表示这是一个终极规则,不再继承匹配其他规则。
      • 类似地,其他规则分别定义了对于所有日记记录器的不同级别日记的记录目标。

    • 应用配置:最后,将配置对象应用到LogManager.Configuration中,使配置收效。

  • 日记记录方法:类中还提供了一系列静态方法,如Info、Error、Debug等,用于方便地记录不同级别的日记。这些方法终极都调用Log方法,在Log方法中,根据是否有异常信息,调用logger.Log方法进行实际的日记记录,并在记录失败时捕获异常并输出到控制台。
(三)在项目中使用配置

在Asp.Net Core项目的Program.cs文件中,添加以下代码来使用我们配置好的NLog:
  1. builder.Logging.AddNLog(LogHelp.InitializeNLog());
复制代码
这里通过builder.Logging.AddNLog方法将我们在LogHelp类中初始化的NLog配置应用到项目的日记体系中。
三、总结

通过以上步骤,我们乐成地在Asp.Net Core项目中使用C#代码配置了NLog。这种方式不仅让我们能够灵活地定制日记记录行为,还提高了项目的可维护性和摆设的便利性。在实际项目中,可以根据具体需求进一步优化日记配置,例如添加更多的日记目标(如邮件、控制台等),调整日记级别和格式,以满足不同场景下的日记记录需求。希望本文能帮助你在Asp.Net Core项目中更好地使用NLog进行日记管理。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

不到断气不罢休

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表