面试题答案
一键面试结构化日志的优势
- 易于解析和查询:结构化日志将日志数据以键值对的形式组织,相较于传统的文本日志,数据库或日志分析工具能更方便地对特定字段进行查询,例如快速定位某个用户ID的所有操作记录。
- 提高可读性:结构化数据的格式清晰,即使面对大量日志,也能直观地了解每条日志的关键信息,例如操作时间、操作类型等。
- 便于扩展:在应用发展过程中,可轻松添加新的结构化字段,无需大幅修改日志记录逻辑。
使用Serilog添加自定义结构化数据
- 安装Serilog相关包:在项目中通过NuGet安装
Serilog
、Serilog.Sinks.Console
等必要的包。 - 配置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);
}
}
- 解析和查询:当使用日志分析工具(如Elasticsearch + Kibana)时,只要日志被正确摄入,就能依据
UserId
和OperationTime
字段进行过滤和查询。
使用NLog添加自定义结构化数据
- 安装NLog相关包:通过NuGet安装
NLog
包。 - 配置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);
}
}
- 解析和查询:对于NLog,若将日志发送到支持结构化查询的存储(如SQL Server),可以根据
UserId
和OperationTime
字段构建SQL查询语句来检索相关日志。