github.com/tailscale/wireguard-go@v0.0.20201119-0.20210522003738-46b531feb08a/device/logger.go (about) 1 /* SPDX-License-Identifier: MIT 2 * 3 * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved. 4 */ 5 6 package device 7 8 import ( 9 "log" 10 "os" 11 ) 12 13 // A Logger provides logging for a Device. 14 // The functions are Printf-style functions. 15 // They must be safe for concurrent use. 16 // They do not require a trailing newline in the format. 17 // If nil, that level of logging will be silent. 18 type Logger struct { 19 Verbosef func(format string, args ...interface{}) 20 Errorf func(format string, args ...interface{}) 21 } 22 23 // Log levels for use with NewLogger. 24 const ( 25 LogLevelSilent = iota 26 LogLevelError 27 LogLevelVerbose 28 ) 29 30 // Function for use in Logger for discarding logged lines. 31 func DiscardLogf(format string, args ...interface{}) {} 32 33 // NewLogger constructs a Logger that writes to stdout. 34 // It logs at the specified log level and above. 35 // It decorates log lines with the log level, date, time, and prepend. 36 func NewLogger(level int, prepend string) *Logger { 37 logger := &Logger{DiscardLogf, DiscardLogf} 38 logf := func(prefix string) func(string, ...interface{}) { 39 return log.New(os.Stdout, prefix+": "+prepend, log.Ldate|log.Ltime).Printf 40 } 41 if level >= LogLevelVerbose { 42 logger.Verbosef = logf("DEBUG") 43 } 44 if level >= LogLevelError { 45 logger.Errorf = logf("ERROR") 46 } 47 return logger 48 }