@@ -7,73 +7,73 @@ logrus是用Go语言实现的一个日志系统,与标准库log完全兼容并
7
7
首先安装logrus
8
8
``` Go
9
9
10
- go get -u github.com /sirupsen/logrus
10
+ go get -u github.com /sirupsen/logrus
11
11
12
12
```
13
13
14
14
简单例子:
15
15
16
16
``` Go
17
17
18
- package main
18
+ package main
19
19
20
- import (
21
- log " github.com/Sirupsen/logrus"
22
- )
20
+ import (
21
+ log " github.com/Sirupsen/logrus"
22
+ )
23
23
24
- func main () {
25
- log.WithFields (log.Fields {
26
- " animal" : " walrus" ,
27
- }).Info (" A walrus appears" )
28
- }
24
+ func main () {
25
+ log.WithFields (log.Fields {
26
+ " animal" : " walrus" ,
27
+ }).Info (" A walrus appears" )
28
+ }
29
29
```
30
30
### 基于logrus的自定义日志处理
31
31
``` Go
32
32
33
- package main
33
+ package main
34
34
35
- import (
36
- log " github.com/Sirupsen/logrus"
37
- " os"
38
- )
35
+ import (
36
+ log " github.com/Sirupsen/logrus"
37
+ " os"
38
+ )
39
39
40
- func init () {
41
- // 日志格式化为JSON而不是默认的ASCII
42
- log.SetFormatter (&log.JSONFormatter {})
40
+ func init () {
41
+ // 日志格式化为JSON而不是默认的ASCII
42
+ log.SetFormatter (&log.JSONFormatter {})
43
43
44
- // 输出stdout而不是默认的stderr,也可以是一个文件
45
- log.SetOutput (os.Stdout )
44
+ // 输出stdout而不是默认的stderr,也可以是一个文件
45
+ log.SetOutput (os.Stdout )
46
46
47
- // 只记录严重或以上警告
48
- log.SetLevel (log.WarnLevel )
49
- }
47
+ // 只记录严重或以上警告
48
+ log.SetLevel (log.WarnLevel )
49
+ }
50
50
51
- func main () {
52
- log.WithFields (log.Fields {
53
- " animal" : " walrus" ,
54
- " size" : 10 ,
55
- }).Info (" A group of walrus emerges from the ocean" )
56
-
57
- log.WithFields (log.Fields {
58
- " omg" : true ,
59
- " number" : 122 ,
60
- }).Warn (" The group's number increased tremendously!" )
61
-
62
- log.WithFields (log.Fields {
63
- " omg" : true ,
64
- " number" : 100 ,
65
- }).Fatal (" The ice breaks!" )
66
-
67
- // 通过日志语句重用字段
68
- // logrus.Entry返回自WithFields()
69
- contextLogger := log.WithFields (log.Fields {
70
- " common" : " this is a common field" ,
71
- " other" : " I also should be logged always" ,
72
- })
73
-
74
- contextLogger.Info (" I'll be logged with common and other field" )
75
- contextLogger.Info (" Me too" )
76
- }
51
+ func main () {
52
+ log.WithFields (log.Fields {
53
+ " animal" : " walrus" ,
54
+ " size" : 10 ,
55
+ }).Info (" A group of walrus emerges from the ocean" )
56
+
57
+ log.WithFields (log.Fields {
58
+ " omg" : true ,
59
+ " number" : 122 ,
60
+ }).Warn (" The group's number increased tremendously!" )
61
+
62
+ log.WithFields (log.Fields {
63
+ " omg" : true ,
64
+ " number" : 100 ,
65
+ }).Fatal (" The ice breaks!" )
66
+
67
+ // 通过日志语句重用字段
68
+ // logrus.Entry返回自WithFields()
69
+ contextLogger := log.WithFields (log.Fields {
70
+ " common" : " this is a common field" ,
71
+ " other" : " I also should be logged always" ,
72
+ })
73
+
74
+ contextLogger.Info (" I'll be logged with common and other field" )
75
+ contextLogger.Info (" Me too" )
76
+ }
77
77
```
78
78
79
79
## seelog介绍
@@ -95,20 +95,20 @@ seelog是用Go语言实现的一个日志系统,它提供了一些简单的函
95
95
首先安装seelog
96
96
``` Go
97
97
98
- go get -u github.com /cihub/seelog
98
+ go get -u github.com /cihub/seelog
99
99
100
100
```
101
101
然后我们来看一个简单的例子:
102
102
``` Go
103
103
104
- package main
104
+ package main
105
105
106
- import log " github.com/cihub/seelog"
106
+ import log " github.com/cihub/seelog"
107
107
108
- func main () {
109
- defer log.Flush ()
110
- log.Info (" Hello from Seelog!" )
111
- }
108
+ func main () {
109
+ defer log.Flush ()
110
+ log.Info (" Hello from Seelog!" )
111
+ }
112
112
113
113
```
114
114
编译后运行如果出现了` Hello from seelog ` ,说明seelog日志系统已经成功安装并且可以正常运行了。
@@ -117,59 +117,59 @@ seelog是用Go语言实现的一个日志系统,它提供了一些简单的函
117
117
seelog支持自定义日志处理,下面是我基于它自定义的日志处理包的部分内容:
118
118
``` Go
119
119
120
- package logs
121
-
122
- import (
123
- // "errors"
124
- " fmt"
125
- seelog " github.com/cihub/seelog"
126
- // "io"
127
- )
128
-
129
- var Logger seelog.LoggerInterface
130
-
131
- func loadAppConfig () {
132
- appConfig := `
133
- <seelog minlevel="warn">
134
- <outputs formatid="common">
135
- <rollingfile type="size" filename="/data/logs/roll.log" maxsize="100000" maxrolls="5"/>
136
- <filter levels="critical">
137
- <file path="/data/logs/critical.log" formatid="critical"/>
138
- <smtp formatid="criticalemail" senderaddress="[email protected] " sendername="ShortUrl API" hostname="smtp.gmail.com" hostport="587" username="mailusername" password="mailpassword">
139
- <recipient address="[email protected] "/>
140
- </smtp>
141
- </filter>
142
- </outputs>
143
- <formats>
144
- <format id="common" format="%Date/%Time [%LEV] %Msg%n" />
145
- <format id="critical" format="%File %FullPath %Func %Msg%n" />
146
- <format id="criticalemail" format="Critical error on our server!\n %Time %Date %RelFile %Func %Msg \nSent by Seelog"/>
147
- </formats>
148
- </seelog>
149
- `
150
- logger , err := seelog.LoggerFromConfigAsBytes ([]byte (appConfig))
151
- if err != nil {
152
- fmt.Println (err)
153
- return
154
- }
155
- UseLogger (logger)
156
- }
157
-
158
- func init () {
159
- DisableLog ()
160
- loadAppConfig ()
161
- }
162
-
163
- // DisableLog disables all library log output
164
- func DisableLog () {
165
- Logger = seelog.Disabled
166
- }
167
-
168
- // UseLogger uses a specified seelog.LoggerInterface to output library log.
169
- // Use this func if you are using Seelog logging system in your app.
170
- func UseLogger (newLogger seelog .LoggerInterface ) {
171
- Logger = newLogger
120
+ package logs
121
+
122
+ import (
123
+ // "errors"
124
+ " fmt"
125
+ seelog " github.com/cihub/seelog"
126
+ // "io"
127
+ )
128
+
129
+ var Logger seelog.LoggerInterface
130
+
131
+ func loadAppConfig () {
132
+ appConfig := `
133
+ <seelog minlevel="warn">
134
+ <outputs formatid="common">
135
+ <rollingfile type="size" filename="/data/logs/roll.log" maxsize="100000" maxrolls="5"/>
136
+ <filter levels="critical">
137
+ <file path="/data/logs/critical.log" formatid="critical"/>
138
+ <smtp formatid="criticalemail" senderaddress="[email protected] " sendername="ShortUrl API" hostname="smtp.gmail.com" hostport="587" username="mailusername" password="mailpassword">
139
+ <recipient address="[email protected] "/>
140
+ </smtp>
141
+ </filter>
142
+ </outputs>
143
+ <formats>
144
+ <format id="common" format="%Date/%Time [%LEV] %Msg%n" />
145
+ <format id="critical" format="%File %FullPath %Func %Msg%n" />
146
+ <format id="criticalemail" format="Critical error on our server!\n %Time %Date %RelFile %Func %Msg \nSent by Seelog"/>
147
+ </formats>
148
+ </seelog>
149
+ `
150
+ logger , err := seelog.LoggerFromConfigAsBytes ([]byte (appConfig))
151
+ if err != nil {
152
+ fmt.Println (err)
153
+ return
172
154
}
155
+ UseLogger (logger)
156
+ }
157
+
158
+ func init () {
159
+ DisableLog ()
160
+ loadAppConfig ()
161
+ }
162
+
163
+ // DisableLog disables all library log output
164
+ func DisableLog () {
165
+ Logger = seelog.Disabled
166
+ }
167
+
168
+ // UseLogger uses a specified seelog.LoggerInterface to output library log.
169
+ // Use this func if you are using Seelog logging system in your app.
170
+ func UseLogger (newLogger seelog .LoggerInterface ) {
171
+ Logger = newLogger
172
+ }
173
173
```
174
174
上面主要实现了三个函数,
175
175
@@ -198,36 +198,36 @@ seelog支持自定义日志处理,下面是我基于它自定义的日志处
198
198
上面我们定义了一个自定义的日志处理包,下面就是使用示例:
199
199
``` Go
200
200
201
- package main
202
-
203
- import (
204
- " net/http"
205
- " project/logs"
206
- " project/configs"
207
- " project/routes"
208
- )
209
-
210
- func main () {
211
- addr , _ := configs.MainConfig .String (" server" , " addr" )
212
- logs.Logger .Info (" Start server at:%v " , addr)
213
- err := http.ListenAndServe (addr, routes.NewMux ())
214
- logs.Logger .Critical (" Server err:%v " , err)
215
- }
201
+ package main
202
+
203
+ import (
204
+ " net/http"
205
+ " project/logs"
206
+ " project/configs"
207
+ " project/routes"
208
+ )
209
+
210
+ func main () {
211
+ addr , _ := configs.MainConfig .String (" server" , " addr" )
212
+ logs.Logger .Info (" Start server at:%v " , addr)
213
+ err := http.ListenAndServe (addr, routes.NewMux ())
214
+ logs.Logger .Critical (" Server err:%v " , err)
215
+ }
216
216
```
217
217
## 发生错误发送邮件
218
218
上面的例子解释了如何设置发送邮件,我们通过如下的smtp配置用来发送邮件:
219
219
``` html
220
220
221
- <
smtp formatid =
" criticalemail" senderaddress =
" [email protected] " sendername =
" ShortUrl API" hostname =
" smtp.gmail.com" hostport =
" 587" username =
" mailusername" password =
" mailpassword" >
222
- <
recipient address =
" [email protected] " />
223
- </smtp >
221
+ <
smtp formatid =
" criticalemail" senderaddress =
" [email protected] " sendername =
" ShortUrl API" hostname =
" smtp.gmail.com" hostport =
" 587" username =
" mailusername" password =
" mailpassword" >
222
+ <
recipient address =
" [email protected] " />
223
+ </smtp >
224
224
```
225
225
邮件的格式通过criticalemail配置,然后通过其他的配置发送邮件服务器的配置,通过recipient配置接收邮件的用户,如果有多个用户可以再添加一行。
226
226
227
227
要测试这个代码是否正常工作,可以在代码中增加类似下面的一个假消息。不过记住过后要把它删除,否则上线之后就会收到很多垃圾邮件。
228
228
``` Go
229
229
230
- logs.Logger .Critical (" test Critical message" )
230
+ logs.Logger .Critical (" test Critical message" )
231
231
```
232
232
现在,只要我们的应用在线上记录一个Critical的信息,你的邮箱就会收到一个Email,这样一旦线上的系统出现问题,你就能立马通过邮件获知,就能及时的进行处理。
233
233
## 使用应用日志
@@ -236,8 +236,8 @@ seelog支持自定义日志处理,下面是我基于它自定义的日志处
236
236
举一个例子,我们需要跟踪用户尝试登陆系统的操作。这里会把成功与不成功的尝试都记录下来。记录成功的使用"Info"日志级别,而不成功的使用"warn"级别。如果想查找所有不成功的登陆,我们可以利用linux的grep之类的命令工具,如下:
237
237
``` Go
238
238
239
- # cat /data/logs/roll.log | grep " failed login"
240
- 2012 -12 -11 11 :12 :00 WARN : failed login attempt from 11.22.33.44 username password
239
+ # cat /data/logs/roll.log | grep " failed login"
240
+ 2012 -12 -11 11 :12 :00 WARN : failed login attempt from 11.22.33.44 username password
241
241
```
242
242
通过这种方式我们就可以很方便的查找相应的信息,这样有利于我们针对应用日志做一些统计和分析。另外我们还需要考虑日志的大小,对于一个高流量的Web应用来说,日志的增长是相当可怕的,所以我们在seelog的配置文件里面设置了logrotate,这样就能保证日志文件不会因为不断变大而导致我们的磁盘空间不够引起问题。
243
243
0 commit comments