Golang 切换 cmd.Stdout 是否安全?

huangapple go评论82阅读模式
英文:

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.

huangapple
  • 本文由 发表于 2014年4月9日 17:56:39
  • 转载请务必保留本文链接:https://go.coder-hub.com/22958996.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定