Skip to content

Commit 8c27959

Browse files
committed
add log
1 parent 4e25556 commit 8c27959

File tree

4 files changed

+301
-0
lines changed

4 files changed

+301
-0
lines changed

log/log.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package log
2+
3+
import (
4+
"fmt"
5+
"os"
6+
)
7+
8+
var mlog = &Logger{out: os.Stdout, level: LogDebug, color: true}
9+
10+
func SetLevel(level LogLevel) {
11+
mlog.SetLevel(level)
12+
}
13+
14+
func GetLogLevel() LogLevel {
15+
return mlog.level
16+
}
17+
18+
func Info(v ...interface{}) {
19+
mlog.write(LogInfo, fmt.Sprint(v...))
20+
}
21+
22+
func Infof(format string, v ...interface{}) {
23+
mlog.write(LogInfo, format, v...)
24+
}
25+
26+
func Debug(v ...interface{}) {
27+
mlog.write(LogDebug,fmt.Sprint( v...))
28+
}
29+
30+
func Debugf(format string, v ...interface{}) {
31+
mlog.write(LogDebug, format, v...)
32+
}
33+
34+
func Warning(v ...interface{}) {
35+
mlog.write(LogWarning, fmt.Sprint( v...))
36+
}
37+
38+
func Warningf(format string, v ...interface{}) {
39+
mlog.write(LogWarning, format, v...)
40+
}
41+
42+
func Error(v ...interface{}) {
43+
mlog.write(LogError, fmt.Sprint( v...))
44+
}
45+
46+
func Errorf(format string, v ...interface{}) {
47+
mlog.write(LogError, format, v...)
48+
}
49+
50+
func Fatal(v ...interface{}) {
51+
mlog.write(LogFatal, fmt.Sprint( v...))
52+
}
53+
54+
func Fatalf(format string, v ...interface{}) {
55+
mlog.write(LogFatal, format, v...)
56+
}
57+
58+
func SetLevelByString(level string) {
59+
mlog.SetLevelByString(level)
60+
}
61+
62+
func SetColor(color bool) {
63+
mlog.SetColor(color)
64+
}

log/log_level.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package log
2+
3+
import ()
4+
5+
type LogLevel int
6+
7+
const (
8+
LogFatal LogLevel = iota
9+
LogError
10+
LogWarning
11+
LogInfo
12+
LogDebug
13+
)
14+
15+
//StringToLogLevel 字符串转LogLevel.
16+
func StringToLogLevel(level string) LogLevel {
17+
switch level {
18+
case "fatal":
19+
return LogFatal
20+
case "error":
21+
return LogError
22+
case "warn":
23+
return LogWarning
24+
case "warning":
25+
return LogWarning
26+
case "debug":
27+
return LogDebug
28+
case "info":
29+
return LogInfo
30+
}
31+
return LogDebug
32+
}
33+
34+
//LogLevel loglevel 转字符串.
35+
func (l LogLevel) String() string {
36+
switch l {
37+
case LogFatal:
38+
return "fatal"
39+
case LogError:
40+
return "error"
41+
case LogWarning:
42+
return "warning"
43+
case LogDebug:
44+
return "debug"
45+
case LogInfo:
46+
return "info"
47+
}
48+
return "unknown"
49+
}
50+
51+
//LogLevel loglevel转颜色.
52+
func (l LogLevel) Color() string {
53+
switch l {
54+
case LogFatal:
55+
return "\033[0;31m"
56+
case LogError:
57+
return "\033[0;31m"
58+
case LogWarning:
59+
return "\033[0;33m"
60+
case LogDebug:
61+
return "\033[0;36m"
62+
case LogInfo:
63+
return "\033[0;32m"
64+
}
65+
return "\033[0;37m"
66+
}

log/log_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package log
2+
3+
import (
4+
"testing"
5+
"time"
6+
)
7+
8+
func TestLog(t *testing.T) {
9+
Debug("default log begin 11111111")
10+
Debugf("%s, %+v", "abc", mlog)
11+
Infof("%v test log", time.Now())
12+
13+
l := NewLogger()
14+
l.Info("logger 2222222222")
15+
l.Errorf("logger color %v xxxxxx", time.Now().UnixNano())
16+
l.SetColor(false)
17+
l.Errorf("logger no color %v yyyyyy", time.Now().UnixNano())
18+
Infof("%v default has color test log", time.Now())
19+
}

