英文:
Why log.Println("does not log into file")?
问题
这是我第一次尝试使用Golang记录文件。
file, _ := os.Open("logfile")
log.SetOutput(file)
log.Println("foo")
这些代码段可以编译通过,但是为什么没有起作用呢?
英文:
This is my first attempt to log into files with golang.
file, _ := os.Open("logfile")
log.SetOutput(file)
log.Println("foo")
these lines build, but are not working. Why?
答案1
得分: 6
os.Open调用OpenFile(name, O_RDONLY, 0)。这里没有使用O_CREATE标志来创建文件,如果文件不存在的话。因此,你需要使用带有O_CREATE标志的OpenFile。我已经注释掉了错误代码:
package main
import (
"log"
"os"
"syscall"
)
const (
O_RDONLY int = syscall.O_RDONLY // 只读方式打开文件。
O_RDWR int = syscall.O_RDWR // 读写方式打开文件。
O_CREATE int = syscall.O_CREAT // 如果文件不存在,则创建一个新文件。
O_APPEND int = syscall.O_APPEND // 写入时追加数据到文件末尾。
)
func main() {
/*f1, err := os.OpenFile("testlogfile1", O_RDONLY, 0) // 等同于 os.Open("testlogfile1")
if err != nil {
log.Fatalf("打开文件1时发生错误:%v", err)
}
// ** 打开文件错误:打开 testlogfile1: 没有那个文件或目录 退出状态 1 **
defer f1.Close()
log.SetOutput(f1)
log.Println("这是一个日志测试1")*/
f2, err := os.OpenFile("testlogfile2", O_RDWR | O_CREATE | O_APPEND, 0644)
/* 注意你需要:
* O_RDWR 以写入方式打开文件
* O_CREATE 如果文件不存在,则创建文件
* O_APPEND 在写入时追加到现有文件中的附加信息 */
if err != nil {
log.Fatalf("打开文件2时发生错误:%v", err)
}
defer f2.Close()
log.SetOutput(f2)
log.Println("这是一个日志测试2")
}
始终检查这些错误!
[1]: https://golang.org/src/os/file.go?s=7374:7411#L236
英文:
os.Open calls OpenFile(name, O_RDONLY, 0). This does not have the flag O_CREATE to create the file if it does not exist. Therefore you need to call OpenFile with the O_CREATE flag. I have commented out the error code:
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")
}
Always check those errors!
答案2
得分: 3
为什么log.Println("does not log into file")不会将日志记录到文件中?
原因是你的代码没有检查文件是否存在。
file, _ := os.Open("logfile")
你使用了_
并且没有检查错误。如果你想要将内容写入文件中,这一点非常重要。例如,看看下面的代码:
f, err := os.OpenFile(filePath+fileName, os.O_RDWR|os.O_CREATE|os.O_APPEND, os.ModePerm)
if err != nil {
// 如果出现错误,则需要先创建文件
err = os.MkdirAll(filePath, os.ModePerm)
}
从上面的代码中可以看到使用了if err != nil
进行错误检查。如果文件尚不存在,则先创建文件,使用os.MkdirAll()
。
英文:
> Why log.Println(“does not log into file”)?
The reason is because you didn't check the file is exist or not form your code.
file, _ := os.Open("logfile")
you're using _
and didn't check the error. This is important if you wanted to write something in to file. For example look at this code :
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)
}
from above code you can see the error checking using if err != nil
. if the file is not exist yet then create the file first. using os.MkdirAll()
.
答案3
得分: -1
文件,错误 := os.Open("file.go") // 用于读取访问。
if 错误 != nil {
// 做一些事情
}
// 并尝试包含文件路径...
英文:
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-html -->
file, err := os.Open("file.go") // For read access.
if err != nil {
// do something
}
// and try to include the file path...
<!-- end snippet -->
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论