package utils
import (
"fmt"
"log"
"os"
"strings"
"time"
)
type LogLevel uint8
const (
LogLevelNothing LogLevel = iota
LogLevelError
LogLevelInfo
LogLevelDebug
)
const logEnv = "QUIC_GO_LOG_LEVEL"
type Logger interface {
SetLogLevel (LogLevel )
SetLogTimeFormat (format string )
WithPrefix (prefix string ) Logger
Debug () bool
Errorf (format string , args ...any )
Infof (format string , args ...any )
Debugf (format string , args ...any )
}
var DefaultLogger Logger
type defaultLogger struct {
prefix string
logLevel LogLevel
timeFormat string
}
var _ Logger = &defaultLogger {}
func (l *defaultLogger ) SetLogLevel (level LogLevel ) {
l .logLevel = level
}
func (l *defaultLogger ) SetLogTimeFormat (format string ) {
log .SetFlags (0 )
l .timeFormat = format
}
func (l *defaultLogger ) Debugf (format string , args ...any ) {
if l .logLevel == LogLevelDebug {
l .logMessage (format , args ...)
}
}
func (l *defaultLogger ) Infof (format string , args ...any ) {
if l .logLevel >= LogLevelInfo {
l .logMessage (format , args ...)
}
}
func (l *defaultLogger ) Errorf (format string , args ...any ) {
if l .logLevel >= LogLevelError {
l .logMessage (format , args ...)
}
}
func (l *defaultLogger ) logMessage (format string , args ...any ) {
var pre string
if len (l .timeFormat ) > 0 {
pre = time .Now ().Format (l .timeFormat ) + " "
}
if len (l .prefix ) > 0 {
pre += l .prefix + " "
}
log .Printf (pre +format , args ...)
}
func (l *defaultLogger ) WithPrefix (prefix string ) Logger {
if len (l .prefix ) > 0 {
prefix = l .prefix + " " + prefix
}
return &defaultLogger {
logLevel : l .logLevel ,
timeFormat : l .timeFormat ,
prefix : prefix ,
}
}
func (l *defaultLogger ) Debug () bool {
return l .logLevel == LogLevelDebug
}
func init() {
DefaultLogger = &defaultLogger {}
DefaultLogger .SetLogLevel (readLoggingEnv ())
}
func readLoggingEnv() LogLevel {
switch strings .ToLower (os .Getenv (logEnv )) {
case "" :
return LogLevelNothing
case "debug" :
return LogLevelDebug
case "info" :
return LogLevelInfo
case "error" :
return LogLevelError
default :
fmt .Fprintln (os .Stderr , "invalid quic-go log level, see https://github.com/quic-go/quic-go/wiki/Logging" )
return LogLevelNothing
}
}
The pages are generated with Golds v0.8.4 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .