回答

收藏

如何将日志写入文件

技术问答 技术问答 136 人阅读 | 0 人回复 | 2023-09-12

我试着用 Go 写日志文件。
9 F9 N" {8 T# E* ^我尝试了几种方法,但都失败了。这是我试过的:% P( J  t1 J( j# `) ^% p$ B1 Y
    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}
    % v# d: A/ K2 `
创建了日志文件,但没有打印或附加任何内容。为什么?
4 g1 x2 k6 B/ J& A1 o- f$ c                                                               
5 [$ l0 j) I0 E5 Q( h2 t( ?    解决方案:                                                                / |5 ]# J8 N7 b1 r0 C, Q
                                                                os.Open() 过去一定有不同的工作方式,但对我有用:; H3 ]6 B3 s5 \' N& i7 @
    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")
    6 ~3 a& r2 K* {& O, Q. `
基于 Go 文档,os.Open()不能为log.SetOutput,打开文件阅读:
+ l4 s0 ~6 x" v9 a" sfunc Open
1 {+ W0 F8 B  b/ F4 E% Zfunc Open(name string) (file *File,err error) Open打开命名文件进行读取。如果成功,可以通过返回文件来读取;相关文件描述具有 mode O_RDONLY。如果有错误,类型是*PathError。
) \. x. U$ T  `6 G编辑
* w4 o! H* K9 a7 a检查defer f.Close()后移至if err != nil
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则