This repository has been archived by the owner on Jan 13, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstdlog.go
105 lines (86 loc) · 2.05 KB
/
stdlog.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
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
/*
Package stdlog provide log utilities.
*/
package stdlog
import (
"errors"
"io"
"os"
"strconv"
"sync"
"sync/atomic"
)
// Printer is interface for printing log
type Printer interface {
Print(...interface{})
}
// OnelineLog is derived from "OnelineLog" env variable according to strconv.ParseBool
func OnelineLog() bool {
onelineLog, _ := strconv.ParseBool(os.Getenv("OnelineLog"))
return onelineLog
}
// TimestampLog is derived from "TimestampLog" env variable according to strconv.ParseBool
func TimestampLog() bool {
noTimestampLog, _ := strconv.ParseBool(os.Getenv("TimestampLog"))
return noTimestampLog
}
// NewFromEnv is same as New but timestamp and onelines are inherited from env
func NewFromEnv(w io.Writer, prefix string) *Logger {
return New(w, prefix, TimestampLog(), OnelineLog())
}
var (
outOnce sync.Once
out atomic.Value // *Logger
errOnce sync.Once
err atomic.Value // *Logger
)
// Out return global out Logger
//
// if SetOut never called before, will return Logger that wrap os.Stdout and
// behave acording to OnelineLog and NoTimestampLog
func Out() *Logger {
outOnce.Do(func() {
SetOut(NewFromEnv(os.Stdout, ""))
})
return out.Load().(*Logger)
}
// SetOut set logger returned by Out
func SetOut(l *Logger) error {
if l == nil {
panic("l cannot be nil")
}
if out.Load() != nil {
return errors.New("Out already set")
}
out.Store(l)
return nil
}
// Err return global err Logger
//
// if SetErr never called before, will return Logger that wrap os.Stderr and
// behave acording to OnelineLog and NoTimestampLog
func Err() *Logger {
errOnce.Do(func() {
SetErr(NewFromEnv(os.Stderr, ""))
})
return err.Load().(*Logger)
}
// SetErr set logger returned by Err
func SetErr(l *Logger) error {
if l == nil {
panic("l cannot be nil")
}
if err.Load() != nil {
return errors.New("Out already set")
}
err.Store(l)
return nil
}
// PrintOut is shortcut to Out().Print
func PrintOut(v ...interface{}) {
Out().Print(v...)
}
// PrintErr is shortcut to Err().Print
func PrintErr(v ...interface{}) {
Err().Print(v...)
}