-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathlog.go
149 lines (126 loc) · 2.98 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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
package bingo_log
import (
"github.com/ivpusic/grpool"
"sync"
)
// log 包
// 1. 设定一个全局变量用来输出日志
// 2. 日志自动分割
// 3. 日志包含多个错误级别
// 4. 日志对象配置(日志文件的位置,自动分割规则等)
// 5. 协程池异步输出日志
const (
LogSyncMode = iota
LogPoolMode
)
const (
FATAL = iota
ERROR
WARNING
DEBUG
INFO
)
var Logger Log // 全局log
type Log struct {
Connector // 内嵌连接器,用来定制化功能
sync.Mutex
initialized bool // 该日志对象是否初始化
mode int // 日志记录模式 0 同步记录 2 协程池记录
pool *grpool.Pool // 协程池
poolExpiredTime int // 协程池模式下,每个空闲协程的存活时间(秒)
poolWorkerNum int // 协程池模式下,允许的最高协程数
}
// 初始化结构体,如果已经初始化过会再次初始化
func (l *Log) initialize() {
// 已初始化直接返回
if l.initialized == true {
return
}
if l.mode == LogPoolMode {
// 创建协程池
l.pool = grpool.NewPool(l.GetPoolWorkerNum(), l.GetPoolExpiredTime())
}
l.initialized = true
}
// 设置协程数量
func (l *Log) SetPoolWorkerNum(num int) {
l.poolWorkerNum = num
}
// 设置协程存活时间
func (l *Log) SetPoolExpiredTime(t int) {
l.poolExpiredTime = t
}
// 获取协程池中允许的协程数量
func (l *Log) GetPoolWorkerNum() int {
if l.poolWorkerNum == 0 {
l.poolWorkerNum = 100
}
return l.poolWorkerNum
}
// 获取协程池中空闲协程的存活时间(秒)
func (l *Log) GetPoolExpiredTime() int {
if l.poolExpiredTime == 0 {
l.poolExpiredTime = 50
}
return l.poolExpiredTime
}
func NewLog(mode int) *Log {
l := &Log{}
l.SetMode(mode)
l.initialize()
return l
}
// 判断该结构体是否被初始化
func (l *Log) IsInitialized() bool {
return l.initialized
}
// 设置模式
func (l *Log) SetMode(m int) {
l.mode = m
//l.initialize()
}
// 加载连接器
func (l *Log) LoadConnector(conn Connector) {
l.Connector = conn
}
// 重写5种日志级别的打印函数
func (l *Log) Fatal(message string) {
// 根据模式
l.exec(l.Connector.Fatal, message)
}
func (l *Log) Error(message string) {
l.exec(l.Connector.Error, message)
}
func (l *Log) Warning(message string) {
l.exec(l.Connector.Warning, message)
}
func (l *Log) Debug(message string) {
l.exec(l.Connector.Debug, message)
}
func (l *Log) Info(message string) {
l.exec(l.Connector.Info, message)
}
func (l *Log) exec(f func(message ...interface{}), message string) {
// 同步模式
if l.mode == LogSyncMode {
l.Lock()
defer l.Unlock()
f(message)
} else if l.mode == LogPoolMode { // 协程池异步模式
l.initialize() // 先初始化
l.Lock()
defer l.Unlock()
l.AddWaitCount(1)
l.pool.JobQueue <- func() {
f(message)
defer l.pool.JobDone()
}
}
}
// 等待所有job执行完毕
func (l *Log) WaitAll() {
l.pool.WaitAll()
}
func (l *Log) AddWaitCount(count int) {
l.pool.WaitCount(count)
}