I’m not saying it’s your only option, just that it seems like a better option than changing os.Stdout and/or os.Stderr. There might be some initialization in some package somewhere that caches the value of os.Stdout before you change it; for example:
package "somepackage"
var someKindOfLogger = &logger{
writer: os.Stderr,
// ...
}
func logSomethingOnPanic() {
someKindOfLogger.WriteSomething() // uses someKindOfLogger.writer which is
// the value of os.Stderr before you changed it.
}
package "main"
func main() {
os.Stderr = createStderrReplacementFile() // this doesn't help because other
// init code already cached the value of os.Stderr somewhere.
doSomethingThatPanics()
}
If you redirect stderr and stdout, there is no timing issue related to changing os.Stdout before or after it’s been cached somewhere.