2016-02-22 109 views
2

我正在Mac上開發一個Go程序,並在Windows上安裝了Parallels,以便我可以在兩個平臺上進行測試。我的程序運行良好。我可以在我的Mac上編譯一個Windows「.exe」文件並從Windows運行它,除了日誌文件外,它運行良好。跨平臺登錄Golang

我已經設置了記錄寫入其輸出到文件中,像這樣:

log.SetOutput(projectsLog) 

凡projectsLog被宣佈在其上方,如下圖所示:

projectsLog *os.File 

我使用log.Printf聲明因爲我想格式化輸出。一個例子如下所示:

log.Printf("Error: wrong Hra Class value %s in row %v for project/path %s", hraClass, (rowNum + 1), testDir) 

這在Mac上工作得很好。每條使用log.Printf的行都記錄在一個單獨的行上,但在Windows上,行分隔符不顯示,並且我得到一行沒有換行符的行。我很清楚unix和windows之間的「\ r」和「\ r \ n」區別。但是我認爲log.Printf會根據它運行的平臺而正確運行?

如果我的假設是錯誤的,那麼我有哪些選項可以確保日誌文件在Windows上可讀?如果可以的話,我不想通過標誌,例如,平臺窗口或其他類似的東西。這可以以透明的方式處理嗎?

+1

1.您的假設是錯誤的,log.Printf不會執行任何「Windows魔術」並終止具有相應的行\ n。 2.只需在Windows上使用一些普通程序即可讀取日誌文件,即「\ n」作爲行結尾(例如Notepad ++),並遠離破碎的東西,這需要\ r \ n作爲行結尾。 log.Printf或您的代碼沒有任何問題。 – Volker

+1

'log'和'fmt'包不會改變以平臺結尾的行(順便說一句,'\ r'實際上只用於舊的mac和其他已久的系統)。最好使用能夠在沒有回車的情況下讀取文件的文本編輯器。 – JimB

+0

@volker,謝謝。我安裝了Notepad ++,它讀取我的日誌文件很好。用記事本和記事本++。我已經離開Windows很長一段時間了,所以有點生疏。 – Bharat

回答

0

如前所述,fmt軟件包始終使用\n作爲換行符「序列」,而不管操作系統如何(在Windows上也是如此)。 log包使用fmt,所以同樣適用於log。當調用不以...ln()結尾的函數(例如log.Printf())時,\n將被明確打印,如Logger.Output()(其中log.Printf()轉發到)所記錄。

剛處理\n作爲換行符。如果你需要打印\r\n,你必須通過在格式字符串末尾附加一個\r字符手動處理,如:

log.Printf("This will be terminated by CR+LF\r") // \n is appended automatically 

你可以爲它創建一個包裝函數:

func winprintf(format string, a ...interface{}) { 
    log.Printf(format+"\r", a...) 
} 

請注意,這隻會在日誌條目的末尾打印\r\n;但如果在格式字符串中使用\n或者參數是string(或者將通過調用它們的String()方法產生string方法)包含\n,那麼它們將不會自動變爲\r\n。您也可以使用strings.Replace()來處理這些。