@@ -35,7 +35,12 @@ import _ "golib.gaore.com/GaoreGo/grlogs/logs/es" | |||||
5. 文件日志会写入到 `./runtime/logs/` 文件夹 **请务必在项目构建阶段创建该目录** | 5. 文件日志会写入到 `./runtime/logs/` 文件夹 **请务必在项目构建阶段创建该目录** | ||||
6. 完整示例 | |||||
6. `AliLS` 日志接入的是阿里SLS GOSDK , 下面是关于 [https://github.com/aliyun/aliyun-log-go-sdk/tree/master/producer] 描述 | |||||
producer提供了两种关闭模式,分为有限关闭和安全关闭,安全关闭会等待producer中缓存的所有的数据全部发送完成以后在关闭producer,有限关闭会接收用户传递的一个参数值,时间单位为秒,当开始关闭producer的时候开始计时,超过传递的设定值还未能完全关闭producer的话会强制退出producer,此时可能会有部分数据未被成功发送而丢失。 | |||||
所以用了aliLS 的 adapter 时,最好调用`grlogs.Close()` 或 `grlogs.CloseAll()` 方法安全关闭通道,以刷新缓冲区 | |||||
7. 完整示例 | |||||
```go | ```go | ||||
package grlogs | package grlogs | ||||
@@ -71,7 +76,12 @@ func TestGetLogger(t *testing.T) { | |||||
Get("wifi").Critical("neoweiwoewe") | Get("wifi").Critical("neoweiwoewe") | ||||
} | } | ||||
func TestGetEs(t *testing.T) { | |||||
fmt.Println("hello world") | |||||
func TestDropAdapter(t *testing.T) { | |||||
SetAdapter(LevelAll, AdapterAliLs) | |||||
DropAdapter(AdapterAliLs) | |||||
Informational(errors.New("he hello")) | |||||
SetAdapter(LevelAll, AdapterAliLs) | |||||
Debug(errors.New("he hello")) | |||||
CloseAll() | |||||
} | } | ||||
``` | ``` |
@@ -5,9 +5,21 @@ import ( | |||||
"github.com/astaxie/beego/logs" | "github.com/astaxie/beego/logs" | ||||
"os" | "os" | ||||
"path" | "path" | ||||
"strings" | |||||
) | ) | ||||
var adatperMapper = map[Adapter]func(l *Logger, level Level) error{ | |||||
var adatperSetMapper = map[Adapter]func(l *Logger, level Level) error{ | |||||
AdapterSocket: func(l *Logger, level Level) error { | |||||
c := ConnLogConfig{ | |||||
ReconnectOnMsg: false, | |||||
Reconnect: true, | |||||
Net: "", | |||||
Addr: "127.0.0.1:9888", | |||||
Level: level, | |||||
} | |||||
return l.SetLogger(logs.AdapterConn, c.String()) | |||||
}, | |||||
AdapterFile: func(l *Logger, level Level) error { | AdapterFile: func(l *Logger, level Level) error { | ||||
if wd, err := os.Getwd(); err == nil { | if wd, err := os.Getwd(); err == nil { | ||||
@@ -76,3 +88,46 @@ var adatperMapper = map[Adapter]func(l *Logger, level Level) error{ | |||||
return l.SetLogger(logs.AdapterAliLS, c.String()) | return l.SetLogger(logs.AdapterAliLS, c.String()) | ||||
}, | }, | ||||
} | } | ||||
var adatperDropMapper = map[Adapter]func(l *Logger) error{ | |||||
AdapterAliLs: func(l *Logger) error { | |||||
return l.BeeLogger.DelLogger(logs.AdapterAliLS) | |||||
}, | |||||
AdapterFile: func(l *Logger) error { | |||||
return l.BeeLogger.DelLogger(logs.AdapterFile) | |||||
}, | |||||
AdapterConsole: func(l *Logger) error { | |||||
return l.BeeLogger.DelLogger(logs.AdapterConsole) | |||||
}, | |||||
AdapterElasticSearch: func(l *Logger) error { | |||||
return l.BeeLogger.DelLogger(logs.AdapterEs) | |||||
}, | |||||
} | |||||
func formatLog(f interface{}, v ...interface{}) string { | |||||
var msg string | |||||
switch f.(type) { | |||||
case string: | |||||
msg = f.(string) | |||||
if len(v) == 0 { | |||||
return msg | |||||
} | |||||
if strings.Contains(msg, "%") && !strings.Contains(msg, "%%") { | |||||
//format string | |||||
} else { | |||||
//do not contain format char | |||||
msg += strings.Repeat(" %v", len(v)) | |||||
} | |||||
default: | |||||
msg = fmt.Sprint(f) | |||||
if len(v) == 0 { | |||||
return msg | |||||
} | |||||
msg += strings.Repeat(" %v", len(v)) | |||||
} | |||||
return fmt.Sprintf(msg, v...) | |||||
} |
@@ -0,0 +1,59 @@ | |||||
package grlogs | |||||
import "strings" | |||||
func Info(v ...interface{}) { | |||||
Get("grlogs").Info(generateFmtStr(len(v)), v...) | |||||
} | |||||
func Informational(v ...interface{}) { | |||||
Get("grlogs").Informational(generateFmtStr(len(v)), v...) | |||||
} | |||||
func Warning(v ...interface{}) { | |||||
Get("grlogs").Warning(generateFmtStr(len(v)), v...) | |||||
} | |||||
func Warn(v ...interface{}) { | |||||
Get("grlogs").Warn(generateFmtStr(len(v)), v...) | |||||
} | |||||
func Notice(v ...interface{}) { | |||||
Get("grlogs").Notice(generateFmtStr(len(v)), v...) | |||||
} | |||||
func Error(v ...interface{}) { | |||||
Get("grlogs").Error(generateFmtStr(len(v)), v...) | |||||
} | |||||
func Critical(v ...interface{}) { | |||||
Get("grlogs").Critical(generateFmtStr(len(v)), v...) | |||||
} | |||||
func Alert(v ...interface{}) { | |||||
Get("grlogs").Alert(generateFmtStr(len(v)), v...) | |||||
} | |||||
func Emergency(v ...interface{}) { | |||||
Get("grlogs").Emergency(generateFmtStr(len(v)), v...) | |||||
} | |||||
func Trace(v ...interface{}) { | |||||
Get("grlogs").Trace(generateFmtStr(len(v)), v...) | |||||
} | |||||
func Debug(v ...interface{}) { | |||||
Get("grlogs").Debug(generateFmtStr(len(v)), v...) | |||||
} | |||||
func generateFmtStr(n int) string { | |||||
return strings.Repeat("%v ", n) | |||||
} | |||||
func SetAdapter(level Level, adapter Adapter) { | |||||
Get("grlogs").SetAdapter(level, adapter) | |||||
} | |||||
func DropAdapter(adapter Adapter) { | |||||
Get("grlogs").DropAdapter(adapter) | |||||
} |
@@ -17,7 +17,7 @@ type Logger struct { | |||||
} | } | ||||
func (self *Logger) SetAdapter(level Level, adapter Adapter) *Logger { | func (self *Logger) SetAdapter(level Level, adapter Adapter) *Logger { | ||||
if call, ok := adatperMapper[adapter]; ok { | |||||
if call, ok := adatperSetMapper[adapter]; ok { | |||||
if err := call(self, level); err != nil { | if err := call(self, level); err != nil { | ||||
fmt.Println(err) | fmt.Println(err) | ||||
} | } | ||||
@@ -25,6 +25,15 @@ func (self *Logger) SetAdapter(level Level, adapter Adapter) *Logger { | |||||
return self | return self | ||||
} | } | ||||
func (self *Logger) DropAdapter(adapter Adapter) *Logger { | |||||
if call, ok := adatperDropMapper[adapter]; ok { | |||||
if err := call(self); err != nil { | |||||
fmt.Println(err) | |||||
} | |||||
} | |||||
return self | |||||
} | |||||
func New(label string, channelLens ...int64) (l *Logger, loaded bool) { | func New(label string, channelLens ...int64) (l *Logger, loaded bool) { | ||||
var channellens int64 | var channellens int64 | ||||
var tmp interface{} | var tmp interface{} | ||||
@@ -1,6 +1,7 @@ | |||||
package grlogs | package grlogs | ||||
import ( | import ( | ||||
"errors" | |||||
_ "golib.gaore.com/GaoreGo/grlogs/logs/alils" | _ "golib.gaore.com/GaoreGo/grlogs/logs/alils" | ||||
_ "golib.gaore.com/GaoreGo/grlogs/logs/es" | _ "golib.gaore.com/GaoreGo/grlogs/logs/es" | ||||
"testing" | "testing" | ||||
@@ -49,3 +50,12 @@ func TestGetAliLs(t *testing.T) { | |||||
Close(lable, lable, lable) | Close(lable, lable, lable) | ||||
} | } | ||||
func TestDropAdapter(t *testing.T) { | |||||
SetAdapter(LevelAll, AdapterAliLs) | |||||
DropAdapter(AdapterAliLs) | |||||
Informational(errors.New("he hello")) | |||||
SetAdapter(LevelAll, AdapterAliLs) | |||||
Debug(errors.New("he hello")) | |||||
CloseAll() | |||||
} |