Go / Golang将日志写入文件

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

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

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 } 

日志文件被创build,但没有打印或附加到它。 为什么?

os.Open()必须在过去有不同的工作,但是这对我os.Open()

 f, err := os.OpenFile("testlogfile", os.O_RDWR | os.O_CREATE | os.O_APPEND, 0666) if err != nil { t.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打开命名的文件进行阅读。 如果成功,返回的文件上的方法可以用于阅读; 关联的文件描述符具有模式O_RDONLY 。 如果有错误,则会是*PathErrortypes。

编辑

if err != nil检查, if err != nil defer f.Close()移至后面

我更喜欢12因子应用程序build议的简单性和灵活性。 要附加到日志文件,您可以使用shellredirect。 Go中的默认logging器写入stderr(2)。

 ./app 2>> logfile 

另见: http : //12factor.net/logs

Go中的默认logging器写入stderr(2)。 redirect到文件

 import ( "syscall" "os" ) func main(){ fErr, err = os.OpenFile("Errfile", os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0600) syscall.Dup2(int(fErr.Fd()), 1) /* -- stdout */ syscall.Dup2(int(fErr.Fd()), 2) /* -- stderr */ } 

这对我有用

  1. 创build了一个名为logger.go的包

     package logger import ( "flag" "os" "log" "go/build" ) var ( Log *log.Logger ) func init() { // set location of log file var logpath = build.Default.GOPATH + "/src/chat/logger/info.log" flag.Parse() var file, err1 = os.Create(logpath) if err1 != nil { panic(err1) } Log = log.New(file, "", log.LstdFlags|log.Lshortfile) Log.Println("LogFile : " + logpath) } 
    1. 导入你想要login的软件包,比如main.go

       package main import ( "logger" ) const ( VERSION = "0.13" ) func main() { // time to use our logger, print version, processID and number of running process logger.Log.Printf("Server v%s pid=%d started with processes: %d", VERSION, os.Getpid(),runtime.GOMAXPROCS(runtime.NumCPU())) } 
 import ( "os/exec" ) func main() { // check error here... exec.Command("/bin/sh", "-c", "echo "+err.Error()+" >> log.log").Run() }