forked from cyfdecyf/cow
-
Notifications
You must be signed in to change notification settings - Fork 2
/
log.go
129 lines (109 loc) · 2.95 KB
/
log.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package main
// This logging trick is learnt from a post by Rob Pike
// https://groups.google.com/d/msg/golang-nuts/gU7oQGoCkmg/j3nNxuS2O_sJ
import (
"flag"
"fmt"
"io"
"log"
"os"
"github.com/cyfdecyf/color"
)
type infoLogging bool
type debugLogging bool
type errorLogging bool
type requestLogging bool
type responseLogging bool
var (
info infoLogging
debug debugLogging
errl errorLogging
dbgRq requestLogging
dbgRep responseLogging
logFile io.Writer
// make sure logger can be called before initLog
errorLog = log.New(os.Stdout, "[ERROR] ", log.LstdFlags)
debugLog = log.New(os.Stdout, "[DEBUG] ", log.LstdFlags)
requestLog = log.New(os.Stdout, "[>>>>>] ", log.LstdFlags)
responseLog = log.New(os.Stdout, "[<<<<<] ", log.LstdFlags)
verbose bool
colorize bool
)
func init() {
flag.BoolVar((*bool)(&info), "info", true, "info log")
flag.BoolVar((*bool)(&debug), "debug", false, "debug log, with this option, log goes to stdout with color")
flag.BoolVar((*bool)(&errl), "err", true, "error log")
flag.BoolVar((*bool)(&dbgRq), "request", false, "request log")
flag.BoolVar((*bool)(&dbgRep), "reply", false, "reply log")
flag.BoolVar(&verbose, "v", false, "more info in request/response logging")
flag.BoolVar(&colorize, "color", false, "colorize log output")
}
func initLog() {
logFile = os.Stdout
if config.LogFile != "" {
if f, err := os.OpenFile(expandTilde(config.LogFile),
os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0600); err != nil {
fmt.Printf("Can't open log file, logging to stdout: %v\n", err)
} else {
logFile = f
}
}
log.SetOutput(logFile)
if colorize {
color.SetDefaultColor(color.ANSI)
} else {
color.SetDefaultColor(color.NoColor)
}
errorLog = log.New(logFile, color.Red("[ERROR] "), log.LstdFlags)
debugLog = log.New(logFile, color.Blue("[DEBUG] "), log.LstdFlags)
requestLog = log.New(logFile, color.Green("[>>>>>] "), log.LstdFlags)
responseLog = log.New(logFile, color.Yellow("[<<<<<] "), log.LstdFlags)
}
func (d infoLogging) Printf(format string, args ...interface{}) {
if d {
log.Printf(format, args...)
}
}
func (d infoLogging) Println(args ...interface{}) {
if d {
log.Println(args...)
}
}
func (d debugLogging) Printf(format string, args ...interface{}) {
if d {
debugLog.Printf(format, args...)
}
}
func (d debugLogging) Println(args ...interface{}) {
if d {
debugLog.Println(args...)
}
}
func (d errorLogging) Printf(format string, args ...interface{}) {
if d {
errorLog.Printf(format, args...)
}
}
func (d errorLogging) Println(args ...interface{}) {
if d {
errorLog.Println(args...)
}
}
func (d requestLogging) Printf(format string, args ...interface{}) {
if d {
requestLog.Printf(format, args...)
}
}
func (d responseLogging) Printf(format string, args ...interface{}) {
if d {
responseLog.Printf(format, args...)
}
}
func Fatal(args ...interface{}) {
fmt.Println(args...)
os.Exit(1)
}
func Fatalf(format string, args ...interface{}) {
fmt.Printf(format, args...)
os.Exit(1)
}