@@ -35,7 +35,12 @@ import _ "golib.gaore.com/GaoreGo/grlogs/logs/es" | |||
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 | |||
package grlogs | |||
@@ -71,7 +76,12 @@ func TestGetLogger(t *testing.T) { | |||
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" | |||
"os" | |||
"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 { | |||
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()) | |||
}, | |||
} | |||
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 { | |||
if call, ok := adatperMapper[adapter]; ok { | |||
if call, ok := adatperSetMapper[adapter]; ok { | |||
if err := call(self, level); err != nil { | |||
fmt.Println(err) | |||
} | |||
@@ -25,6 +25,15 @@ func (self *Logger) SetAdapter(level Level, adapter Adapter) *Logger { | |||
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) { | |||
var channellens int64 | |||
var tmp interface{} | |||
@@ -1,6 +1,7 @@ | |||
package grlogs | |||
import ( | |||
"errors" | |||
_ "golib.gaore.com/GaoreGo/grlogs/logs/alils" | |||
_ "golib.gaore.com/GaoreGo/grlogs/logs/es" | |||
"testing" | |||
@@ -49,3 +50,12 @@ func TestGetAliLs(t *testing.T) { | |||
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() | |||
} |