log/log_writer.go

Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
package log
2+
3+
import (
4+
"bytes"
5+
"fmt"
6+
"os"
7+
"runtime"
8+
"sync"
9+
"time"
10+
)
11+
12+
type Logger struct {
13+
out *os.File
14+
level LogLevel
15+
color bool
16+
mu sync.Mutex
17+
}
18+
19+
//NewLogger 创建日志对象.
20+
func NewLogger() *Logger {
21+
return &Logger{
22+
out: os.Stdout,
23+
level: LogDebug,
24+
color: true,
25+
}
26+
}
27+
28+
//SetColor 开启/关闭颜色.
29+
func (l *Logger) SetColor(on bool) *Logger {
30+
l.color = on
31+
return l
32+
}
33+
34+
//SetLevel 设置日志级别.
35+
func (l *Logger) SetLevel(level LogLevel) {
36+
l.level = level
37+
}
38+
39+
//SetLevelByString 设置字符串格式的日志级别.
40+
func (l *Logger) SetLevelByString(level string) {
41+
l.level = StringToLogLevel(level)
42+
}
43+
44+
type pos struct {
45+
file string
46+
line int
47+
name string
48+
}
49+
50+
type posCache struct {
51+
ps map[uintptr]pos
52+
sync.RWMutex
53+
}
54+
55+
var mpc = posCache{ps: make(map[uintptr]pos)}
56+
57+
func (l *Logger) caller() (string, int, string) {
58+
pc, file, line, _ := runtime.Caller(3)
59+
60+
mpc.RLock()
61+
p, ok := mpc.ps[pc]
62+
mpc.RUnlock()
63+
64+
if ok {
65+
return p.file, p.line, p.name
66+
}
67+
68+
name := runtime.FuncForPC(pc).Name()
69+
if i := bytes.LastIndexAny([]byte(name), "."); i != -1 {
70+
name = name[i+1:]
71+
}
72+
if i := bytes.LastIndexAny([]byte(file), "/"); i != -1 {
73+
file = file[i+1:]
74+
}
75+
76+
mpc.Lock()
77+
mpc.ps[pc] = pos{file: file, line: line, name: name}
78+
mpc.Unlock()
79+
80+
return file, line, name
81+
}
82+
83+
func (l *Logger) write(t LogLevel, format string, argv ...interface{}) {
84+
if t > l.level {
85+
return
86+
}
87+
88+
date := time.Now().Format("2006/01/02 15:04:05")
89+
90+
file, line, name := l.caller()
91+
92+
//时间,源码文件,源码列
93+
fmt.Fprintf(l.out, "%s %s:%d ", date, file, line)
94+
if l.color {
95+
//颜色开始
96+
fmt.Fprint(l.out, t.Color())
97+
}
98+
99+
//函数名
100+
fmt.Fprintf(l.out, "%s %s ", t.String(), name)
101+
102+
fmt.Fprintf(l.out, format, argv...)
103+
104+
if l.color {
105+
//颜色结束
106+
fmt.Fprint(l.out, "\033[0m")
107+
}
108+
109+
l.out.WriteString("\n")
110+
}
111+
112+
func (l *Logger) Info(v ...interface{}) {
113+
l.write(LogInfo, fmt.Sprint(v...))
114+
}
115+
116+
func (l *Logger) Infof(format string, v ...interface{}) {
117+
l.write(LogInfo, format, v...)
118+
}
119+
120+
func (l *Logger) Debug(v ...interface{}) {
121+
l.write(LogDebug, fmt.Sprint(v...))
122+
}
123+
124+
func (l *Logger) Debugf(format string, v ...interface{}) {
125+
l.write(LogDebug, format, v...)
126+
}
127+
128+
func (l *Logger) Warning(v ...interface{}) {
129+
l.write(LogWarning, fmt.Sprint(v...))
130+
}
131+
132+
func (l *Logger) Warningf(format string, v ...interface{}) {
133+
l.write(LogWarning, format, v...)
134+
}
135+
136+
func (l *Logger) Error(v ...interface{}) {
137+
l.write(LogError, fmt.Sprint(v...))
138+
}
139+
140+
func (l *Logger) Errorf(format string, v ...interface{}) {
141+
l.write(LogError, format, v...)
142+
}
143+
144+
func (l *Logger) Fatal(v ...interface{}) {
145+
l.write(LogFatal, fmt.Sprint(v...))
146+
os.Exit(-1)
147+
}
148+
149+
func (l *Logger) Fatalf(format string, v ...interface{}) {
150+
l.write(LogFatal, format, v...)
151+
os.Exit(-1)
152+
}

0 commit comments

Comments
 (0)