You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需使用布局,在自定义Target中获取ThreadId的方法

不用布局渲染器,通过LogEventInfo获取ThreadId的方法

当然可以!你完全不需要借助${threadid}布局渲染器,直接通过LogEventInfo对象就能拿到线程ID,具体实现非常直观:

在你的自定义custom-db-target的Write方法里,直接访问LogEventInfo实例的ThreadId属性即可,代码示例如下:

protected override void Write(LogEventInfo logEvent)
{
    // 直接获取当前日志对应的线程ID
    int threadId = logEvent.ThreadId;
    
    // 接下来就可以用这个threadId来构造数据库日志条目了
    // 比如将它作为参数传入SQL语句,或者映射到实体类字段
}

原理说明

LogEventInfo在被创建的那一刻,就已经自动捕获了当前执行日志操作的线程ID,这个值和${threadid}布局渲染器获取到的是完全一致的。

如果你的NLog版本比较旧(不过近几个大版本都支持),万一找不到ThreadId属性,还可以通过logEvent.Properties["ThreadId"]来获取这个值,但直接访问属性是更简洁推荐的方式。

额外补充:${threadid}的数据源

至于${threadid}布局渲染器是从哪拿到的值——它内部其实就是读取LogEventInfo.ThreadId属性,而这个属性的底层来源是System.Threading.Thread.CurrentThread.ManagedThreadId,所以两种方式本质上用的是同一个数据源。

内容的提问来源于stack exchange,提问作者kara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:11:33