這是我第一次嘗試使用golang登錄文件。爲什麼log.Println(「不登錄到文件」)?
file, _ := os.Open("logfile")
log.SetOutput(file)
log.Println("foo")
這些行構建,但不工作。爲什麼?
這是我第一次嘗試使用golang登錄文件。爲什麼log.Println(「不登錄到文件」)?
file, _ := os.Open("logfile")
log.SetOutput(file)
log.Println("foo")
這些行構建,但不工作。爲什麼?
爲什麼log.Println(「不記錄到文件」)?
原因是因爲你沒有檢查文件是否存在或者沒有形成你的代碼。
file, _ := os.Open("logfile")
你正在使用_
並沒有檢查錯誤。如果你想寫入文件,這很重要。例如看看這段代碼:
f, err := os.OpenFile(filePath+fileName, os.O_RDWR|os.O_CREATE|os.O_APPEND, os.ModePerm)
if err != nil {
// if error then you need to create the file first
err = os.MkdirAll(filePath, os.ModePerm)
}
從上面的代碼
你可以看到使用if err != nil
錯誤檢查。如果文件不存在,則先創建文件。使用
os.MkdirAll()
。
它應該是'return createLogFile(prefix,filePath,fileName)'。此外,如果由於某種原因路徑存在,但是文件不可訪問(缺少權限),則會出現無限循環。 – zerkms
@zerkms ahh我看到您說得對。謝謝指出。 –
file, err := os.Open("file.go") // For read access.
if err != nil {
\t // do something
}
// and try to include the file path...
os.Open calls OpenFile(name,O_RDONLY,0)。如果該文件不存在,則不具有用於創建該文件的標誌O_CREATE。因此你需要用O_CREATE標誌調用OpenFile。我已將錯誤代碼註釋掉:
package main
import (
"log"
"os"
"syscall"
)
const (
O_RDONLY int = syscall.O_RDONLY // open the file read-only.
O_RDWR int = syscall.O_RDWR // open the file read-write.
O_CREATE int = syscall.O_CREAT // create a new file if none exists.
O_APPEND int = syscall.O_APPEND // append data to the file when writing.
)
func main() {
/*f1, err := os.OpenFile("testlogfile1", O_RDONLY, 0) // Equivalent to os.Open("testlogfile1")
if err != nil {
log.Fatalf("error opening file1: %v", err)
}
// ** error opening file: open testlogfile1: no such file or directory exit status 1 **
defer f1.Close()
log.SetOutput(f1)
log.Println("This is a test for log 1")*/
f2, err := os.OpenFile("testlogfile2", O_RDWR | O_CREATE | O_APPEND, 0644)
/* Note that you want:
* O_RDWR to write to the file
* O_CREATE to create file if it does not exist
* O_APPEND to add additional information to existing file */
if err != nil {
log.Fatalf("error opening file2: %v", err)
}
defer f2.Close()
log.SetOutput(f2)
log.Println("This is a test for log 2")
}
總是檢查這些錯誤!
您忽略了錯誤,然後詢問爲什麼您的代碼無法按預期工作? – zerkms