无需使用布局,在自定义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
相关产品推荐
相关产品推荐

