forked from douban/gobeansdb
-
Notifications
You must be signed in to change notification settings - Fork 0
/
utils.go
42 lines (37 loc) · 1.1 KB
/
utils.go
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
package loghub
import (
"log"
"os"
"runtime"
"sync/atomic"
"unsafe"
)
func GetStack(size int) string {
b := make([]byte, size)
n := runtime.Stack(b, false)
stack := string(b[:n])
return stack
}
func openLogWithFd(fd *os.File, logFlag int) *log.Logger {
return log.New(fd, "", logFlag)
}
func openLog(path string, logFlag int) (logger *log.Logger, fd *os.File, err error) {
if fd, err = os.OpenFile(path, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644); err == nil {
logger = openLogWithFd(fd, logFlag)
}
return
}
func reopenLogger(logger **log.Logger, fd **os.File, path string, logFlag int) (err error) {
// start swap exist logger and new logger, and Close the older fd in later
newLogger, newFd, err := openLog(path, logFlag)
if err == nil {
atomic.SwapPointer((*unsafe.Pointer)(unsafe.Pointer(logger)), unsafe.Pointer(newLogger))
oldFd := (*os.File)(atomic.SwapPointer((*unsafe.Pointer)(unsafe.Pointer(fd)), unsafe.Pointer(newFd)))
if e := oldFd.Close(); e != nil {
log.Println("close old log fd failure with, ", e)
}
} else {
log.Printf("open %s failed: %s", path, err.Error())
}
return
}