|
|
|
|
// Copyright 2022 ROC. All rights reserved.
|
|
|
|
|
// Use of this source code is governed by a MIT style
|
|
|
|
|
// license that can be found in the LICENSE file.
|
|
|
|
|
|
|
|
|
|
package conf
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"github.com/meilisearch/meilisearch-go"
|
|
|
|
|
"github.com/sirupsen/logrus"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type meiliLogData []map[string]any
|
|
|
|
|
|
|
|
|
|
type meiliLogHook struct {
|
|
|
|
|
config meilisearch.ClientConfig
|
|
|
|
|
idxName string
|
|
|
|
|
addDocsCh chan *meiliLogData
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (h *meiliLogHook) Fire(entry *logrus.Entry) error {
|
|
|
|
|
data := meiliLogData{{
|
|
|
|
|
"id": entry.Time.Unix(),
|
|
|
|
|
"time": entry.Time,
|
|
|
|
|
"level": entry.Level,
|
|
|
|
|
"message": entry.Message,
|
|
|
|
|
"data": entry.Data,
|
|
|
|
|
}}
|
|
|
|
|
|
|
|
|
|
// 先尝试进log缓存,否则直接新开goroutine加文档
|
|
|
|
|
select {
|
|
|
|
|
case h.addDocsCh <- &data:
|
|
|
|
|
default:
|
|
|
|
|
go func(index *meilisearch.Index, item meiliLogData) {
|
|
|
|
|
index.AddDocuments(item)
|
|
|
|
|
}(h.index(), data)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (h *meiliLogHook) handleAddDocs() {
|
|
|
|
|
index := h.index()
|
|
|
|
|
for item := range h.addDocsCh {
|
|
|
|
|
index.AddDocuments(item)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (h *meiliLogHook) Levels() []logrus.Level {
|
|
|
|
|
return logrus.AllLevels
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (h *meiliLogHook) index() *meilisearch.Index {
|
|
|
|
|
return meilisearch.NewClient(h.config).Index(h.idxName)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func newMeiliLogHook() *meiliLogHook {
|
|
|
|
|
hook := &meiliLogHook{
|
|
|
|
|
config: meilisearch.ClientConfig{
|
|
|
|
|
Host: loggerMeiliSetting.Endpoint(),
|
|
|
|
|
APIKey: loggerMeiliSetting.ApiKey,
|
|
|
|
|
},
|
|
|
|
|
idxName: loggerMeiliSetting.Index,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
client := meilisearch.NewClient(hook.config)
|
|
|
|
|
index := client.Index(hook.idxName)
|
|
|
|
|
if _, err := index.FetchInfo(); err != nil {
|
|
|
|
|
client.CreateIndex(&meilisearch.IndexConfig{
|
|
|
|
|
Uid: hook.idxName,
|
|
|
|
|
PrimaryKey: "id",
|
|
|
|
|
})
|
|
|
|
|
sortableAttributes := []string{
|
|
|
|
|
"time",
|
|
|
|
|
}
|
|
|
|
|
index.UpdateSortableAttributes(&sortableAttributes)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 初始化addDocsCh
|
|
|
|
|
hook.addDocsCh = make(chan *meiliLogData, loggerMeiliSetting.maxLogBuffer())
|
|
|
|
|
|
|
|
|
|
// 启动后台log工作者
|
|
|
|
|
for minWork := loggerMeiliSetting.minWork(); minWork > 0; minWork-- {
|
|
|
|
|
go hook.handleAddDocs()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return hook
|
|
|
|
|
}
|