Debugging shows file/lineno.

This commit is contained in:
Kyle Isom 2015-09-22 15:14:36 -07:00
parent ea689c7e97
commit b933a136f3
3 changed files with 64 additions and 13 deletions

View File

@ -8,13 +8,17 @@ import (
) )
var log = logging.Init() var log = logging.Init()
var olog = logging.New("subsystem #42", logging.LevelNotice) var olog, _ = logging.New("subsystem #42", logging.LevelNotice)
func main() { func main() {
exampleNewWriters() exampleNewWriters()
log.Notice("Hello, world.") log.Notice("Hello, world.")
log.Warning("this program is about to end") log.Warning("this program is about to end")
log.SetLevel(logging.LevelDebug)
log.Debug("hello world")
log.SetLevel(logging.LevelNotice)
olog.Print("now online") olog.Print("now online")
logging.Suppress("olog") logging.Suppress("olog")
olog.Print("extraneous information") olog.Print("extraneous information")
@ -41,7 +45,7 @@ func exampleNewWriters() {
o := testio.NewBufCloser(nil) o := testio.NewBufCloser(nil)
e := testio.NewBufCloser(nil) e := testio.NewBufCloser(nil)
wlog := logging.NewFromWriters("writers", logging.DefaultLevel, o, e) wlog, _ := logging.NewFromWriters("writers", logging.DefaultLevel, o, e)
wlog.Notice("hello, world") wlog.Notice("hello, world")
wlog.Notice("some more things happening") wlog.Notice("some more things happening")
wlog.Warning("something suspicious has happened") wlog.Warning("something suspicious has happened")

View File

@ -3,6 +3,7 @@ package logging
import ( import (
"fmt" "fmt"
"os" "os"
"runtime"
"time" "time"
) )
@ -43,6 +44,24 @@ const (
LevelFatal LevelFatal
) )
// Cheap integer to fixed-width decimal ASCII. Give a negative width
// to avoid zero-padding. (From log/log.go in the standard library).
func itoa(i int, wid int) string {
// Assemble decimal in reverse order.
var b [20]byte
bp := len(b) - 1
for i >= 10 || wid > 1 {
wid--
q := i / 10
b[bp] = byte('0' + i - q*10)
bp--
i = q
}
// i < 10
b[bp] = byte('0' + i)
return string(b[bp:])
}
func writeToOut(level Level) bool { func writeToOut(level Level) bool {
if level < LevelWarning { if level < LevelWarning {
return true return true
@ -69,9 +88,17 @@ func (l *Logger) outputf(level Level, format string, v []interface{}) {
} }
if level >= l.level { if level >= l.level {
domain := l.domain
if level == LevelDebug {
_, file, line, ok := runtime.Caller(2)
if ok {
domain += " " + file + ":" + itoa(line, -1)
}
}
format = fmt.Sprintf("%s %s: %s%s\n", format = fmt.Sprintf("%s %s: %s%s\n",
time.Now().Format(DateFormat), time.Now().Format(DateFormat),
l.domain, levelPrefix[level], format) domain, levelPrefix[level], format)
if writeToOut(level) { if writeToOut(level) {
fmt.Fprintf(l.out, format, v...) fmt.Fprintf(l.out, format, v...)
} else { } else {
@ -86,9 +113,17 @@ func (l *Logger) output(level Level, v []interface{}) {
} }
if level >= l.level { if level >= l.level {
domain := l.domain
if level == LevelDebug {
_, file, line, ok := runtime.Caller(2)
if ok {
domain += " " + file + ":" + itoa(line, -1)
}
}
format := fmt.Sprintf("%s %s: %s", format := fmt.Sprintf("%s %s: %s",
time.Now().Format(DateFormat), time.Now().Format(DateFormat),
l.domain, levelPrefix[level]) domain, levelPrefix[level])
if writeToOut(level) { if writeToOut(level) {
fmt.Fprintf(l.out, format) fmt.Fprintf(l.out, format)
fmt.Fprintln(l.out, v...) fmt.Fprintln(l.out, v...)
@ -179,7 +214,8 @@ func (l *Logger) Info(v ...interface{}) {
} }
// Debugf logs a formatted message at the "debug" level. The arguments // Debugf logs a formatted message at the "debug" level. The arguments
// are handled in the same manner as fmt.Printf. // are handled in the same manner as fmt.Printf. Note that debug
// logging will print the current
func (l *Logger) Debugf(format string, v ...interface{}) { func (l *Logger) Debugf(format string, v ...interface{}) {
l.outputf(LevelDebug, format, v) l.outputf(LevelDebug, format, v)
} }

View File

@ -1,8 +1,15 @@
// Package logging is an adaptation of the CFSSL logging library. It // Package logging provides domain-based logging in the same style as
// operates on domains, which are components for which logging can be // sylog. Domains are some name for which logging can be selectively
// selectively enabled or disabled. It also differentiates between // enabled or disabled. Logging also differentiates between normal
// normal messages (which are sent to standard output) and errors, // messages (which are sent to standard output) and errors, which are
// which are sent to standard error. // sent to standard error; debug messages will also include the file
// and line number.
//
// Domains are intended for identifying logging subystems. A domain
// can be suppressed with Suppress, and re-enabled with Enable. There
// are prefixed versions of these as well.
//
// This package was adapted from the CFSSL logging code.
package logging package logging
import ( import (
@ -159,6 +166,10 @@ func NewFromWriters(domain string, level Level, w, e io.WriteCloser) (l *Logger,
return l, true return l, true
} }
if w == nil {
w = os.Stdout
}
if e == nil { if e == nil {
e = w e = w
} }
@ -179,19 +190,19 @@ func NewFromWriters(domain string, level Level, w, e io.WriteCloser) (l *Logger,
// NewFile returns a new logger that opens the files for writing. If // NewFile returns a new logger that opens the files for writing. If
// multiplex is true, output will be multiplexed to standard output // multiplex is true, output will be multiplexed to standard output
// and standard error as well. // and standard error as well.
func NewFromFile(domain string, level Level, outFile, errFile string, multiplex bool) (*Logger, error) { func NewFromFile(domain string, level Level, outFile, errFile string, multiplex bool, flags int) (*Logger, error) {
l := &Logger{ l := &Logger{
domain: domain, domain: domain,
level: level, level: level,
lock: new(sync.Mutex), lock: new(sync.Mutex),
} }
outf, err := os.OpenFile(outFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) outf, err := os.OpenFile(outFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY|flags, 0644)
if err != nil { if err != nil {
return nil, err return nil, err
} }
errf, err := os.OpenFile(errFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) errf, err := os.OpenFile(errFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY|flags, 0644)
if err != nil { if err != nil {
return nil, err return nil, err
} }