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
。 如果有错误,则会是*PathError
types。
编辑
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 */ }
这对我有用
-
创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) }
-
导入你想要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() }