2017-10-13 70 views
0

我在slf4j後面使用了logback,並想知道如何從org.slf4j.Logger實例獲取OutputStream引用。用例是Shrinkwrap的Archive.writeTo(OutputStream, ...)方法。如何從slf4j記錄器獲取OutputStream引用?

我知道可以通過創建ByteArrayOutputStream來解決此參考的需要,將其傳遞並將其內容寫入記錄器。我知道那stdout and stderr can be redirected to a logger in general。話雖如此,我正在尋找對這個問題的直接回答。如果沒有,我會建議給slf4j添加一個機制。

我正在使用slf4j API 1.7.5和logback 1.2.2。

+0

我不認爲增加一個接受大量二進制數據而沒有日誌級別和清除消息分界的API是有意義的。作爲想要記錄消息的應用程序,您需要製作有意義的單獨日誌消息(每個日誌消息都有一個級別,「正常大小」消息,可能是一些映射的上下文屬性)。一個OutputStream對於二進制數據來說只是一個愚蠢的陷阱。 – Thilo

+0

在https://jira.qos.ch/browse/LBCLASSIC-118 –

+0

上提供了一個OutputStream引用作爲'Logger。[level]參數的參數「,但這需要按照你的建議工作,雖然:你會得到來自記錄器的OutputStream。如果你將一個OutputStream傳遞給記錄器,它所能做的就是寫入它。沒有辦法從OutputStream讀取。 – Thilo

回答

0

假設這仍然是面向行的文本數據(*),您可以提供一個OutputStream實現,該實現將您寫入它的任何內容轉發到Logger實例。你需要一些方法來確定單個消息開始和結束的位置。您甚至可以查看內容並分配日誌級別等。

(*)如果不是,它似乎沒有太大意義將它發送到日誌框架。

+0

雖然這與您不喜歡的解決方法(或鏈接線程https://stackoverflow.com/a/11187462/14955上的此答案)非常相似。 – Thilo

+1

現在我明白了......因爲'OutputStream.write'只有一個'int'參數,並且沒有其他方法需要一個處理轉換爲面向行的數據的子類。 –