HttpContext.TraceIdentifier那嚴謹的設計

前言

Asp.Net Core中有一個不受人重視的屬性HttpContext.TraceIdentifier,它在鏈路追蹤中非常有用,下面是官方的定義:

0432edbc84548573328b732299aaf8c8.png

在項目中一般會將該字段輸出到每一條日志中,也可以將此Id作為通用響應字段返回前端,后續可以根據該屬性和日志匹配,快速定位整個鏈路日志。在本地開發時我通常觀察到該值的格式大概這個樣子0HLEACIU86PT6:0000000D,在生產環境中查看日志時,卻不是這種格式,而是Guid格式,雖然都是唯一標識,都能滿足我的需要,但是為什么會產生這一差異令我困惑,最初以為是第三方日志組件對該字段進行了賦值,在我的不懈努力下,最終確定該差異的原因是部署方式差異導致,分享給各位。

差異對比

創建一個Asp.Net Core新項目,在示例代碼中添加一行日志,打印該屬性

[HttpGet(Name?=?"GetWeatherForecast")]
public?IEnumerable<WeatherForecast>?Get()
{_logger.LogInformation(Request.HttpContext.TraceIdentifier);return?Enumerable.Range(1,?5).Select(index?=>?new?WeatherForecast{Date?=?DateTime.Now.AddDays(index),TemperatureC?=?Random.Shared.Next(-20,?55),Summary?=?Summaries[Random.Shared.Next(Summaries.Length)]}).ToArray();
}

Kestre部署時的表現

VS中使用控制臺啟動項目,調用幾次接口,輸出如下fe14421bde84a2aaf9789b28ae35fc26.png可見TraceIdentifier有下面兩部分組成{ConnectionId}:{Request number},第一部分ConnectionId標識同一次連接,第二部分Request number標識,當前是該連接的第n次請求起到計數的作用。而兩者的組成{ConnectionId}:{Request number}就可以標識唯一一次請求。

IIS部署時的表現

用上面的的程序,不做任何更改,在VSIIS Express啟動,調用幾次接口,輸出如下,由于沒使用文件日志,IIS Express啟動時沒有窗口可以看輸出,只能通過VS的調試窗口查看輸出如下:cc6bd13dece15e1549e73e20799882a0.png這里可以很明顯地看出,我們打印的TraceIdentifierGUID格式。

差異的原因

本地開發時我一般不會選擇IIS Express啟動,因為它速度慢,也不能方便的查看日志輸出。所以正如上文測試的那樣,我在本地使用只看到一種格式:{ConnectionId}:{Request number}

我們生產環境是部署在Windows Server中,而在windows下部署,使用IIS托管則比使用控制臺更加安全穩定,所以這種部署方式輸出的TraceIdentifier和上文中使用IIS Express表現是一致的。

那為何不同的部署方式產生該差異呢?

其實這是Asp.Net Core設計使然。在IIS上,它(TraceIdentifier)來自HTTP.sys(內核驅動程序)并暴露給應用程序,以便您可以跟蹤該ID,從內核到應用程序并返回到內核,它的值來自IIS生成并傳遞給我們的應用。使用Kestrel,請求不需要iis對其進行轉發,我們的應用程序就是鏈路的第一個程序,沒有程序會傳給它一個鏈路ID,所以程序自己需要生成一個,也就是我們看到的這種{ConnectionId}:{Request number}

總結

在不同的部署方式下,Asp.Net Core對TraceIdentifier有不同的表現,是程序設計上的一種嚴謹。在IIS部署時,該屬性值來自IIS內核的傳遞,以便我們可以跟蹤IIS內核到我們的程序,也保持了IIS式的風格。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/287373.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287373.shtml
英文地址,請注明出處:http://en.pswp.cn/news/287373.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

iOS - 富文本AttributedString

