Skip to content

Commit 79c05f5

Browse files
authored
Fix/con error (#27)
* Request and response packets are not aligned * logger * reconnet on error * copy stream
1 parent 0456d0d commit 79c05f5

5 files changed

Lines changed: 320 additions & 33 deletions

File tree

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ module github.com/yomorun/yomo
33
go 1.14
44

55
require (
6-
github.com/10cella/yomo-json-codec v0.2.4
6+
github.com/10cella/yomo-json-codec v0.2.5
77
github.com/lucas-clemente/quic-go v0.17.1
88
)

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ github.com/10cella/yomo-json-codec v0.2.3 h1:IMcV7lR8cknbXFnNIU4JB6menKKGny0XXcI
2121
github.com/10cella/yomo-json-codec v0.2.3/go.mod h1:oApqc2PnZohrtlVJ3T1Knou9Ap9mcCJW1i3xiRtvF7c=
2222
github.com/10cella/yomo-json-codec v0.2.4 h1:bdOInT1MnBhXDsGBHx/fYn0CiXzKxrm5/kFjfJyYdrw=
2323
github.com/10cella/yomo-json-codec v0.2.4/go.mod h1:j4rl6bth7Bb6F8UC0SPN2XxlGGUsHGWO8LnrH5Q8RzI=
24+
github.com/10cella/yomo-json-codec v0.2.5 h1:XTWWFVkQENaLLBTxBdXyG61UneA8SQF/YdlnyHptV/o=
25+
github.com/10cella/yomo-json-codec v0.2.5/go.mod h1:j4rl6bth7Bb6F8UC0SPN2XxlGGUsHGWO8LnrH5Q8RzI=
2426
github.com/10cella/yomo-txtkv-codec v1.0.5 h1:rVdtBcsff3RG3BEq7AHq2WvNiGDF6IEKlTiplypfX+c=
2527
github.com/10cella/yomo-txtkv-codec v1.0.5/go.mod h1:nBfcD3qVq6kkSRHOgSUxK1+gMRoXI0obLF+b1eiyCtM=
2628
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=

pkg/util/log.go

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
package util
2+
3+
import (
4+
"fmt"
5+
"log"
6+
"os"
7+
"reflect"
8+
"strings"
9+
"sync"
10+
"time"
11+
12+
"github.com/yomorun/yomo/pkg/env"
13+
)
14+
15+
type LogLevel uint8
16+
17+
const (
18+
LogLevelNothing LogLevel = iota
19+
LogLevelError
20+
LogLevelInfo
21+
LogLevelDebug
22+
)
23+
24+
const logEnv = "YOMO_LOG_LEVEL"
25+
26+
type Logger interface {
27+
SetLogLevel(LogLevel)
28+
SetLogTimeFormat(format string)
29+
WithPrefix(prefix string) Logger
30+
Debug() bool
31+
32+
Errorf(format string, args ...interface{})
33+
Infof(format string, args ...interface{})
34+
Debugf(format string, args ...interface{})
35+
}
36+
37+
var DefaultLogger Logger
38+
39+
type defaultLogger struct {
40+
prefix string
41+
42+
logLevel LogLevel
43+
timeFormat string
44+
}
45+
46+
var _ Logger = &defaultLogger{}
47+
48+
func (l *defaultLogger) SetLogLevel(level LogLevel) {
49+
l.logLevel = level
50+
}
51+
52+
func (l *defaultLogger) SetLogTimeFormat(format string) {
53+
log.SetFlags(0)
54+
l.timeFormat = format
55+
}
56+
57+
func (l *defaultLogger) Debugf(format string, args ...interface{}) {
58+
if l.logLevel == LogLevelDebug {
59+
l.logMessage(format, args...)
60+
}
61+
}
62+
63+
func (l *defaultLogger) Infof(format string, args ...interface{}) {
64+
if l.logLevel >= LogLevelInfo {
65+
l.logMessage(format, args...)
66+
}
67+
}
68+
69+
func (l *defaultLogger) Errorf(format string, args ...interface{}) {
70+
if l.logLevel >= LogLevelError {
71+
l.logMessage(format, args...)
72+
}
73+
}
74+
75+
func (l *defaultLogger) logMessage(format string, args ...interface{}) {
76+
var pre string
77+
78+
if len(l.timeFormat) > 0 {
79+
pre = time.Now().Format(l.timeFormat) + " "
80+
}
81+
if len(l.prefix) > 0 {
82+
pre += l.prefix + " "
83+
}
84+
log.Printf(pre+format, args...)
85+
}
86+
87+
func (l *defaultLogger) WithPrefix(prefix string) Logger {
88+
if len(l.prefix) > 0 {
89+
prefix = l.prefix + " " + prefix
90+
}
91+
return &defaultLogger{
92+
logLevel: l.logLevel,
93+
timeFormat: l.timeFormat,
94+
prefix: prefix,
95+
}
96+
}
97+
98+
func (l *defaultLogger) Debug() bool {
99+
return l.logLevel == LogLevelDebug
100+
}
101+
102+
func init() {
103+
loadDefaultLogger()
104+
}
105+
106+
var mux sync.Mutex
107+
108+
func loadDefaultLogger() {
109+
mux.Lock()
110+
defer mux.Unlock()
111+
if DefaultLogger == nil {
112+
DefaultLogger = &defaultLogger{}
113+
DefaultLogger.SetLogLevel(readLoggingEnv())
114+
}
115+
}
116+
117+
func readLoggingEnv() LogLevel {
118+
lvl := strings.ToLower(env.GetString(logEnv, "info"))
119+
switch lvl {
120+
case "":
121+
return LogLevelNothing
122+
case "debug":
123+
return LogLevelDebug
124+
case "info":
125+
return LogLevelInfo
126+
case "error":
127+
return LogLevelError
128+
default:
129+
fmt.Fprintln(os.Stderr, "invalid log level")
130+
return LogLevelNothing
131+
}
132+
}
133+
134+
func GetLogger(prefix string) Logger {
135+
if DefaultLogger == nil {
136+
loadDefaultLogger()
137+
}
138+
return Logger.WithPrefix(DefaultLogger, prefix)
139+
}
140+
141+
func GetLoggerOf(obj interface{}) Logger {
142+
if DefaultLogger == nil {
143+
loadDefaultLogger()
144+
}
145+
return Logger.WithPrefix(DefaultLogger, reflect.TypeOf(obj).Name())
146+
}

0 commit comments

Comments
 (0)