Blame view

common/logger/conn.go 2.09 KB
cad2b7f3   zhangqijia   reactor: 重构目录, 重构...
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
  package logger
  
  import (
  	"encoding/json"
  	"fmt"
  	"io"
  	"net"
  	"strings"
  	"sync"
  	"time"
  )
  
  type connLogger struct {
  	sync.Mutex
  	innerWriter    io.WriteCloser
  	Net            string `json:"net"`
  	Addr           string `json:"addr"`
  	Level          string `json:"level"`
  	LogLevel       int
  	illNetFlag     bool //网络异常标记
  }
  
  func (c *connLogger) Init(jsonConfig string, appName string) error {
  	if len(jsonConfig) == 0 {
  		return nil
  	}
  	//fmt.Printf("consoleWriter Init:%s\n", jsonConfig)
  	err := json.Unmarshal([]byte(jsonConfig), c)
  	if err != nil {
  		return err
  	}
  	if l, ok := LevelMap[c.Level]; ok {
  		c.LogLevel = l
  	}
  	if c.innerWriter != nil {
  		c.innerWriter.Close()
  		c.innerWriter = nil
  	}
  
  	go func() {
  		for {
  			c.connect()
  			time.Sleep(10*time.Millisecond)
  		}
  	}()
  
  	return nil
  }
  
  func (c *connLogger) LogWrite(when time.Time, msgText interface{}, level int) (err error) {
  	if level > c.LogLevel {
  		return nil
  	}
  
  	msg, ok := msgText.(*loginfo)
  	if !ok {
  		return
  	}
  
  	if c.innerWriter != nil {
  		err = c.println(when, msg)
  		//网络异常,通知处理网络的go程自动重连
  		if err != nil {
  			c.innerWriter.Close()
  			c.innerWriter = nil
  		}
  	}
  
  	return
  }
  
  func (c *connLogger) Destroy() {
  	if c.innerWriter != nil {
  		c.innerWriter.Close()
  	}
  }
  
  func (c *connLogger) connect() error {
  	if c.innerWriter != nil {
  		return nil
  	}
  	addrs := strings.Split(c.Addr, ";")
  	for _, addr := range addrs {
  		conn, err := net.DialTimeout(c.Net, addr, 1 * time.Second)
  		if err != nil {
  			fmt.Printf("net.Dial error:%v\n", err)
  			//continue
  			return err
  		}
  
  		if tcpConn, ok := conn.(*net.TCPConn); ok {
  			tcpConn.SetKeepAlive(true)
  		}
  		c.innerWriter = conn
  		return nil
  	}
  	return fmt.Errorf("hava no valid logs service addr:%v", c.Addr)
  }
  
  func (c *connLogger) println(when time.Time, msg *loginfo) error {
  	c.Lock()
  	defer c.Unlock()
  	ss, err := json.Marshal(msg)
  	if err != nil {
  		return err
  	}
  	_, err = c.innerWriter.Write(append(ss, '\n'))
  
  	//返回err,解决日志系统网络异常后的自动重连
  	return err
  }
  
  func init() {
  	Register(AdapterConn, &connLogger{LogLevel: LevelTrace})
  }