The Very Log lib for golang
Each logger has a name, there is only one logger for same name. You can pass a name, or just using current package name as logger name:
var logger = vlog.GetLogger(loggerName) // specify a logger name
var logger = vlog.CurrentPackageLogger() // using full package name as logger name
Logger has six levels: Trace/Debug/Info/Warn/Error/Critical. Log methods can use format string to format params, if has more params than placeholders, the remain params will be output after formatted string.
logger.Info("start the server")
logger.Info("start the server at {}:{}", host, port)
logger.Info("start the server at", host+":"+strconv.itoa(port))
logger.Error("start server error:", err)
logger.Error("start server {}:{} error:", host, port, err)
Loggers also have XxxxEnabled methods, to avoid unnecessary converting cost:
if logger.DebugEnabled() {
logger.Debug("server accept connection:", expensiveConvert(conn))
}
Or just use Lazy logger methods:
logger.LazyDebug(func() string {
return "server accept connection:" + expensiveConvertToString(conn)
})
By default, logger only output message with info level or above, using default message format, to standard output. To change this, set custom Appender/Level/Transformer to the logger.
var logger = vlog.CurrentPackageLogger()
func init() {
appender := vlog.NewConsoleAppender()
// custom log format
transformer, _ := vlog.NewPatternTransformer("{time} [{Level}] {file}:{line} - {message}\n")
appender.SetTransformer(transformer)
// using custom appender
logger.SetAppenders(appender)
// set level to debug, will output all message with level equal or higher than Debug
logger.SetLevel(vlog.Debug)
}
If using FileAppender to write log into file, a log rotater can be set to rotate log file, by log file size or time.
// appender without rotater
appender := vlog.NewFileAppender("path/to/logfile", nil)
// appender with rotater rotate log file every 800m
rotater := vlog.NewSizeRotater(800 * 1024*1024, 6)
appender := vlog.NewFileAppender("path/to/logfile", rotater)
// appender with rotater rotate log file every day
rotater := vlog.NewDailyRotater("20060102")
appender := vlog.NewFileAppender("path/to/logfile", rotater)
Loggers' level can be set by one environ: VLOG_LEVEL. The level set by environ will override the level set in code. So you can set logger by code in your final or in your lib in development, when final routine is deployed, you can set the environ meet your real need.
For example, run program in linux shell, you can set as follows:
export VLOG_LEVEL="package1=Warn;github.com/user1=Debug"
If use package path as logger name, vlog will match the setting by prefix. It means github.com/user1=Debug will take effect for logger with name github.com/user1/lib.
Appender Type | Create by Code |
---|---|
ConsoleAppender | NewConsoleAppender |
ConsoleAppender | NewConsole2Appender |
FileAppender | NewFileAppender |
SyslogAppender | SyslogAppender |
NopAppender | NewNopAppender |
Rotater Type | Create by Code |
---|---|
TimeRotater | NewDailyRotater |
TimeRotater | NewHourlyRotater |
TimeRotater | NewTimeRotater |
SizeRotater | NewSizeRotater |
Transformer Type | Create by Code |
---|---|
PatternTransformer | NewPatternTransformer |
Below variables can be used in PatternTransformer format string:
- {file} filename
- {package} package name
- {line} line number
- {function} function name
- {time} time
- {logger} the logger name
- {Level}/{level}/{LEVEL} the logger level, with different character case
- {message} the log message
Use {{ to escape {, use }} to escape }
{time} can set custom format via filter, by {time|2006-01-02 15:04:05.000}