Skip to content

Commit ede5d98

Browse files
committed
add timer and log
1 parent 6288aa8 commit ede5d98

13 files changed

+194
-34
lines changed

log/LogService.go

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
package log
2+
3+
import (
4+
"github.com/golang/glog"
5+
"log"
6+
"net/rpc"
7+
"net/rpc/jsonrpc"
8+
)
9+
10+
/*
11+
1. 日志收集,设计建议是存储mongoDB数据库
12+
2. 通信方式采用异步RPC发送到日志服
13+
*/
14+
15+
const (
16+
LevelINIT = iota
17+
DebugLevel // Debug
18+
ReleaseLevel // Releases
19+
ErrorLevel // Error
20+
FatalLevel // Fatal 严重的错误
21+
)
22+
23+
type LogService struct {
24+
ServerID string
25+
TypeLog int
26+
ServiceUrl string
27+
ConnRPC *rpc.Client
28+
}
29+
30+
type LogSt struct {
31+
Level int
32+
Data interface{}
33+
}
34+
35+
func NewLogService(served string,serviceurl string) *LogService {
36+
client, err := jsonrpc.Dial("tcp", serviceurl)
37+
if err != nil {
38+
glog.Info("dial error:", err)
39+
return nil
40+
}
41+
42+
return &LogService{
43+
ServerID: served,
44+
TypeLog: LevelINIT,
45+
ServiceUrl:serviceurl,
46+
ConnRPC:client,
47+
}
48+
}
49+
50+
func (this *LogService)RecordLog(data LogSt) {
51+
52+
switch data.Level {
53+
case DebugLevel:
54+
case ReleaseLevel:
55+
case ErrorLevel:
56+
case FatalLevel:
57+
log.Fatalln(data) // 严重错误
58+
default:
59+
}
60+
if this !=nil {
61+
this.sendlogServer(data)
62+
}
63+
}
64+
65+
/*
66+
1. 注册结构
67+
func rpcRegister() {
68+
_ = rpc.Register(new(LogSt))
69+
}
70+
2. 函数逻辑
71+
func (r *LogSt) SaveMongoDB(data log.LogSt, reply *bool) error {
72+
// 保存数据库逻辑
73+
}
74+
3. 基础逻辑
75+
76+
func main() {
77+
conf.InitConfig()
78+
MainListener(conf.GetConfig().Server.WSAddr)
79+
}
80+
81+
func MainListener(strport string) {
82+
rpcRegister()
83+
tcpAddr, err := net.ResolveTCPAddr("tcp", ":"+strport)
84+
checkError(err)
85+
Listener, err := net.ListenTCP("tcp", tcpAddr)
86+
checkError(err)
87+
88+
for {
89+
defer func() {
90+
if err := recover(); err != nil {
91+
strerr := fmt.Sprintf("%s", err)
92+
fmt.Println("异常捕获:", strerr)
93+
}
94+
}()
95+
conn, err := Listener.Accept()
96+
if err != nil {
97+
fmt.Fprint(os.Stderr, "accept err: %s", err.Error())
98+
continue
99+
}
100+
go jsonrpc.ServeConn(conn)
101+
}
102+
}
103+
104+
func checkError(err error) {
105+
if err != nil {
106+
fmt.Fprint(os.Stderr, "Usage: %s", err.Error())
107+
}
108+
}
109+
注:日志服务器需要注册 LogSt结构
110+
*/
111+
func (this *LogService)sendlogServer(data LogSt){
112+
if this.ConnRPC == nil{
113+
log.Fatalln("初始化错误!") // 严重错误
114+
return
115+
}
116+
args := data
117+
var reply bool
118+
divCall := this.ConnRPC.Go("LogSt.SaveMongoDB", args, &reply, nil)
119+
replyCall := <-divCall.Done
120+
glog.Info(replyCall.Reply)
121+
glog.Info("the LogData return is :", reply)
122+
}

timer/exanple_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package LollipopGo_timer
2+
3+
import (
4+
"fmt"
5+
)
6+
7+
func ExampleTimer() {
8+
d := NewDispatcher(10)
9+
// timer 1
10+
d.AfterFunc(1, func() {
11+
fmt.Println("My name is LollipopGo")
12+
})
13+
// timer 2
14+
t := d.AfterFunc(1, func() {
15+
fmt.Println("will not print")
16+
})
17+
t.Stop()
18+
(<-d.ChanTimer).Cb()
19+
}

timer/timer.go

Lines changed: 53 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,56 @@
1-
package timer
1+
package LollipopGo_timer
22

3-
// 启动定时器
4-
func GlobalTimer() {
3+
import (
4+
"LollipopGo/log"
5+
"github.com/name5566/leaf/conf"
6+
"runtime"
7+
"time"
8+
)
59

10+
type Dispatcher struct {
11+
ChanTimer chan *Timer
612
}
13+
// Timer
14+
type Timer struct {
15+
t *time.Timer
16+
cb func()
17+
}
18+
19+
func (t *Timer) Stop() {
20+
t.t.Stop()
21+
t.cb = nil
22+
}
23+
24+
func NewDispatcher(l int) *Dispatcher {
25+
disp := new(Dispatcher)
26+
disp.ChanTimer = make(chan *Timer, l)
27+
return disp
28+
}
29+
30+
func (t *Timer) Cb() {
31+
defer func() {
32+
t.cb = nil
33+
if r := recover(); r != nil {
34+
if conf.LenStackBuf > 0 {
35+
buf := make([]byte, conf.LenStackBuf)
36+
l := runtime.Stack(buf, false)
37+
log.Error("%v: %s", r, buf[:l])
38+
} else {
39+
log.Error("%v", r)
40+
}
41+
}
42+
}()
43+
44+
if t.cb != nil {
45+
t.cb()
46+
}
47+
}
48+
49+
func (disp *Dispatcher) AfterFunc(d time.Duration, cb func()) *Timer {
50+
t := new(Timer)
51+
t.cb = cb
52+
t.t = time.AfterFunc(d, func() {
53+
disp.ChanTimer <- t
54+
})
55+
return t
56+
}
-74.6 KB
Binary file not shown.
-152 KB
Binary file not shown.
-190 KB
Binary file not shown.
-202 KB
Binary file not shown.
-230 KB
Binary file not shown.
-244 KB
Binary file not shown.
-50.8 KB
Binary file not shown.

0 commit comments

Comments
 (0)