| // Copyright 2013, Örjan Persson. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package logging |
| |
| import ( |
| "bytes" |
| "fmt" |
| "io" |
| "log" |
| ) |
| |
| // TODO initialize here |
| var colors []string |
| var boldcolors []string |
| |
| type color int |
| |
| const ( |
| colorBlack = (iota + 30) |
| colorRed |
| colorGreen |
| colorYellow |
| colorBlue |
| colorMagenta |
| colorCyan |
| colorWhite |
| ) |
| |
| // LogBackend utilizes the standard log module. |
| type LogBackend struct { |
| Logger *log.Logger |
| Color bool |
| } |
| |
| // NewLogBackend creates a new LogBackend. |
| func NewLogBackend(out io.Writer, prefix string, flag int) *LogBackend { |
| return &LogBackend{Logger: log.New(out, prefix, flag)} |
| } |
| |
| func (b *LogBackend) Log(level Level, calldepth int, rec *Record) error { |
| if b.Color { |
| buf := &bytes.Buffer{} |
| buf.Write([]byte(colors[level])) |
| buf.Write([]byte(rec.Formatted(calldepth + 1))) |
| buf.Write([]byte("\033[0m")) |
| // For some reason, the Go logger arbitrarily decided "2" was the correct |
| // call depth... |
| return b.Logger.Output(calldepth+2, buf.String()) |
| } else { |
| return b.Logger.Output(calldepth+2, rec.Formatted(calldepth+1)) |
| } |
| panic("should not be reached") |
| } |
| |
| func colorSeq(color color) string { |
| return fmt.Sprintf("\033[%dm", int(color)) |
| } |
| |
| func colorSeqBold(color color) string { |
| return fmt.Sprintf("\033[%d;1m", int(color)) |
| } |
| |
| func init() { |
| colors = []string{ |
| CRITICAL: colorSeq(colorMagenta), |
| ERROR: colorSeq(colorRed), |
| WARNING: colorSeq(colorYellow), |
| NOTICE: colorSeq(colorGreen), |
| DEBUG: colorSeq(colorCyan), |
| } |
| boldcolors = []string{ |
| CRITICAL: colorSeqBold(colorMagenta), |
| ERROR: colorSeqBold(colorRed), |
| WARNING: colorSeqBold(colorYellow), |
| NOTICE: colorSeqBold(colorGreen), |
| DEBUG: colorSeqBold(colorCyan), |
| } |
| } |