2012-05-25 51 views
3

我們有一些相當大的數據導入腳本(Symfony「Commands」),由於Monolog的內存不足(vendor 58)的供應商\ monolog \ src \ Monolog \ Formatter \ LineFormatter.php而導致錯誤。我們一般使用Monolog,所以不想完全禁用它。一種在每個腳本的基礎上禁用Monolog的方法?

+0

您是否在prod環境中運行腳本(--env = prod)?因爲這種方式monolog不應該記錄任何東西,直到達到給定的日誌級別(通常是錯誤)。 –

+0

確實有幫助 - 導入腳本可以通過另外幾千條記錄 - 但它最終會再次出錯。奇怪的是,它在另一個位置出錯(在418行上的vendor \ doctrine \ lib \ Doctrine \ ORM \ UnitOfWork.php)。我之前有過這個錯誤,我通過批處理修復了這個錯誤(http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/batch-processing.html)。我試圖讓我的批量更小,但是完全禁用monolog仍然是唯一可以解決這些錯誤的方法(--env = prod或不)。 – Ben

回答

3

我意識到這是一個老問題,但是當我遇到長時間運行,使用Monolog的腳本產生內存錯誤時,問題是Monolog的'fingers_crossed'處理程序緩衝了大量的日誌消息。

我通過爲所討論的Monolog處理程序設置'buffer_size'變量解決了這個問題。事情是這樣的:

main: 
    type:   fingers_crossed 
    action_level: info 
    buffer_size: 200 
    handler:  nested 

編輯:正如在評論中指出的塞爾吉奧,buffer_size集:「有多少項應該被最多緩衝,超出了最早的項目是從緩存刪除」。

+0

太棒了!遲到總比不到好!謝謝! – Ben

+0

提高你的性能: buffer_size:最多應該緩存多少條目,除此之外,最早的條目將從緩衝區中刪除。 來源:https://github.com/Seldaek/monolog/blob/master/src/Monolog/Handler/BufferHandler.php –

1

由於在產品環境中您有教義的問題我不認爲專注於記錄器將改善您的情況。但是,您可以嘗試通過多次調用$logger->popHandler()將日誌處理程序彈出堆棧。可能是由於日誌消息堆疊而導致內存不足。

儘管你很可能有教條的問題。

我想嘗試使用XHProf或XDebug來查看實際問題的位置。僅僅因爲你的腳本在某一點失敗並不意味着它是問題的原因(實際的內存泄漏可能在其他地方)。

相關問題