英文:
Golang is it safe to switch cmd.Stdout
问题
你想要执行一个Go进程,并将输出写入文件(日志文件)。你想要每天更换日志文件并进行日志轮转。
在Go中,可以通过更改cmd.Stdout
变量来将输出重定向到不同的文件。但是,如果你希望在任意的goroutine中每天更换日志文件并进行日志轮转,最好实现一个goroutine来从Stdout
复制到另一个文件并切换文件。
这样做的原因是,如果多个goroutine同时尝试更改cmd.Stdout
变量,可能会导致竞态条件和不确定的行为。通过实现一个专门的goroutine来处理日志文件的切换和复制,可以确保线程安全并避免潜在的问题。
你可以使用io.Copy()
函数来复制Stdout
的内容到另一个文件中。然后,在每天更换日志文件时,你可以关闭当前的日志文件,创建一个新的日志文件,并将Stdout
重定向到新的日志文件。
希望这可以帮助到你!
英文:
I execute process with Go and write output to file (log file)
cmd := exec.Command(path)
cmd.Dir = dir
t := time.Now()
t1 := t.Format("20060102-150405")
fs, err := os.Create(dir + "/var/log/" + t1 + ".std")
if err == nil {
cmd.Stdout = fs
}
I wish to rotate logs and change log file daily
http://golang.org/pkg/os/exec/
// Stdout and Stderr specify the process's standard output and error.
//
// If either is nil, Run connects the corresponding file descriptor
// to the null device (os.DevNull).
//
// If Stdout and Stderr are the same writer, at most one
// goroutine at a time will call Write.
Stdout io.Writer
Stderr io.Writer
Is it safe to change cmd.Stdout variable daily from arbitary goroutine or I have to implement goroutine that will copy from Stdout to another file and switch files?
答案1
得分: 6
直接更改这些变量是安全的。然而,如果在命令实际运行后再更改它们,它们对实际运行的子进程没有任何影响。要实时旋转正在运行的进程的输出,您需要在进程本身中实现,或者通过父进程将所有内容进行管道传输,并像您建议的那样使用 goroutine。
英文:
It is safe to change those variables directly. However, if you change them once the command has actually been run then they will have no effect on the actual running child process. To rotate the output of the running process "live" you will have to implement that in the process itself, or pipe everything through the parent and use a goroutine as you suggest.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论