In Go, trace logging presents a unique challenge: minimizing the cost of disabled log statements in critical paths. Unlike C/C , Go does not have preprocessor macros, making it necessary to explore alternative solutions.
One approach involves using the fmt.Stringer and fmt.GoStringer interfaces. By delaying formatting until log execution, expensive function calls in the logging arguments can be avoided:
type LogFormatter interface { LogFormat() string } // Inside the logger if i, ok := i.(LogFormatter); ok { fmt.Println(i.LogFormat()) }
Another strategy is to swap out the logger at runtime using a logger interface or at build time using build constraints. However, this requires ensuring that no expensive calls are inserted into the logging arguments.
A third option is to define the Logger itself as a bool, reducing verbosity while providing a terse way to control logging:
type Log bool func (l Log) Println(args ...interface{}) { fmt.Println(args...) } var debug Log = false if debug { debug.Println("DEBUGGING") }
Finally, code generation can be explored, though it is not suitable for runtime configuration. By employing gofmt -r or building files using text/template, it is possible to create separate debug builds for specific debugging scenarios.
Disclaimer: All resources provided are partly from the Internet. If there is any infringement of your copyright or other rights and interests, please explain the detailed reasons and provide proof of copyright or rights and interests and then send it to the email: [email protected] We will handle it for you as soon as possible.
Copyright© 2022 湘ICP备2022001581号-3