Skip to content

Commit 6bb201e

Browse files
committed
Merge branch 'master' of github.com:toolkits/pkg
2 parents c714f7d + c9ad9d3 commit 6bb201e

File tree

9 files changed

+352
-86
lines changed

9 files changed

+352
-86
lines changed

i18n/i18n.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,14 @@ func DictRegister(m map[string]map[string]string) {
7070

7171
func langTag(l string) language.Tag {
7272
switch strings.ToLower(l) {
73-
case "zh", "cn":
73+
case "zh", "cn", "zh_cn", "zh-cn":
7474
return language.Chinese
75+
case "zh_hk", "zh-hk", "zh_tw", "zh-tw":
76+
return language.TraditionalChinese
77+
case "ja", "jp", "ja_jp", "ja-jp":
78+
return language.Japanese
79+
case "ko", "kr", "ko_kr", "ko-kr":
80+
return language.Korean
7581
default:
7682
return language.English
7783
}

logger/config.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ type LogConfig struct {
1616
FileFlushDuration time.Duration
1717
RotateByHour bool
1818
KeepHours uint // make sense when RotateByHour is T
19+
OutputToOneFile bool
1920
}
2021

2122
func initFromConfig(log *Logger,
@@ -44,6 +45,7 @@ func initFromConfig(log *Logger,
4445
fb.SetFlushDuration(config.FileFlushDuration)
4546
fb.SetRotateByHour(config.RotateByHour)
4647
fb.SetKeepHours(config.KeepHours)
48+
fb.OutputToOneFile(config.OutputToOneFile)
4749
} else {
4850
return fmt.Errorf("unknown log type: %s", config.Type)
4951
}

logger/file.go

Lines changed: 67 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -55,17 +55,18 @@ func (self *syncBuffer) write(b []byte) {
5555
}
5656

5757
type FileBackend struct {
58-
mu sync.Mutex
59-
dir string // directory for log files
60-
files [numSeverity]syncBuffer
61-
flushInterval time.Duration
62-
rotateNum int
63-
maxSize uint64
64-
fall bool
65-
rotateByHour bool
66-
lastCheck uint64
67-
reg *regexp.Regexp // for rotatebyhour log del...
68-
keepHours uint // keep how many hours old, only make sense when rotatebyhour is T
58+
mu sync.Mutex
59+
dir string // directory for log files
60+
files [numSeverity]syncBuffer
61+
flushInterval time.Duration
62+
rotateNum int
63+
maxSize uint64
64+
fall bool
65+
rotateByHour bool
66+
lastCheck uint64
67+
reg *regexp.Regexp // for rotatebyhour log del...
68+
keepHours uint // keep how many hours old, only make sense when rotatebyhour is T
69+
outputToOneFile bool
6970
}
7071

7172
func (self *FileBackend) Flush() {
@@ -75,7 +76,6 @@ func (self *FileBackend) Flush() {
7576
self.files[i].Flush()
7677
self.files[i].Sync()
7778
}
78-
7979
}
8080

8181
func (self *FileBackend) Close() {
@@ -123,7 +123,7 @@ func (self *FileBackend) rotateByHourDaemon() {
123123
files, err := ioutil.ReadDir(self.dir)
124124
if err == nil {
125125
for _, file := range files {
126-
// exactly match, then we
126+
// exactly match, then remove
127127
if file.Name() == self.reg.FindString(file.Name()) &&
128128
shouldDel(file.Name(), self.keepHours) {
129129
os.Remove(filepath.Join(self.dir, file.Name()))
@@ -138,35 +138,43 @@ func (self *FileBackend) monitorFiles() {
138138
for range time.NewTicker(time.Second * 5).C {
139139
for i := 0; i < numSeverity; i++ {
140140
fileName := path.Join(self.dir, severityName[i]+".log")
141-
if _, err := os.Stat(fileName); err != nil && os.IsNotExist(err) {
142-
if f, err := os.OpenFile(fileName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644); err == nil {
143-
self.mu.Lock()
144-
self.files[i].close()
145-
self.files[i].Writer = bufio.NewWriterSize(f, bufferSize)
146-
self.files[i].file = f
147-
self.mu.Unlock()
148-
}
149-
}
141+
self.monitorFile(fileName, &self.files[i])
142+
}
143+
}
144+
}
145+
146+
func (self *FileBackend) monitorFile(fileName string, sb *syncBuffer) {
147+
if _, err := os.Stat(fileName); err != nil && os.IsNotExist(err) {
148+
if f, err := os.OpenFile(fileName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644); err == nil {
149+
self.mu.Lock()
150+
sb.close()
151+
sb.Writer = bufio.NewWriterSize(f, bufferSize)
152+
sb.file = f
153+
self.mu.Unlock()
150154
}
151155
}
152156
}
153157

154158
func (self *FileBackend) Log(s Severity, msg []byte) {
155159
self.mu.Lock()
156-
switch s {
157-
case FATAL:
158-
self.files[FATAL].write(msg)
159-
case ERROR:
160-
self.files[ERROR].write(msg)
161-
case WARNING:
162-
self.files[WARNING].write(msg)
163-
case INFO:
164-
self.files[INFO].write(msg)
165-
case DEBUG:
166-
self.files[DEBUG].write(msg)
167-
}
168-
if self.fall && s < INFO {
169-
self.files[INFO].write(msg)
160+
if self.outputToOneFile {
161+
self.files[ALL].write(msg)
162+
} else {
163+
switch s {
164+
case FATAL:
165+
self.files[FATAL].write(msg)
166+
case ERROR:
167+
self.files[ERROR].write(msg)
168+
case WARNING:
169+
self.files[WARNING].write(msg)
170+
case INFO:
171+
self.files[INFO].write(msg)
172+
case DEBUG:
173+
self.files[DEBUG].write(msg)
174+
}
175+
if self.fall && s < INFO {
176+
self.files[INFO].write(msg)
177+
}
170178
}
171179
self.mu.Unlock()
172180
if s == FATAL {
@@ -203,6 +211,11 @@ func (self *FileBackend) SetFlushDuration(t time.Duration) {
203211
self.flushInterval = time.Second
204212
}
205213
}
214+
215+
func (self *FileBackend) OutputToOneFile(flag bool) {
216+
self.outputToOneFile = flag
217+
}
218+
206219
func NewFileBackend(dir string) (*FileBackend, error) {
207220
if err := os.MkdirAll(dir, 0755); err != nil {
208221
return nil, err
@@ -215,21 +228,9 @@ func NewFileBackend(dir string) (*FileBackend, error) {
215228
if err != nil {
216229
return nil, err
217230
}
218-
219-
count := uint64(0)
220-
stat, err := f.Stat()
221-
if err == nil {
222-
count = uint64(stat.Size())
223-
}
224-
fb.files[i] = syncBuffer{
225-
Writer: bufio.NewWriterSize(f, bufferSize),
226-
file: f,
227-
filePath: fileName,
228-
parent: &fb,
229-
count: count,
230-
}
231-
231+
fb.files[i] = newSyncBuffer(f, &fb, fileName)
232232
}
233+
233234
// default
234235
fb.flushInterval = time.Second * 3
235236
fb.rotateNum = 20
@@ -238,7 +239,7 @@ func NewFileBackend(dir string) (*FileBackend, error) {
238239
fb.lastCheck = 0
239240
// init reg to match files
240241
// ONLY cover this centry...
241-
fb.reg = regexp.MustCompile("(INFO|ERROR|WARNING|DEBUG|FATAL)\\.log\\.20[0-9]{8}")
242+
fb.reg = regexp.MustCompile("(INFO|ERROR|WARNING|DEBUG|FATAL|ALL)\\.log\\.20[0-9]{8}")
242243
fb.keepHours = 24 * 7
243244

244245
go fb.flushDaemon()
@@ -247,6 +248,21 @@ func NewFileBackend(dir string) (*FileBackend, error) {
247248
return &fb, nil
248249
}
249250

251+
func newSyncBuffer(f *os.File, fb *FileBackend, fileName string) syncBuffer {
252+
count := uint64(0)
253+
stat, err := f.Stat()
254+
if err == nil {
255+
count = uint64(stat.Size())
256+
}
257+
return syncBuffer{
258+
Writer: bufio.NewWriterSize(f, bufferSize),
259+
file: f,
260+
filePath: fileName,
261+
parent: fb,
262+
count: count,
263+
}
264+
}
265+
250266
func Rotate(rotateNum1 int, maxSize1 uint64) {
251267
if fileback != nil {
252268
fileback.Rotate(rotateNum1, maxSize1)

logger/logger.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ const (
1818
WARNING
1919
INFO
2020
DEBUG
21+
ALL
2122
)
2223

2324
var severityName = []string{
@@ -26,10 +27,11 @@ var severityName = []string{
2627
WARNING: "WARNING",
2728
INFO: "INFO",
2829
DEBUG: "DEBUG",
30+
ALL: "ALL",
2931
}
3032

3133
const (
32-
numSeverity = 5
34+
numSeverity = 6
3335
)
3436

3537
type Backend interface {
@@ -56,7 +58,7 @@ type Logger struct {
5658
logToStderr bool
5759
}
5860

59-
//resued buffer for fast format the output string
61+
// resued buffer for fast format the output string
6062
type buffer struct {
6163
bytes.Buffer
6264
tmp [64]byte
@@ -337,7 +339,7 @@ func (l *Logger) SetLogging(level interface{}, backend Backend) {
337339
l.backend = backend
338340
}
339341

340-
/////////////////////////////////////////////////////////////////
342+
// ///////////////////////////////////////////////////////////////
341343
// depth version, only a low level api
342344
func (l *Logger) LogDepth(s Severity, depth int, format string, args ...interface{}) {
343345
l.printfDepth(s, depth+1, format, args...)

net/tcpx/tcpx.go

Lines changed: 66 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,35 +4,85 @@ import (
44
"fmt"
55
"net"
66
"os"
7+
"strconv"
78
"strings"
89
"time"
910
)
1011

12+
type Config struct {
13+
Hosts []string
14+
GlobalTimeout time.Duration
15+
TcpConnectionTimeout time.Duration
16+
WaitBefore time.Duration
17+
WaitAfter time.Duration
18+
WaitSleepInterval time.Duration
19+
}
20+
1121
func WaitHosts() {
12-
hosts := os.Getenv("WAIT_HOSTS")
13-
if len(hosts) == 0 {
14-
return
15-
}
22+
config := ConfigFromEnv()
23+
Wait(config, func() { os.Exit(1) })
24+
}
1625

26+
func ConfigFromEnv() *Config {
27+
hosts := os.Getenv("WAIT_HOSTS")
1728
hosts = strings.ReplaceAll(hosts, ",", " ")
18-
array := strings.Fields(hosts)
29+
return &Config{
30+
Hosts: strings.Fields(hosts),
31+
GlobalTimeout: envTimeParse("WAIT_TIMEOUT", time.Second*30),
32+
TcpConnectionTimeout: envTimeParse("WAIT_HOST_CONNECT_TIMEOUT", time.Second*5),
33+
WaitBefore: envTimeParse("WAIT_BEFORE", 0),
34+
WaitAfter: envTimeParse("WAIT_AFTER", 0),
35+
WaitSleepInterval: envTimeParse("WAIT_SLEEP_INTERVAL", time.Second),
36+
}
37+
}
1938

20-
for _, host := range array {
21-
waitHost(host)
39+
func IsPortReachableWithTimeout(host string, tpcTimeout time.Duration) bool {
40+
conn, err := net.DialTimeout("tcp", host, tpcTimeout)
41+
if err != nil {
42+
return false
2243
}
44+
_ = conn.Close()
45+
return true
2346
}
2447

25-
func waitHost(host string) {
26-
for {
27-
fmt.Printf("[%s] Waiting for host: %s\n", time.Now(), host)
48+
func Wait(config *Config, onTimeout func()) {
49+
if config.WaitBefore > 0 {
50+
time.Sleep(config.WaitBefore)
51+
}
52+
afterTime := time.After(config.GlobalTimeout)
2853

29-
conn, err := net.DialTimeout("tcp", host, time.Second)
30-
if err == nil {
31-
conn.Close()
32-
fmt.Printf("[%s] Host is ready: %s\n", time.Now(), host)
33-
return
54+
loopLabel:
55+
for _, host := range config.Hosts {
56+
for {
57+
fmt.Printf("[%s] Waiting for host: %s\n", time.Now(), host)
58+
reach := IsPortReachableWithTimeout(host, config.TcpConnectionTimeout)
59+
if reach {
60+
fmt.Printf("[%s] Host is ready: %s\n", time.Now(), host)
61+
break
62+
}
63+
select {
64+
case <-afterTime:
65+
fmt.Printf("[%s] Wait for the host to time out: %s\n", time.Now(), host)
66+
onTimeout()
67+
break loopLabel
68+
default:
69+
time.Sleep(config.WaitSleepInterval)
70+
}
3471
}
72+
}
73+
74+
if config.WaitAfter > 0 {
75+
time.Sleep(config.WaitAfter)
76+
}
77+
}
3578

36-
time.Sleep(time.Second)
79+
func envTimeParse(key string, defaultValue time.Duration) time.Duration {
80+
timeoutEnv := os.Getenv(key)
81+
if timeoutEnv != "" {
82+
i, err := strconv.ParseInt(timeoutEnv, 10, 64)
83+
if err == nil {
84+
defaultValue = time.Second * time.Duration(i)
85+
}
3786
}
87+
return defaultValue
3888
}

0 commit comments

Comments
 (0)