go - 如何将日志写入文件

标签 go logging

我正在尝试使用 Go 写入日志文件。

我尝试了几种方法,但都失败了。这是我尝试过的:

func TestLogging(t *testing.T) {
    if !FileExists("logfile") {
        CreateFile("logfile")
    }
    f, err := os.Open("logfile")
    if err != nil {
        t.Fatalf("error: %v", err)
    }

    // attempt #1
    log.SetOutput(io.MultiWriter(os.Stderr, f))
    log.Println("hello, logfile")

    // attempt #2
    log.SetOutput(io.Writer(f))
    log.Println("hello, logfile")

    // attempt #3
    log.SetOutput(f)
    log.Println("hello, logfile")
}

func FileExists(name string) bool {
    if _, err := os.Stat(name); err != nil {
       if os.IsNotExist(err) {
            return false
        }
    }
    return true
}

func CreateFile(name string) error {
    fo, err := os.Create(name)
    if err != nil {
        return err
    }
    defer func() {
        fo.Close()
    }()
    return nil
}

创建了日志文件,但没有打印或附加任何内容。为什么?

最佳答案

os.Open() 过去的工作方式肯定有所不同,但这对我有用:

f, err := os.OpenFile("testlogfile", os.O_RDWR | os.O_CREATE | os.O_APPEND, 0666)
if err != nil {
    log.Fatalf("error opening file: %v", err)
}
defer f.Close()

log.SetOutput(f)
log.Println("This is a test log entry")

根据 Go 文档,os.Open() 不能用于 log.SetOutput,因为它会打开文件“用于读取:”

func Open

func Open(name string) (file *File, err error) Open opens the named file for reading. If successful, methods on the returned file can be used for reading; the associated file descriptor has mode O_RDONLY. If there is an error, it will be of type *PathError.

编辑

defer f.Close() 移到 if err != nil 检查之后

关于go - 如何将日志写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19965795/

相关文章:

regex - 如何在 Go 中将正则表达式与反向引用相匹配?

go - 如何使用 Go 外部插件与 Telegraf 交互?

oracle - 当使用带有 oracle 驱动程序的数据库/sql 包时,LastInsertId 返回 0

go - 如何在特定文件夹中运行 shell 命令

google-app-engine - 数据存储四舍五入的时间字段

c++ - 在没有 C 预处理器的情况下记录表达式的文本及其结果

logging - JavaFx 日志记录示例

python - 捕获 PyQt 异常

Python日志分析工具/库

ruby - 使用 Ruby 将文件流式传输到浏览器