2017-04-10 18 views
3

我想我的日誌記錄方法輸出某種請求ID。要做到這一點,我需要傳遞一個請求對象(或一些派生)到日誌記錄功能。有沒有一種靜態方法來獲取Go中的當前請求/上下文?

從請求處理程序登錄時這一切都很好,但圖書館式的方法內使用時,因爲我不希望那些知道任何正在進行的HTTP的請求是有問題的。
此外,控制檯應用程序將來可能會使用那些相同的庫方法,並且request-id將被某種worker-thread-id替換。

利用上下文來解決問題,但這意味着我將有一個上下文參數添加到我的方法,這是有點討厭。

所以,基本上,我需要的是某種被法夠程調用之間傳遞的靜態存儲。

我不知道有沒有像在圍棋什麼,所以也許我的做法是完全關閉基地,在這種情況下,我會很樂意聽到的是一個更好的方法來解決上述問題。

謝謝,

+3

「所以,基本上,我需要的是在方法和goroutine調用之間傳遞的某種靜態存儲。」沒有這樣的事情,Go作者不喜歡goroutine id或存儲之類的東西。 「我很樂意聽到解決上述問題的更好方法。」 - >「使用上下文解決了這個問題,但這意味着我必須爲我的所有方法添加一個上下文參數。」你解決了這個問題。 「......這有點討厭」,如果你覺得如此,那麼你就不得不做些惱人的事情。你會管理。 – Volker

+0

當解決方案中的所有方法都包含相同的參數時,它看起來很糟糕。 它通過創建「此方法是否需要上下文?」的問題增加了複雜性。每當寫一個新的方法時,需要一個上下文可能比正在編寫的方法更深。 是的,如果這是唯一的選擇,我會使用上下文,或者刪除日誌中的請求ID,但在此之前,我寧願看看是否有更好的選項。 – Svarog

+4

對您而言,不好的口味被其他人認爲是最佳做法(請參閱https://blog.golang.org/context#TOC_5。)。沒有明智的方式來討論品味,特別是在編程方面。 – Volker

回答

0

嘗試另一個日誌記錄庫。例如,在log15(https://github.com/inconshreveable/log15)中,Logger作爲嵌入式鍵/值上下文。

logger := log.New("request_id", "8379870928") 

您可以將記錄器對象傳遞給需要記錄的任何人。稍後:

logger.Warn("blabalbla") 

...將嵌入您已放置的request_id。

+0

感謝您的回覆,但您可以做類似的logrus,但它並不真的有幫助 - 仍然需要在所有函數中傳遞一個對象。我寧願將它作爲符合慣例的上下文對象。 – Svarog

相關問題