Skip to content

Commit

Permalink
新增:上传日志到FOPS中心
Browse files Browse the repository at this point in the history
  • Loading branch information
steden committed Dec 31, 2023
1 parent 863d74a commit d3a3efe
Show file tree
Hide file tree
Showing 6 changed files with 121 additions and 6 deletions.
14 changes: 14 additions & 0 deletions configure/getFopsServer.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package configure

import "strings"

func GetFopsServer() string {
fopsServer := strings.ToLower(GetString("Fops.Server"))
if !strings.HasPrefix(fopsServer, "http") {
panic("[farseer.yaml]Fops.Server配置不正确,示例:https://fops.fsgit.com")
}
if !strings.HasSuffix(fopsServer, "/") {
fopsServer += "/"
}
return fopsServer
}
4 changes: 2 additions & 2 deletions farseer.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,8 @@ Log:
FileCountLimit: 20 # 文件数量限制
RefreshInterval: 1 # 写入到文件的时间间隔,秒单位,最少为1
Disable: true
Database:
ElasticSearch:
Fops:
Disable: false
Component:
task: true # 打印task组件的日志
cacheManage: true # 打印cacheManage组件的日志
Expand Down
5 changes: 3 additions & 2 deletions flog/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@ package flog
type Config struct {
Component componentConfig
Default levelFormat
Console levelFormat
File fileConfig
Console levelFormat // 输出到控制台
File fileConfig // 写到文件
Fops levelFormat // 上传到FOPS
}

// 组件日志
Expand Down
3 changes: 1 addition & 2 deletions flog/fileProvider.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,7 @@ func (r *fileLoggerPersistent) Log(LogLevel eumLogLevel.Enum, log *logData, exce

// 将缓冲区的日志,每隔1秒,写入文件
func (r *fileLoggerPersistent) writeFile() {
ticker := time.NewTicker(time.Second * time.Duration(r.config.RefreshInterval))
for range ticker.C {
for range time.NewTicker(time.Second * time.Duration(r.config.RefreshInterval)).C {
// 组装要写入的日志内容
var logs []string
for len(r.logsBuffer) > 0 {
Expand Down
96 changes: 96 additions & 0 deletions flog/fopsProvider.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
package flog

import (
"bytes"
"encoding/json"
"fmt"
"github.com/farseer-go/fs"
"github.com/farseer-go/fs/configure"
"github.com/farseer-go/fs/container"
"github.com/farseer-go/fs/core"
"github.com/farseer-go/fs/core/eumLogLevel"
"github.com/farseer-go/fs/dateTime"
"github.com/farseer-go/fs/parse"
"github.com/farseer-go/fs/trace"
"net/http"
"time"
)

// FopsProvider 上传到FOPS
type FopsProvider struct {
}

func (r *FopsProvider) CreateLogger(categoryName string, formatter IFormatter, logLevel eumLogLevel.Enum) ILoggerPersistent {
persistent := &fopsLoggerPersistent{formatter: formatter, fopsServer: configure.GetFopsServer(), queue: make(chan *logData, 10000)}
// 异步开启上传
go persistent.enableUpload()
return persistent
}

type fopsLoggerPersistent struct {
formatter IFormatter
fopsServer string // fops服务端
queue chan *logData // 待上传的列表
}

func (r *fopsLoggerPersistent) IsEnabled(logLevel eumLogLevel.Enum) bool {
return true
}

func (r *fopsLoggerPersistent) Log(LogLevel eumLogLevel.Enum, log *logData, exception error) {
r.queue <- log
}

// 开启上传
func (r *fopsLoggerPersistent) enableUpload() {
for range time.NewTicker(3 * time.Second).C {
var lst []*logData
// 当队列中有数据 且 取出的数量<1000时,则继续取出
for len(r.queue) > 0 && len(lst) < 1000 {
lst = append(lst, <-r.queue)
}

// 没有取到数据
if len(lst) == 0 {
continue
}

// 上传
if err := r.upload(lst); err != nil {
// 重新放回队列
for i := 0; i < len(lst); i++ {
r.queue <- lst[i]
}
// 不能使用flog.Error,如果此处执行了,会一直产生无用的错误信息
fmt.Println(r.formatter.Formatter(&logData{CreateAt: dateTime.Now(), LogLevel: eumLogLevel.Warning, Component: "", Content: err.Error(), newLine: true}))
}
}
}

type UploadRequest struct {
List []*logData
}

func (r *fopsLoggerPersistent) upload(lstLog []*logData) error {
bodyByte, _ := json.Marshal(UploadRequest{List: lstLog})
url := r.fopsServer + "flog/upload"
newRequest, _ := http.NewRequest("POST", url, bytes.NewReader(bodyByte))
newRequest.Header.Set("Content-Type", "application/json")
// 链路追踪
if traceContext := container.Resolve[trace.IManager]().GetCurTrace(); traceContext != nil {
newRequest.Header.Set("Trace-Id", parse.ToString(traceContext.GetTraceId()))
newRequest.Header.Set("Trace-App-Name", fs.AppName)
}
client := &http.Client{}
rsp, err := client.Do(newRequest)
if err != nil {
return err
}

apiRsp := core.NewApiResponseByReader[any](rsp.Body)
if apiRsp.StatusCode != 200 {
return fmt.Errorf("上传日志到%s失败(%v):%s", url, rsp.StatusCode, apiRsp.StatusMessage)
}

return err
}
5 changes: 5 additions & 0 deletions flog/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,11 @@ func InitLog() core.ILog {
factory.AddProviderFormatter(&FileProvider{config: logConfig.File}, formatter, logLevel)
}

// 上传到FOPS
if !logConfig.Fops.Disable && configure.GetString("Fops.Server") != "" {
formatter, logLevel := loadLevelFormat(logConfig.Console, defaultLevel, defaultFormat, logConfig.Default)
factory.AddProviderFormatter(&FopsProvider{}, formatter, logLevel)
}
log = factory.CreateLogger("")
return log
}
Expand Down

0 comments on commit d3a3efe

Please sign in to comment.