2016-09-24 36 views
2

我已經使用Go 1.5.2盒式磁帶在Openshift上部署了我的Go應用程序。作爲一種良好的做法,我已經習慣於生成關於應用程序出現任何問題的日誌。但是由於提供給我的存儲空間有限(1 GB),這種習慣在Openshift環境中證明是昂貴的。在幾秒鐘的使用中,日誌很容易超過10 MB的標記,並且我擔心如果我未離開日誌文件,我的應用程序將用盡空間。目前,我正在定期清理日誌文件。停止將日誌附加到go.log文件

有沒有什麼辦法可以阻止日誌附加到文件上,或者完全停止生成日誌(不會影響我的原始應用程序代碼)?我試圖通過撤銷文件的寫入權限,但日誌不斷出現。

+0

你使用標準的go'log'包嗎? –

+0

@BenCampbell是的。 –

+0

如果您正確地從'go.log'中刪除寫入權限,除非它足夠聰明地'chmod'該文件,否則它不會寫入。你可以試試'chmod 544'並檢查寫入是否仍然發生? –

回答

2

理想情況下,您希望使用便於記錄級別的記錄器。這將允許您根據當前運行時上下文來調整日誌的詳細程度。您可以查看How to implement level based logging in golang問題獲取豐富的信息和包以促進日誌級別。作爲開發人員,您可以包含INFO和DEBUG日誌語句,這些語句在部署日誌級別較低時不會包含在日誌輸出中。

如果您需要在當前執行中禁用日誌記錄功能,則可以使用SetOutput(output io.Writer)函數配置本地輸出寫入器Loggerlog包使用的默認WriterSTDERRioutil包提供了頂級Discard編寫器,您可以使用它來防止記錄器寫入任何內容。您將不得不更新應用程序初始化,以根據環境設置記錄器的輸出。

package main 

import (
    "fmt" 
    "io/ioutil" 
    "log" 
) 

func main() { 
    var shouldEnableLogging bool = false 

    if !shouldEnableLogging { 
     fmt.Println("Disabled logging") 
     log.SetOutput(ioutil.Discard) 
    } 

    for i := 0; i < 5; i++ { 
     log.Printf("I logging statement %d", i) 
    } 
} 

你可以在這個片斷調整布爾標誌,看到這個動作可以將這些代碼的Go Playground。這會阻止你的文件空間填滿日誌,但是你會將所有日誌放在一起,這對於任何應用程序都是不可取的。

+0

還有其他策略可以與'SetOutput'函數一起使用。您可以創建一個記錄器可以編寫的n大小的環形緩衝區,以便定期將其刷新到磁盤。這將允許您擁有記錄器寫入的最後n個字節。 –

+0

謝謝你的詳細解答。是的,我應該轉向更詳細的日誌記錄庫。在我這樣做之前,我會很樂意使用SetOutput解決方法來解決我的問題。再次感謝! –

相關問題