Compare commits
8 Commits
Author | SHA1 | Date | |
---|---|---|---|
8b94a0d256 | |||
38247cf3c9 | |||
36a085eccb | |||
|
e0682ed122 | ||
|
cd85fd66ff | ||
|
3c03b5c497 | ||
|
cd94900f19 | ||
|
ce9ab060d9 |
40
funtion.go
40
funtion.go
@ -45,25 +45,17 @@ var adatperSetMapper = map[Adapter]func(l *Logger, level Level) error{
|
||||
},
|
||||
|
||||
AdapterElasticSearch: func(l *Logger, level Level) error {
|
||||
|
||||
dsn := "http://es-cn-0pp1mm3hq000dnbh4.public.elasticsearch.aliyuncs.com:9200/"
|
||||
if os.Getenv(envkey) == "prod" || os.Getenv(envkey) == "" || os.Getenv(envkey) == "gray" {
|
||||
dsn = "http://es-cn-0pp1mm3hq000dnbh4.elasticsearch.aliyuncs.com:9200/"
|
||||
}
|
||||
|
||||
c := EsConfig{
|
||||
Username: "elastic",
|
||||
Password: "Hellogaore@",
|
||||
Dsn: dsn,
|
||||
Level: level,
|
||||
Index: os.Getenv("GRLOG_APP_NAME"),
|
||||
}
|
||||
|
||||
c := GenEsConfig(level)
|
||||
return l.SetLogger(logs.AdapterEs, c.String())
|
||||
},
|
||||
|
||||
AdapterAliLs: func(l *Logger, level Level) error {
|
||||
c := GenAliConfig(level)
|
||||
return l.SetLogger(logs.AdapterAliLS, c.String())
|
||||
},
|
||||
}
|
||||
|
||||
func GenAliConfig(level Level) *AliLSConfig {
|
||||
var project string = "gaore-app-logstore"
|
||||
var endpoint string
|
||||
|
||||
@ -73,7 +65,7 @@ var adatperSetMapper = map[Adapter]func(l *Logger, level Level) error{
|
||||
endpoint = project + ".cn-shenzhen.log.aliyuncs.com"
|
||||
}
|
||||
|
||||
c := AliLSConfig{
|
||||
c := &AliLSConfig{
|
||||
Project: project,
|
||||
Endpoint: endpoint,
|
||||
KeyID: "LTAI4GCHwcqtrFD4DHRHxR4k",
|
||||
@ -84,9 +76,23 @@ var adatperSetMapper = map[Adapter]func(l *Logger, level Level) error{
|
||||
Level: level,
|
||||
FlushWhen: 0,
|
||||
}
|
||||
return c
|
||||
}
|
||||
|
||||
return l.SetLogger(logs.AdapterAliLS, c.String())
|
||||
},
|
||||
func GenEsConfig(level Level) *EsConfig {
|
||||
dsn := "http://es-cn-tl32xlfmu00015h34.public.elasticsearch.aliyuncs.com:9200/"
|
||||
if os.Getenv(envkey) == "prod" || os.Getenv(envkey) == "" || os.Getenv(envkey) == "gray" {
|
||||
dsn = "http://es-cn-tl32xlfmu00015h34.elasticsearch.aliyuncs.com:9200/"
|
||||
}
|
||||
|
||||
c := &EsConfig{
|
||||
Username: "kaifa_api",
|
||||
Password: "2quYX3bTeahO",
|
||||
Dsn: dsn,
|
||||
Level: level,
|
||||
Index: os.Getenv("GRLOG_APP_NAME"),
|
||||
}
|
||||
return c
|
||||
}
|
||||
|
||||
var adatperDropMapper = map[Adapter]func(l *Logger) error{
|
||||
|
97
log.go
97
log.go
@ -11,11 +11,19 @@ var loggers = sync.Map{}
|
||||
|
||||
var envkey = "CENTER_RUNMODE"
|
||||
|
||||
var defaultModeMapping = map[string][]AdapterTupple{
|
||||
"es": []AdapterTupple{{LevelAll, AdapterConsole}, {LevelAll, AdapterElasticSearch}},
|
||||
"ali": []AdapterTupple{{LevelAll, AdapterConsole}, {LevelAll, AdapterAliLs}},
|
||||
"": []AdapterTupple{{LevelAll, AdapterConsole}, {LevelAll, AdapterFile}},
|
||||
}
|
||||
|
||||
type Logger struct {
|
||||
Lable string
|
||||
*logs.BeeLogger
|
||||
}
|
||||
|
||||
type Getter func() *Logger
|
||||
|
||||
func (self *Logger) SetAdapter(level Level, adapter Adapter) *Logger {
|
||||
if call, ok := adatperSetMapper[adapter]; ok {
|
||||
if err := call(self, level); err != nil {
|
||||
@ -34,65 +42,61 @@ func (self *Logger) DropAdapter(adapter Adapter) *Logger {
|
||||
return self
|
||||
}
|
||||
|
||||
func New(label string, channelLens ...int64) (l *Logger, loaded bool) {
|
||||
var channellens int64
|
||||
var tmp interface{}
|
||||
func newLoggerFromMap(label string, defaultmode string, channelLens ...int64) Getter {
|
||||
|
||||
tmp, loaded = loggers.LoadOrStore(label, new(Logger))
|
||||
l = tmp.(*Logger)
|
||||
if len(channelLens) > 0 {
|
||||
channellens = channelLens[0]
|
||||
if tmp, ok := loggers.Load(label); ok {
|
||||
return tmp.(Getter)
|
||||
}
|
||||
|
||||
if !loaded {
|
||||
var l *Logger
|
||||
var once sync.Once
|
||||
wapperGetter := Getter(func() *Logger {
|
||||
once.Do(func() {
|
||||
|
||||
var channelLensNum int64 = 100
|
||||
if len(channelLens) > 0 && channelLens[0] > 0 {
|
||||
channelLensNum = channelLens[0]
|
||||
}
|
||||
|
||||
l = &Logger{BeeLogger: logs.NewLogger(channelLensNum)}
|
||||
l.Lable = label
|
||||
l.BeeLogger = logs.NewLogger(channellens)
|
||||
l.BeeLogger = logs.NewLogger(channelLensNum)
|
||||
l.BeeLogger.Lable = label
|
||||
l.Env = os.Getenv(envkey)
|
||||
l.SetPrefix(fmt.Sprintf("[env:%s logger:%s]", os.Getenv(envkey), label))
|
||||
l.EnableFuncCallDepth(true)
|
||||
l.SetLogFuncCallDepth(2)
|
||||
if mode, ok := defaultModeMapping[defaultmode]; ok {
|
||||
for _, v := range mode {
|
||||
l.SetAdapter(v.Level, v.Adapter)
|
||||
}
|
||||
return
|
||||
}
|
||||
})
|
||||
|
||||
return l
|
||||
})
|
||||
|
||||
tmp, loaded := loggers.LoadOrStore(label, wapperGetter)
|
||||
if loaded {
|
||||
return tmp.(Getter)
|
||||
}
|
||||
|
||||
func Get(label string, channelLens ...int64) (l *Logger) {
|
||||
var filelevel Level = LevelInfo
|
||||
var loaded bool
|
||||
if os.Getenv(envkey) == "dev" {
|
||||
filelevel = LevelAll
|
||||
return wapperGetter
|
||||
}
|
||||
|
||||
if l, loaded = New(label, channelLens...); !loaded {
|
||||
l.SetAdapter(filelevel, AdapterFile).SetAdapter(LevelAll, AdapterConsole)
|
||||
}
|
||||
return
|
||||
func Get(label string, channelLens ...int64) *Logger {
|
||||
getter := newLoggerFromMap(label, "", channelLens...)
|
||||
return getter()
|
||||
}
|
||||
|
||||
func GetEs(label string, channelLens ...int64) (l *Logger) {
|
||||
var filelevel Level = LevelInfo
|
||||
var loaded bool
|
||||
if os.Getenv(envkey) == "dev" {
|
||||
filelevel = LevelAll
|
||||
func GetEs(label string, channelLens ...int64) *Logger {
|
||||
getter := newLoggerFromMap(label, "es", channelLens...)
|
||||
return getter()
|
||||
}
|
||||
|
||||
if l, loaded = New(label, channelLens...); !loaded {
|
||||
l.SetAdapter(filelevel, AdapterFile).SetAdapter(LevelAll, AdapterConsole).SetAdapter(filelevel, AdapterElasticSearch)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func GetAli(label string, channelLens ...int64) (l *Logger) {
|
||||
var filelevel Level = LevelInfo
|
||||
var loaded bool
|
||||
if os.Getenv(envkey) == "dev" {
|
||||
filelevel = LevelAll
|
||||
}
|
||||
|
||||
if l, loaded = New(label, channelLens...); !loaded {
|
||||
l.SetAdapter(LevelAll, AdapterConsole).SetAdapter(filelevel, AdapterFile).SetAdapter(filelevel, AdapterAliLs)
|
||||
}
|
||||
return
|
||||
func GetAli(label string, channelLens ...int64) *Logger {
|
||||
getter := newLoggerFromMap(label, "ali", channelLens...)
|
||||
return getter()
|
||||
}
|
||||
|
||||
func Close(lables ...string) {
|
||||
@ -128,3 +132,14 @@ func CloseAll() {
|
||||
})
|
||||
wg.Wait()
|
||||
}
|
||||
|
||||
func init() {
|
||||
var level Level = LevelInfo
|
||||
if os.Getenv(envkey) == "dev" {
|
||||
level = LevelAll
|
||||
}
|
||||
|
||||
defaultModeMapping["es"] = []AdapterTupple{{level, AdapterConsole}, {level, AdapterElasticSearch}}
|
||||
defaultModeMapping["ali"] = []AdapterTupple{{level, AdapterConsole}, {level, AdapterAliLs}}
|
||||
defaultModeMapping[""] = []AdapterTupple{{level, AdapterConsole}, {level, AdapterFile}}
|
||||
}
|
||||
|
39
log_test.go
39
log_test.go
@ -4,6 +4,7 @@ import (
|
||||
"errors"
|
||||
_ "golib.gaore.com/GaoreGo/grlogs/logs/alils"
|
||||
_ "golib.gaore.com/GaoreGo/grlogs/logs/es"
|
||||
"sync"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
@ -48,7 +49,7 @@ func TestGetAliLs(t *testing.T) {
|
||||
l.Warn("Warn")
|
||||
}
|
||||
|
||||
Close(lable, lable, lable)
|
||||
time.Sleep(time.Hour * 1)
|
||||
}
|
||||
|
||||
func TestDropAdapter(t *testing.T) {
|
||||
@ -59,3 +60,39 @@ func TestDropAdapter(t *testing.T) {
|
||||
Debug(errors.New("he hello"))
|
||||
CloseAll()
|
||||
}
|
||||
|
||||
func TestNew(t *testing.T) {
|
||||
wg := sync.WaitGroup{}
|
||||
for i := 0; i < 10; i++ {
|
||||
wg.Add(1)
|
||||
go func(i int) {
|
||||
GetAli("ok").Debug("%d", i)
|
||||
time.Sleep(time.Second * 10)
|
||||
wg.Done()
|
||||
}(i)
|
||||
}
|
||||
|
||||
for i := 0; i < 10; i++ {
|
||||
GetAli("ok").Debug("aaaaaa%d", i)
|
||||
}
|
||||
|
||||
wg.Wait()
|
||||
}
|
||||
|
||||
func TestGetEs(t *testing.T) {
|
||||
wg := sync.WaitGroup{}
|
||||
for i := 0; i < 10; i++ {
|
||||
wg.Add(1)
|
||||
go func(i int) {
|
||||
GetEs("ok").Debug("%d", i)
|
||||
time.Sleep(time.Second * 10)
|
||||
wg.Done()
|
||||
}(i)
|
||||
}
|
||||
|
||||
for i := 0; i < 10; i++ {
|
||||
GetEs("ok").Debug("aaaaaa%d", i)
|
||||
}
|
||||
|
||||
wg.Wait()
|
||||
}
|
||||
|
@ -5,6 +5,8 @@ import (
|
||||
"fmt"
|
||||
"github.com/aliyun/aliyun-log-go-sdk/producer"
|
||||
"golib.gaore.com/GaoreGo/grlogs/logs"
|
||||
"os"
|
||||
"runtime"
|
||||
"time"
|
||||
)
|
||||
|
||||
@ -27,6 +29,7 @@ type alilsLogger struct {
|
||||
Source string `json:"source"`
|
||||
Level int `json:"level"`
|
||||
FlushWhen int `json:"flush_when"`
|
||||
Debug bool
|
||||
}
|
||||
|
||||
func (a *alilsLogger) Init(jsonconfig string) error {
|
||||
@ -40,11 +43,14 @@ func (a *alilsLogger) Init(jsonconfig string) error {
|
||||
producerConfig.AccessKeyID = a.KeyID
|
||||
producerConfig.AccessKeySecret = a.KeySecret
|
||||
producerConfig.LingerMs = 100
|
||||
producerConfig.NoRetryStatusCodeList = []int{-1}
|
||||
producerConfig.Retries = 2
|
||||
producerConfig.AllowLogLevel = "error"
|
||||
producerConfig.MaxIoWorkerCount = int64(runtime.NumCPU())
|
||||
a.producer = producer.InitProducer(producerConfig)
|
||||
a.callback = &Callback{}
|
||||
a.producer.Start()
|
||||
|
||||
a.Debug = os.Getenv("GRLOG_ALILS_DEBUG") == "on"
|
||||
return nil
|
||||
}
|
||||
|
||||
@ -62,12 +68,19 @@ func (a *alilsLogger) WriteMsg(when time.Time, msg string, level int, lable stri
|
||||
|
||||
log := producer.GenerateLog(uint32(when.Unix()), vals)
|
||||
|
||||
if a.Debug {
|
||||
for _, topic := range a.Topics {
|
||||
if err := a.producer.SendLogWithCallBack(a.Project, a.LogStore, topic, a.Source, log, a.callback); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for _, topic := range a.Topics {
|
||||
if err := a.producer.SendLog(a.Project, a.LogStore, topic, a.Source, log); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
|
@ -11,15 +11,15 @@ type Callback struct {
|
||||
func (callback *Callback) Success(result *producer.Result) {
|
||||
attemptList := result.GetReservedAttempts()
|
||||
for _, attempt := range attemptList {
|
||||
fmt.Printf("%+v \n", attempt)
|
||||
fmt.Printf("alilog %+v \n", attempt)
|
||||
}
|
||||
}
|
||||
|
||||
func (callback *Callback) Fail(result *producer.Result) {
|
||||
fmt.Println(result.IsSuccessful())
|
||||
fmt.Println(result.GetErrorCode())
|
||||
fmt.Println(result.GetErrorMessage())
|
||||
fmt.Println(result.GetReservedAttempts())
|
||||
fmt.Println(result.GetRequestId())
|
||||
fmt.Println(result.GetTimeStampMs())
|
||||
fmt.Println("IsSuccessful", result.IsSuccessful())
|
||||
fmt.Println("GetErrorCode", result.GetErrorCode())
|
||||
fmt.Println("GetErrorMessage", result.GetErrorMessage())
|
||||
fmt.Println("GetReservedAttempts", result.GetReservedAttempts())
|
||||
fmt.Println("GetRequestId", result.GetRequestId())
|
||||
fmt.Println("GetTimeStampMs", result.GetTimeStampMs())
|
||||
}
|
||||
|
@ -89,7 +89,7 @@ func (el *esLogger) WriteMsg(when time.Time, msg string, level int, lable string
|
||||
|
||||
d := goes.Document{
|
||||
Index: fmt.Sprintf("%s-%04d.%02d.%02d", el.IndexName, when.Year(), when.Month(), when.Day()),
|
||||
Type: "logs",
|
||||
Type: "_doc",
|
||||
Fields: vals,
|
||||
}
|
||||
_, err := el.Index(d, nil)
|
||||
|
@ -281,7 +281,7 @@ func testFileRotate(t *testing.T, fn1, fn2 string, daily, hourly bool) {
|
||||
fw.hourlyOpenDate = fw.hourlyOpenTime.Day()
|
||||
}
|
||||
|
||||
fw.WriteMsg(time.Now(), "this is a msg for test", LevelDebug)
|
||||
fw.WriteMsg(time.Now(), "this is a msg for test", LevelDebug, "", "dev")
|
||||
|
||||
for _, file := range []string{fn1, fn2} {
|
||||
_, err := os.Stat(file)
|
||||
|
11
options.go
11
options.go
@ -4,6 +4,11 @@ type Level int
|
||||
|
||||
type Adapter string
|
||||
|
||||
type AdapterTupple struct {
|
||||
Level Level
|
||||
Adapter Adapter
|
||||
}
|
||||
|
||||
const (
|
||||
_ Level = iota
|
||||
LevelNone Level = iota
|
||||
@ -23,3 +28,9 @@ const (
|
||||
AdapterElasticSearch Adapter = "es"
|
||||
AdapterAliLs Adapter = "alils"
|
||||
)
|
||||
|
||||
const (
|
||||
DEV = "dev"
|
||||
GRAY = "gray"
|
||||
PROD = "prod"
|
||||
)
|
||||
|
Loading…
Reference in New Issue
Block a user