日志链路追踪功能
约 299 字大约 1 分钟
2025-02-12
以跟踪标识符(TraceID、TraceName)值为依据,为每个日志记录分配相应的标识符。这样,在用户界面界面上,将可以通过该标识符(TraceID、TraceName)来搜索和过滤相关的日志记录。
Asp.Net - 定义 Filter 生成 TraceId
编写一个 ILogItemFilter,实现自定义的 TraceID、TraceName 赋值
public class MyLogFilter : ILogItemFilter
{
private readonly IHttpContextAccessor _httpContextAccessor;
public MyLogFilter(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public void OnExecuting(LogItem logItem)
{
if (_httpContextAccessor.HttpContext != null)
{
logItem.TraceName = _httpContextAccessor.HttpContext.Request.Headers["TraceName"].ToString();
logItem.TraceId = _httpContextAccessor.HttpContext.TraceIdentifier;
}
}
}然后注入你的 ILogItemFilter
services.AddHttpContextAccessor();
services.AddSingleton<ILogItemFilter,MyLogFilter> ();这样,每条记录的日志都会附带一个 TraceId。
Mirage 工程 - 定义 Filter 生成 TraceId
由于 Mirage 工程并没有 IHttpContextAccessor ,所以需要稍微改造一下 BaseController ,让它可以直接访问到当前请求中的 controller 对象(类似 _httpContextAccessor.HttpContext)
public class BaseController : MicroServiceControllerBase
{
public static AsyncLocal<MicroServiceControllerBase> CurrentController = new AsyncLocal<MicroServiceControllerBase>();
public override void OnBeforeAction(string actionName, object[] parameters)
{
CurrentController.Value = this;
base.OnBeforeAction(actionName, parameters);
}
public override void Dispose()
{
CurrentController.Value = null; //释放对象
base.Dispose();
}然后再编写自己的 log filter:
public class MyLogFilter : ILogItemFilter
{
public void OnExecuting(LogItem logItem)
{
if (CurrentController.Value != null) //获取当前请求中的controller
{
if(this.Headers.TryGetValue("TraceName" , out string traceName))
{
logItem.TraceName = traceName;
}
if(this.Headers.TryGetValue("TraceId" , out string traceId))
{
logItem.TraceId= traceId;
}
}
}
}然后注入你的 ILogItemFilter
services.AddSingleton<ILogItemFilter,MyLogFilter> ();