最近項目中用到了圖文混排&#xff0c;所以就研究了一下iOS中的富文本&#xff0c;打算把研究的結果分享一下&#xff0c;也是對自己學習的一個總結。 在iOS中或者Mac OS X中怎樣才能將一個字符串繪制到屏幕上呢&#xff1f; 簡單來說&#xff0c;是通過控件來完成的&#xff0…

php把數字倒著展示,jQuery+PHP實現動態數字展示特效

HTML本例假設要在頁面上動態展示(無需刷新整個頁面&#xff0c;只是局部刷新動態數字)當前在線用戶數&#xff0c;常見在一些統計平臺上應用。在HTML頁面中只需定義以下結構&#xff1a;代碼如下:當前在線&#xff1a;jQuery首先我們要定義一個動畫過程&#xff0c;使用jQuery的…

Android之實現多張圖片點擊預覽(支持放縮)和滑動

1 需求 多張圖片通過recycleView展示&#xff0c;然后點擊具體一張圖片支持預覽(支持放縮)和滑動 2 解決辦法 BaseRecyclerViewAdapterHelper com.github.chrisbanes.photoview.PhotoView ViewPage2 組合起來真香 https://github.com/CymChad/BaseRecyclerViewAdapt…

【Envi風暴】Envi5.4經典安裝圖文教程

ENVI(The Environment for Visualizing Images)是一個完整的遙感圖像處理平臺,應用匯集中的軟件處理技術覆蓋了圖像數據的輸入/輸出、圖像定標、圖像增強、糾正、正射校正、鑲嵌、數據融合以及各種變換、信息提取、圖像分類、基于知識的決策樹分類、與GIS的整合、DEM及地形信…

錯誤: nknown column 'xxxx' in 'where clause'

nknown column sdsds in where clause 運行環境&#xff1a;jdk1.7.0_17tomcat 7 spring&#xff1a;3.2.0 mybatis&#xff1a;3.2.7 eclipse 錯誤&#xff1a;nknown column sdsds in where clause 錯誤原因&#xff1a;數據庫查詢無用&#xff0c;可能很多寫sql語句都會遇到…

c/c++處理參數

直接上代碼&#xff1a;涉及函數getopt()&#xff0c;getopt_long() 1 #include <unistd.h>2 #include <stdlib.h>3 #include <stdio.h>4 #include <getopt.h>5 6 /*7 int main(int argc, char *argv[])8 {9 int opt; 10 char * optstring &q…

查缺補漏系統學習 EF Core 6 - 批量操作

推薦關注「碼俠江湖」加星標&#xff0c;時刻不忘江湖事這是 EF Core 系列的第七篇文章&#xff0c;上一篇文章講述了 EF Core 中的實體數據修改。這篇文章講一講 EF Core 如何進行批量操作。在眾多的 ORM 框架中&#xff0c;EF Core 的功能并不是最強大的那個&#xff0c;性能…

半小時一篇文過完C語言基礎知識點

若是大一學子或者是真心想學習剛入門的小伙伴可以私聊我&#xff0c;若你是真心學習可以送你書籍&#xff0c;指導你學習&#xff0c;給予你目標方向的學習路線&#xff0c;無套路&#xff0c;博客為證。 本文定位讀者為小白讀者&#xff0c;將使用最快的方法過完C語言基礎知識…

php變量的判空和類型判斷

&#xff08;1&#xff09;var_dump(); 判斷一個變量是否已經聲明并且賦值&#xff0c;并且打印類型和值 <?php $a; var_dump($a);//輸出null<?php var_dump($a);//輸出null<?php$a 10; var_dump($a);//輸出 int 10&#xff08;2&#xff09;isset() 判斷一個變量…

【Envi風暴】Envi插件大全:多波段拆分工具的巧妙使用

很多場合下需要做波段合成,比如波段432合成賦予紅綠藍,構造標準假彩色等等。合成后的文件通常包含多個單波段文件,在Envi中使用layer stacking工具將多個單波段數據合成為一個文件,如下所示: 那么問題來了,合成后的數據該怎樣拆開為原來的單波段呢?今天我們就來學習一種…

php表格怎么合并單元格格式化,table標簽的結構與合并單元格的實現方法

1.示例代碼&#xff1a;復制代碼 代碼如下:#1234一個完整的例子&#xff1a;復制代碼 代碼如下:#FirstnameLastnamePhoneQQ1qianshou111111111111111111112qianshou111111111111111111113qianshou111111111111111111114qianshou111111111111111111112.合并上下的單元格(rowspan…

Android之GridLayoutManager.setSpanSizeLookup問題

1 問題 利用BaseMultiItemQuickAdapter,用recycleView加載多布局,需要實現有些view顯示一行,有些一行顯示多個圖片。 在BaseMultiItemQuickAdapter適配器里面根據類型加載不同布局。 public ImageMultiItemAdapter(List<MultiItemEntity> data) {super(data);addIte…

《看聊天記錄都學不會C語言?太菜了吧》(9)老公餅真的有老公送?

若是大一學子或者是真心想學習剛入門的小伙伴可以私聊我&#xff0c;若你是真心學習可以送你書籍&#xff0c;指導你學習&#xff0c;給予你目標方向的學習路線&#xff0c;無套路&#xff0c;博客為證。 本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋…

@Springboot搭建項目controller層接收json格式的對象失敗

今天在使用swagger2測試的時候出錯 1、requestBody注解常用來處理content-type不是默認的application/x-www-form-urlcoded編碼的內容&#xff0c;比如說&#xff1a;application/json或者是application/xml等。一般情況下來說常用其來處理application/json類型。 2、 通過req…

『技術群里聊些啥』HttpClient 如何判斷是同一終結點

前言官方文檔對 HttpClientHandler.MaxConnectionsPerServer 屬性有如下說明&#xff1a;獲取或設置使用 HttpClient 對象發出請求時允許的最大并發連接數&#xff08;每個服務器終結點&#xff09;。請注意&#xff0c;該限制針對每個服務器終結點&#xff0c;例如&#xff0c…

【Envi風暴】Envi 5.3 SP1經典安裝手把手圖文教程(含補丁文件)

Envi 5.3具有傳感器和數據支持、圖像處理和顯示、用戶界面、二次開發等新功能,本文講解Envi 5.3 SP1完全安裝教程。 下載后的軟件包目錄如下所示: 目錄 一、Envi 5.3 SP1安裝 二、Envi 5.3 SP1下載地址 一、Envi 5.3 SP1安裝 點擊IDL_ENVI5.3 SP1win64.exe,開始安裝,…

apache php url重寫語法,apache url重寫實現偽靜態

前段時間項目為了配合seo的工作&#xff0c;把現有的php網站改成靜態頁面&#xff0c;剛拿到需求時候第一感覺就是用靜態頁面啊&#xff0c;可是看了一會以后發現頁面有點多4、50個&#xff0c;沒辦法就用比較簡單的url重寫(apache的)吧&#xff0c;去掉這個前面的#,啟用它Load…

Android之用java的socket寫服務器提示java.net.BindException: Address already in use

1 問題 在Android activity里面Java socket服務器,然后關閉activity再打開activity開啟服務的時候提示錯誤如下 java.net.BindException: Address already in use 很明顯這個,IP和端口的的socket已經使用了,我們只需要在關閉activity的時候關閉serverSocket就行了。 2 解…

《看聊天記錄都學不會C語言?太菜了吧》(10)程序媛聰明絕頂了

若是大一學子或者是真心想學習剛入門的小伙伴可以私聊我&#xff0c;若你是真心學習可以送你書籍&#xff0c;指導你學習&#xff0c;給予你目標方向的學習路線&#xff0c;無套路&#xff0c;博客為證。 本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋…

List 集合轉換為String

開發中會用到把 List<string> 的內容拼接成以逗號分隔的字符串的形式,現總結如下&#xff1a; 方法一: public String listToString(List list, char separator) { StringBuilder sb new StringBuilder(); for (int i 0; i < list.size(); i) { …