From: qydysky Date: Thu, 24 Dec 2020 16:42:33 +0000 (+0800) Subject: 97 X-Git-Tag: 0.3.5~6 X-Git-Url: http://127.0.0.1:8081/?a=commitdiff_plain;h=cb4688eb5245552387c965c2f9f9fe5fa8468814;p=part%2F.git 97 --- diff --git a/log/Log.go b/log/Log.go new file mode 100644 index 0000000..e56ccf6 --- /dev/null +++ b/log/Log.go @@ -0,0 +1,183 @@ +package part + +import ( + "io" + "time" + "os" + "log" + + p "github.com/qydysky/part" + m "github.com/qydysky/part/msgq" +) + +type Log_interface struct { + MQ *m.Msgq + Config +} + +type Config struct { + File_string string + Level_string [4]string + Base_string []interface{} +} + +type msg_item struct { + Show_obj []io.Writer + Msg_obj []interface{} +} + +//New 初始化 +func New(c Config) (o *Log_interface) { + + o = new(Log_interface) + + //设置log等级字符串 + for k,v := range c.Level_string { + if v == `` {continue} + o.Level_string[k] = v + } + + o.MQ = m.New(10) + + o.MQ.Pull_tag(map[string]func(interface{})(bool){ + `block`:func(data interface{})(bool){ + if v,ok := data.(chan struct{});ok{close(v)} + return false + }, + `T`:func(data interface{})(bool){ + log.New(io.MultiWriter(data.(msg_item).Show_obj...), + o.Level_string[0] + ": ", + log.Ldate|log.Ltime).Println(data.(msg_item).Msg_obj...) + return false + }, + `I`:func(data interface{})(bool){ + log.New(io.MultiWriter(data.(msg_item).Show_obj...), + o.Level_string[1] + ": ", + log.Ldate|log.Ltime).Println(data.(msg_item).Msg_obj...) + return false + }, + `W`:func(data interface{})(bool){ + log.New(io.MultiWriter(data.(msg_item).Show_obj...), + o.Level_string[2] + ": ", + log.Ldate|log.Ltime).Println(data.(msg_item).Msg_obj...) + return false + }, + `E`:func(data interface{})(bool){ + log.New(io.MultiWriter(data.(msg_item).Show_obj...), + o.Level_string[3] + ": ", + log.Ldate|log.Ltime).Println(data.(msg_item).Msg_obj...) + return false + }, + }) + return +} + +// +func copy(i *Log_interface)(o *Log_interface){ + t := *i + o = &t + return +} + +//Level 设置之后日志等级 +func (I *Log_interface) Level(l int) (O *Log_interface) { + O = copy(I) + for k,_ := range O.Level_string { + if k < l {O.Level_string[k] = ``} + } + return +} + + +//Open 日志输出至文件 +func (I *Log_interface) Log_to_file(fileP string) (O *Log_interface) { + O=I + O.File_string = fileP + p.File().NewPath(fileP) + return +} + +//Block 阻塞直到本轮日志输出完毕 +func (I *Log_interface) Block(timeout int) (O *Log_interface) { + O=I + b := make(chan struct{}) + O.MQ.Push_tag(`block`,b) + select { + case <-b: + case <-time.After(time.Duration(timeout)*time.Millisecond): + } + return +} + +//日志等级 +//Base 追加到后续输出 +func (I *Log_interface) Base(i ...interface{}) (O *Log_interface) { + O=copy(I) + O.Base_string = i + return +} +func (I *Log_interface) Base_add(i ...interface{}) (O *Log_interface) { + O=copy(I) + O.Base_string = append(O.Base_string, i...) + return +} +func (I *Log_interface) T(i ...interface{}) (O *Log_interface) { + O=I + if O.Level_string[0] == `` {return} + var showObj = []io.Writer{os.Stdout} + + if O.File_string != `` { + file, err := os.OpenFile(O.File_string, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) + if err != nil {O.E("Failed to open log file:", err)}else{showObj = append(showObj, file)} + } + O.MQ.Push_tag(`T`,msg_item{ + Show_obj:showObj, + Msg_obj:append(O.Base_string, i), + }) + return +} +func (I *Log_interface) I(i ...interface{}) (O *Log_interface) { + O=I + if O.Level_string[1] == `` {return} + var showObj = []io.Writer{os.Stdout} + + if O.File_string != `` { + file, err := os.OpenFile(O.File_string, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) + if err != nil {O.E("Failed to open log file:", err)}else{showObj = append(showObj, file)} + } + O.MQ.Push_tag(`I`,msg_item{ + Show_obj:showObj, + Msg_obj:append(O.Base_string, i), + }) + return +} +func (I *Log_interface) W(i ...interface{}) (O *Log_interface) { + O=I + if O.Level_string[2] == `` {return} + var showObj = []io.Writer{os.Stdout} + + if O.File_string != `` { + file, err := os.OpenFile(O.File_string, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) + if err != nil {O.E("Failed to open log file:", err)}else{showObj = append(showObj, file)} + } + O.MQ.Push_tag(`W`,msg_item{ + Show_obj:showObj, + Msg_obj:append(O.Base_string, i), + }) + return +} +func (I *Log_interface) E(i ...interface{}) (O *Log_interface) { + O=I + if O.Level_string[3] == `` {return} + var showObj = []io.Writer{os.Stdout} + + if O.File_string != `` { + file, err := os.OpenFile(O.File_string, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) + if err != nil {O.E("Failed to open log file:", err)}else{showObj = append(showObj, file)} + } + O.MQ.Push_tag(`E`,msg_item{ + Show_obj:showObj, + Msg_obj:append(O.Base_string, i), + }) + return +} \ No newline at end of file diff --git a/log/Log_test.go b/log/Log_test.go new file mode 100644 index 0000000..e947ef9 --- /dev/null +++ b/log/Log_test.go @@ -0,0 +1,31 @@ +package part + +import ( + "time" + "testing" +) + +type test_item struct { + data string +} + +func Test_1(t *testing.T) { + n := New(Config{ + Level_string:[4]string{`T`,`I`,`W`,`E`}, + }) + time.Sleep(time.Second) + + n.Log_to_file(`1.log`).T(`s`).I("11").W(`12`).E(`a`) + + { + n1 := n.Base(`>1`) + n1.T(`s`).I("11") + { + n2 := n1.Base_add(`>2`) + n2.W(`12`).E(`a`) + } + } + + n.Level(2).T(`s`).I("11").W(`12`).E(`a`) + n.Block(1000) +} \ No newline at end of file