MST
星途 面试题库

面试题:C#中结构化日志在Serilog和NLog里的实现

在C#应用中,阐述结构化日志的优势。以Serilog和NLog为例,说明如何在记录日志时添加自定义的结构化数据,比如在记录用户操作日志时,添加用户ID、操作时间等信息,并保证这些数据能被有效解析和查询。
37.5万 热度难度
编程语言C#

知识考点

AI 面试

面试题答案

一键面试

结构化日志的优势

  1. 易于解析和查询:结构化日志将日志数据以键值对的形式组织,相较于传统的文本日志,数据库或日志分析工具能更方便地对特定字段进行查询,例如快速定位某个用户ID的所有操作记录。
  2. 提高可读性:结构化数据的格式清晰,即使面对大量日志,也能直观地了解每条日志的关键信息,例如操作时间、操作类型等。
  3. 便于扩展:在应用发展过程中,可轻松添加新的结构化字段,无需大幅修改日志记录逻辑。

使用Serilog添加自定义结构化数据

  1. 安装Serilog相关包:在项目中通过NuGet安装SerilogSerilog.Sinks.Console等必要的包。
  2. 配置Serilog
using Serilog;

class Program
{
    static void Main()
    {
        Log.Logger = new LoggerConfiguration()
           .WriteTo.Console()
           .CreateLogger();

        var userId = "12345";
        var operationTime = DateTime.Now;

        Log.Information("User {UserId} performed an operation at {OperationTime}", userId, operationTime);
    }
}
  1. 解析和查询:当使用日志分析工具(如Elasticsearch + Kibana)时,只要日志被正确摄入,就能依据UserIdOperationTime字段进行过滤和查询。

使用NLog添加自定义结构化数据

  1. 安装NLog相关包:通过NuGet安装NLog包。
  2. 配置NLog:在NLog.config文件中配置:
<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="Console">
      <layout>${message} UserId: ${event-context:item=UserId} OperationTime: ${event-context:item=OperationTime}</layout>
    </target>
  </targets>
  <rules>
    <logger name="*" minlevel="Info" writeTo="console" />
  </rules>
</nlog>

在代码中记录日志:

using NLog;

class Program
{
    private static readonly Logger Logger = LogManager.GetCurrentClassLogger();

    static void Main()
    {
        var userId = "12345";
        var operationTime = DateTime.Now;

        var logEventInfo = new LogEventInfo(LogLevel.Info, "", "User performed an operation");
        logEventInfo.Properties["UserId"] = userId;
        logEventInfo.Properties["OperationTime"] = operationTime;

        Logger.Log(logEventInfo);
    }
}
  1. 解析和查询:对于NLog,若将日志发送到支持结构化查询的存储(如SQL Server),可以根据UserIdOperationTime字段构建SQL查询语句来检索相关日志。