我遇到了一個(gè)問(wèn)題,我正在努力尋找一個(gè)干凈的解決方案,谷歌搜索并沒(méi)有讓我變得更聰明。情況(1) 我們有自己的程序集,用于為我們的任何項(xiàng)目(一致的日志輸出、主題等)設(shè)置和添加 Serilog 記錄器,并且該程序集沒(méi)有對(duì)任何使用項(xiàng)目(位于不同的存儲(chǔ)庫(kù)中)的引用。讓我們稱(chēng)之為CompanySerilog大會(huì)。(2) 消費(fèi)項(xiàng)目之一是外部可訪問(wèn)的 API,其“合同”對(duì)象在 ExternalContracts 程序集中定義。即請(qǐng)求和響應(yīng)對(duì)象,以及用作這些對(duì)象一部分的任何枚舉??梢詫⒋?ExternalContracts 程序集提供給針對(duì) API 進(jìn)行集成的開(kāi)發(fā)人員。(3) 我們想記錄所有請(qǐng)求,并使用一個(gè)IActionFilter使用 Serilog 結(jié)構(gòu)化日志記錄方法注銷(xiāo)每個(gè)請(qǐng)求對(duì)象。例如循環(huán)遍歷上下文中的每個(gè)參數(shù)并最終執(zhí)行_logger.LogDebug("With {name} of {@requestObject}", name, value);問(wèn)題一些請(qǐng)求對(duì)象具有我們想要屏蔽的敏感數(shù)據(jù),但是:創(chuàng)造記錄儀時(shí),我們可以定義解構(gòu)的方法CompanySerilog使用標(biāo)準(zhǔn)的.Destructure擴(kuò)展,但不知道,或者想知道,要求的具體對(duì)象,因?yàn)檫@些可能是從Api1,Api2等等,這將意味著要添加到每一個(gè)參考消耗項(xiàng)目。我們可以向請(qǐng)求對(duì)象 ( Destructurama.Attributed)添加屬性,但這意味著我們的ExternalContracts程序集現(xiàn)在需要對(duì)該 NuGet 包的引用,而后者又需要對(duì)所有必需的 Serilog 包的引用。嚴(yán)格來(lái)說(shuō),ExternalContracts 程序集中不需要日志記錄問(wèn)題:這是我們的問(wèn)題,而不是我們 API 的使用者正如我所說(shuō),我一直在努力想出解決這個(gè)問(wèn)題的方法,但找不到太多關(guān)于使用 IDestructuringPolicy 的信息,以及它是否合適,或者轉(zhuǎn)換是否應(yīng)該發(fā)揮作用。到目前為止,我只能想到以下選項(xiàng),但我希望其他人遇到了這個(gè)問(wèn)題,并且有一種非常聰明和干凈的方式來(lái)支持這個(gè)用例。解決方案?停止進(jìn)行結(jié)構(gòu)化日志記錄,只需ToString()為每個(gè)請(qǐng)求對(duì)象定義一個(gè)掩蔽我們不想記錄的值的對(duì)象。這很簡(jiǎn)單,不需要討厭的項(xiàng)目交叉引用或?qū)⑷罩居涗泦?wèn)題添加到外部合同中。但這確實(shí)意味著不可能進(jìn)行結(jié)構(gòu)化日志記錄。將所有需要的日志引用添加到外部合約中。這將允許我們繼續(xù)使用內(nèi)置銷(xiāo)毀,但意味著我們 API 的使用者將擁有一個(gè)包含日志程序集的 ExternalContracts 程序集通過(guò)引用將使用此程序集的每個(gè)項(xiàng)目,.Destructure在配置登錄時(shí)設(shè)置值CompanySerilog。不會(huì)發(fā)生!還有什么?請(qǐng)!
- 2 回答
- 0 關(guān)注
- 206 瀏覽
添加回答
舉報(bào)
0/150
提交
取消