Compare commits
1 Commits
5a3732a9dc
...
a41e1855ca
Author | SHA1 | Date |
---|---|---|
Evan Chen | a41e1855ca |
41
log.go
41
log.go
|
@ -86,10 +86,12 @@ type Logger struct {
|
||||||
debug_tmpl *template.Template
|
debug_tmpl *template.Template
|
||||||
warn_tmpl *template.Template
|
warn_tmpl *template.Template
|
||||||
info_tmpl *template.Template
|
info_tmpl *template.Template
|
||||||
|
subs []*Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func Default() *Logger {
|
func New(name string) *Logger {
|
||||||
l := &Logger{
|
l := &Logger{
|
||||||
|
system: name,
|
||||||
err: os.Stderr,
|
err: os.Stderr,
|
||||||
out: os.Stdout,
|
out: os.Stdout,
|
||||||
color: true,
|
color: true,
|
||||||
|
@ -112,6 +114,10 @@ func (l *Logger) Sub(sys string) *Logger {
|
||||||
warn_tmpl: l.warn_tmpl,
|
warn_tmpl: l.warn_tmpl,
|
||||||
info_tmpl: l.info_tmpl,
|
info_tmpl: l.info_tmpl,
|
||||||
}
|
}
|
||||||
|
if l.subs == nil {
|
||||||
|
l.subs = make([]*Logger, 0)
|
||||||
|
}
|
||||||
|
l.subs = append(l.subs, ret)
|
||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -134,15 +140,36 @@ func (l *Logger) SetErrOutput(err io.Writer) {
|
||||||
l.err = err
|
l.err = err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (l *Logger) SetErrOutputAll(err io.Writer) {
|
||||||
|
for _, v := range getAllOffsprings(l) {
|
||||||
|
v.err = err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (l *Logger) SetOutput(out io.Writer) {
|
func (l *Logger) SetOutput(out io.Writer) {
|
||||||
l.out = out
|
l.out = out
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (l *Logger) SetOutputAll(out io.Writer) {
|
||||||
|
for _, v := range getAllOffsprings(l) {
|
||||||
|
v.out = out
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (l *Logger) Reload() error {
|
func (l *Logger) Reload() error {
|
||||||
l.guessColor()
|
l.guessColor()
|
||||||
return l.ParseTmpl()
|
return l.ParseTmpl()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (l *Logger) ReloadAll() error {
|
||||||
|
for _, v := range getAllOffsprings(l) {
|
||||||
|
if err := v.Reload(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func NewLogFormater() *LogFormater {
|
func NewLogFormater() *LogFormater {
|
||||||
return &LogFormater{
|
return &LogFormater{
|
||||||
ErrTmplStr: DEFAULT_ERR,
|
ErrTmplStr: DEFAULT_ERR,
|
||||||
|
@ -156,7 +183,6 @@ func (l *Logger) DefaultFuncMap() template.FuncMap {
|
||||||
funcMap := template.FuncMap{
|
funcMap := template.FuncMap{
|
||||||
"Time": func() string { return time.Now().Format("2006/01/02 15:04:05") },
|
"Time": func() string { return time.Now().Format("2006/01/02 15:04:05") },
|
||||||
}
|
}
|
||||||
setColorMap(funcMap, l.color)
|
|
||||||
return funcMap
|
return funcMap
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -164,22 +190,25 @@ func (l *Logger) ParseTmpl() error {
|
||||||
if l.funcMap == nil {
|
if l.funcMap == nil {
|
||||||
l.funcMap = l.DefaultFuncMap()
|
l.funcMap = l.DefaultFuncMap()
|
||||||
}
|
}
|
||||||
err_tmpl, err := template.New("err_tmpl").Funcs(l.funcMap).Parse(l.formatter.ErrTmplStr)
|
funcMap := copyFuncMap(l.funcMap)
|
||||||
|
setColorMap(funcMap, l.color)
|
||||||
|
|
||||||
|
err_tmpl, err := template.New("err_tmpl").Funcs(funcMap).Parse(l.formatter.ErrTmplStr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
l.err_tmpl = err_tmpl
|
l.err_tmpl = err_tmpl
|
||||||
warn_tmpl, err := template.New("warn_tmpl").Funcs(l.funcMap).Parse(l.formatter.WarnTmplStr)
|
warn_tmpl, err := template.New("warn_tmpl").Funcs(funcMap).Parse(l.formatter.WarnTmplStr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
l.warn_tmpl = warn_tmpl
|
l.warn_tmpl = warn_tmpl
|
||||||
info_tmpl, err := template.New("info_tmpl").Funcs(l.funcMap).Parse(l.formatter.InfoTmplStr)
|
info_tmpl, err := template.New("info_tmpl").Funcs(funcMap).Parse(l.formatter.InfoTmplStr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
l.info_tmpl = info_tmpl
|
l.info_tmpl = info_tmpl
|
||||||
debug_tmpl, err := template.New("debug_tmpl").Funcs(l.funcMap).Parse(l.formatter.DebugTmplStr)
|
debug_tmpl, err := template.New("debug_tmpl").Funcs(funcMap).Parse(l.formatter.DebugTmplStr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
23
log_test.go
23
log_test.go
|
@ -1,11 +1,13 @@
|
||||||
package log
|
package log
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestDev(t *testing.T) {
|
func TestDev(t *testing.T) {
|
||||||
|
LEVEL = Lerror | Ldebug | Lwarn | Linfo
|
||||||
PROD = false
|
PROD = false
|
||||||
// log.system = "dev"
|
// log.system = "dev"
|
||||||
Error("d", "sdf", "sdfsdf")
|
Error("d", "sdf", "sdfsdf")
|
||||||
|
@ -97,3 +99,24 @@ func TestToFile(t *testing.T) {
|
||||||
l.Info("d", "sdf", "sdfsdf")
|
l.Info("d", "sdf", "sdfsdf")
|
||||||
l.InfoF(H{"Test": "set"}, "d", "sdf", "sdfsdf")
|
l.InfoF(H{"Test": "set"}, "d", "sdf", "sdfsdf")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestApplyChild(t *testing.T) {
|
||||||
|
PROD = true
|
||||||
|
l := Sub("parent")
|
||||||
|
l1 := l.Sub("child1")
|
||||||
|
l2 := l.Sub("child2")
|
||||||
|
l3 := l.Sub("child3")
|
||||||
|
l1.Info("child1")
|
||||||
|
l2.Info("child2")
|
||||||
|
l3.Info("child3")
|
||||||
|
l.SetOutputAll(io.Discard)
|
||||||
|
l.ReloadAll()
|
||||||
|
l1.Info("child1-discard")
|
||||||
|
l2.Info("child2-discard")
|
||||||
|
l3.Info("child3-discard")
|
||||||
|
SetOutputAll(os.Stdout)
|
||||||
|
ReloadAll()
|
||||||
|
l1.Info("child1-stdout")
|
||||||
|
l2.Info("child2-stdout")
|
||||||
|
l3.Info("child3-stdout")
|
||||||
|
}
|
||||||
|
|
32
std.go
32
std.go
|
@ -1,11 +1,41 @@
|
||||||
package log
|
package log
|
||||||
|
|
||||||
var std = Default()
|
import "io"
|
||||||
|
|
||||||
|
var std = New("")
|
||||||
|
|
||||||
func Sub(sys string) *Logger {
|
func Sub(sys string) *Logger {
|
||||||
return std.Sub(sys)
|
return std.Sub(sys)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func SetColor(c bool) {
|
||||||
|
std.SetColor(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetErrOutput(err io.Writer) {
|
||||||
|
std.SetErrOutput(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetErrOutputAll(err io.Writer) {
|
||||||
|
std.SetErrOutputAll(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetOutput(out io.Writer) {
|
||||||
|
std.SetOutput(out)
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetOutputAll(out io.Writer) {
|
||||||
|
std.SetOutputAll(out)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Reload() error {
|
||||||
|
return std.Reload()
|
||||||
|
}
|
||||||
|
|
||||||
|
func ReloadAll() error {
|
||||||
|
return std.ReloadAll()
|
||||||
|
}
|
||||||
|
|
||||||
func ErrorF(fields H, v ...interface{}) {
|
func ErrorF(fields H, v ...interface{}) {
|
||||||
if PROD {
|
if PROD {
|
||||||
std.output(terror, 3, "", fields, v...)
|
std.output(terror, 3, "", fields, v...)
|
||||||
|
|
20
util.go
20
util.go
|
@ -3,6 +3,7 @@ package log
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
"text/template"
|
||||||
)
|
)
|
||||||
|
|
||||||
func caller(depth int) string {
|
func caller(depth int) string {
|
||||||
|
@ -27,3 +28,22 @@ func stack() string {
|
||||||
buf = make([]byte, 2*len(buf))
|
buf = make([]byte, 2*len(buf))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getAllOffsprings(l *Logger) []*Logger {
|
||||||
|
if l.subs == nil || len(l.subs) == 0 {
|
||||||
|
return []*Logger{l}
|
||||||
|
}
|
||||||
|
loggers := []*Logger{}
|
||||||
|
for i := range l.subs {
|
||||||
|
loggers = append(loggers, getAllOffsprings(l.subs[i])...)
|
||||||
|
}
|
||||||
|
return loggers
|
||||||
|
}
|
||||||
|
|
||||||
|
func copyFuncMap(source template.FuncMap) template.FuncMap {
|
||||||
|
dest := template.FuncMap{}
|
||||||
|
for k, v := range source {
|
||||||
|
dest[k] = v
|
||||||
|
}
|
||||||
|
return dest
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue