我開始使用log4net.async來使用單獨的線程進行日誌記錄,但性能並沒有像我最初預期的那樣提高,我明白其中的原因是我們記錄的一些字符串非常長,因爲它們描述收到消息的屬性。如何在使用log4net.async時優化log4net調試?
因此,例如,我們可以這樣做:
theLogger.Debug(msg.ToString());
當「的ToString()」方法被調用它可以生成一個很長的字符串表示消息,它可能需要一段時間來實際生成它(慢反序列化等)。雖然記錄消息對我來說很重要,但我寧願在單獨的線程而不是當前正在運行的線程上「消化」消息,以便我當前正在運行的線程可以繼續處理。我將如何讓log4net評估「ToString()」結果或在另外的線程上「消化」消息對象?
msg是不可變的(或者至少在這個日誌操作排隊之後永遠不會改變嗎?),並且可以安全地用另一個線程以這種方式訪問嗎? – Servy
@CodeCaster我不認爲這個問題是關於如何消除釋放模式下的調試調用,並提供'動作'也不會幫助。 OP使用轉發appender將消息寫入後臺線程的文件(所有消息,而不僅僅是調試消息),並且他希望延遲msg.ToSring()的執行,以便它發生在該async轉發器的後臺線程上。所以它不是特定於調試調用,也不涉及IsDebugEnabled設置,也不涉及條件編譯。 –
Evk
@Evk你是對的,我錯過了,重新開放。謝謝。我對log4net.async沒有任何經驗,但是這不會僅僅提前幾毫秒提出問題嗎?只要另一個線程將日誌消息「串化」,其他日誌調用將會阻塞,直到該線程再次釋放爲止。或者有log4net.async內置的某種排隊? – CodeCaster