1
0
mirror of https://shylinux.com/x/icebergs synced 2025-04-27 01:48:27 +08:00
icebergs/base/log/log.go
2020-10-10 00:03:57 +08:00

122 lines
3.3 KiB
Go

package log
import (
ice "github.com/shylinux/icebergs"
kit "github.com/shylinux/toolkits"
"bufio"
"path"
)
type Log struct {
m *ice.Message
p string
l string
s string
}
type Frame struct{ p chan *Log }
func (f *Frame) Spawn(m *ice.Message, c *ice.Context, arg ...string) ice.Server {
return &Frame{}
}
func (f *Frame) Begin(m *ice.Message, arg ...string) ice.Server {
f.p = make(chan *Log, 4096)
ice.Log = func(msg *ice.Message, p, l, s string) {
f.p <- &Log{m: msg, p: p, l: l, s: s}
}
return f
}
func (f *Frame) Start(m *ice.Message, arg ...string) bool {
for {
select {
case l, ok := <-f.p:
if !ok {
break
}
file := kit.Select("bench", m.Conf("show", kit.Keys(l.l, "file")))
view := m.Confm("view", m.Conf("show", kit.Keys(l.l, "view")))
bio := m.Confv("file", file+".file").(*bufio.Writer)
bio.WriteString(l.p)
bio.WriteString(" ")
if p, ok := view["prefix"].(string); ok {
bio.WriteString(p)
}
bio.WriteString(l.l)
bio.WriteString(" ")
bio.WriteString(l.s)
if p, ok := view["suffix"].(string); ok {
bio.WriteString(p)
}
bio.WriteString("\n")
bio.Flush()
}
}
return true
}
func (f *Frame) Close(m *ice.Message, arg ...string) bool {
return true
}
var Index = &ice.Context{Name: "log", Help: "日志模块",
Configs: map[string]*ice.Config{
"file": {Name: "file", Help: "日志文件", Value: kit.Dict(
"watch", kit.Dict("path", "var/log/watch.log", "list", []string{
ice.LOG_CREATE, ice.LOG_REMOVE,
ice.LOG_INSERT, ice.LOG_DELETE,
ice.LOG_SELECT, ice.LOG_MODIFY,
ice.LOG_EXPORT, ice.LOG_IMPORT,
}),
"bench", kit.Dict("path", "var/log/bench.log", "list", []string{}),
"error", kit.Dict("path", "var/log/error.log", "list", []string{
ice.LOG_WARN, ice.LOG_ERROR,
}),
"trace", kit.Dict("path", "var/log/trace.log", "list", []string{}),
)},
"view": {Name: "view", Help: "日志格式", Value: kit.Dict(
"green", kit.Dict("prefix", "\033[32m", "suffix", "\033[0m", "list", []string{
ice.LOG_START, ice.LOG_SERVE,
ice.LOG_CMDS,
}),
"yellow", kit.Dict("prefix", "\033[33m", "suffix", "\033[0m", "list", []string{
ice.LOG_AUTH, ice.LOG_COST,
}),
"red", kit.Dict("prefix", "\033[31m", "suffix", "\033[0m", "list", []string{
ice.LOG_WARN, ice.LOG_CLOSE,
}),
)},
"show": {Name: "show", Help: "日志分流", Value: kit.Dict()},
},
Commands: map[string]*ice.Command{
ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Confm("view", nil, func(key string, value map[string]interface{}) {
kit.Fetch(value["list"], func(index int, k string) {
m.Conf("show", kit.Keys(k, "view"), key)
})
})
m.Confm("file", nil, func(key string, value map[string]interface{}) {
kit.Fetch(value["list"], func(index int, k string) {
m.Conf("show", kit.Keys(k, "file"), key)
})
// 日志文件
if f, p, e := kit.Create(kit.Format(value["path"])); m.Assert(e) {
m.Cap(ice.CTX_STREAM, path.Base(p))
value["file"] = bufio.NewWriter(f)
m.Log_CREATE(kit.MDB_FILE, p)
}
})
}},
ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if f, ok := m.Target().Server().(*Frame); ok {
// 关闭日志
ice.Log = nil
close(f.p)
}
}},
},
}
func init() { ice.Index.Register(Index, &Frame{}) }