Patch for concurrent iterator & others (onto v1.11.6) #386

Closed
roysc wants to merge 1565 commits from v1.11.6-statediff-v5 into master
Showing only changes of commit 5b4c149f97 - Show all commits

View File

@ -54,6 +54,11 @@ var (
Usage: "Format logs with JSON", Usage: "Format logs with JSON",
Category: flags.LoggingCategory, Category: flags.LoggingCategory,
} }
logFileFlag = &cli.StringFlag{
Name: "log.file",
Usage: "Write logs to a file",
Category: flags.LoggingCategory,
}
backtraceAtFlag = &cli.StringFlag{ backtraceAtFlag = &cli.StringFlag{
Name: "log.backtrace", Name: "log.backtrace",
Usage: "Request a stack trace at a specific logging statement (e.g. \"block.go:271\")", Usage: "Request a stack trace at a specific logging statement (e.g. \"block.go:271\")",
@ -110,6 +115,7 @@ var Flags = []cli.Flag{
verbosityFlag, verbosityFlag,
vmoduleFlag, vmoduleFlag,
logjsonFlag, logjsonFlag,
logFileFlag,
backtraceAtFlag, backtraceAtFlag,
debugFlag, debugFlag,
pprofFlag, pprofFlag,
@ -121,7 +127,10 @@ var Flags = []cli.Flag{
traceFlag, traceFlag,
} }
var glogger *log.GlogHandler var (
glogger *log.GlogHandler
logOutputStream log.Handler
)
func init() { func init() {
glogger = log.NewGlogHandler(log.StreamHandler(os.Stderr, log.TerminalFormat(false))) glogger = log.NewGlogHandler(log.StreamHandler(os.Stderr, log.TerminalFormat(false)))
@ -132,18 +141,30 @@ func init() {
// Setup initializes profiling and logging based on the CLI flags. // Setup initializes profiling and logging based on the CLI flags.
// It should be called as early as possible in the program. // It should be called as early as possible in the program.
func Setup(ctx *cli.Context) error { func Setup(ctx *cli.Context) error {
var ostream log.Handler logFile := ctx.String(logFileFlag.Name)
output := io.Writer(os.Stderr) useColor := logFile == "" && os.Getenv("TERM") != "dumb" && (isatty.IsTerminal(os.Stderr.Fd()) || isatty.IsCygwinTerminal(os.Stderr.Fd()))
var logfmt log.Format
if ctx.Bool(logjsonFlag.Name) { if ctx.Bool(logjsonFlag.Name) {
ostream = log.StreamHandler(output, log.JSONFormat()) logfmt = log.JSONFormat()
} else { } else {
usecolor := (isatty.IsTerminal(os.Stderr.Fd()) || isatty.IsCygwinTerminal(os.Stderr.Fd())) && os.Getenv("TERM") != "dumb" logfmt = log.TerminalFormat(useColor)
if usecolor { }
if logFile != "" {
var err error
logOutputStream, err = log.FileHandler(logFile, logfmt)
if err != nil {
return err
}
} else {
output := io.Writer(os.Stderr)
if useColor {
output = colorable.NewColorableStderr() output = colorable.NewColorableStderr()
} }
ostream = log.StreamHandler(output, log.TerminalFormat(usecolor)) logOutputStream = log.StreamHandler(output, logfmt)
} }
glogger.SetHandler(ostream) glogger.SetHandler(logOutputStream)
// logging // logging
verbosity := ctx.Int(verbosityFlag.Name) verbosity := ctx.Int(verbosityFlag.Name)
@ -217,4 +238,7 @@ func StartPProf(address string, withMetrics bool) {
func Exit() { func Exit() {
Handler.StopCPUProfile() Handler.StopCPUProfile()
Handler.StopGoTrace() Handler.StopGoTrace()
if closer, ok := logOutputStream.(io.Closer); ok {
closer.Close()
}
} }