90 lines
1.9 KiB
Go
90 lines
1.9 KiB
Go
// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved.
|
|
|
|
//go:build plus
|
|
|
|
package accesslogs
|
|
|
|
import (
|
|
"fmt"
|
|
teaconst "github.com/TeaOSLab/EdgeAPI/internal/const"
|
|
"github.com/TeaOSLab/EdgeAPI/internal/goman"
|
|
"github.com/TeaOSLab/EdgeAPI/internal/remotelogs"
|
|
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
|
|
"runtime"
|
|
)
|
|
|
|
var httpAccessLogQueue = make(chan []*pb.HTTPAccessLog, 1024)
|
|
|
|
func init() {
|
|
if !teaconst.IsMain {
|
|
return
|
|
}
|
|
|
|
// 多进程读取
|
|
var threads = runtime.NumCPU() / 2
|
|
if threads <= 0 {
|
|
threads = 1
|
|
}
|
|
if threads > 16 {
|
|
threads = 16
|
|
}
|
|
for i := 0; i < threads; i++ {
|
|
goman.New(func() {
|
|
for pbAccessLogs := range httpAccessLogQueue {
|
|
var policyId = SharedStorageManager.publicPolicyId
|
|
if policyId <= 0 {
|
|
continue
|
|
}
|
|
_, _, err := SharedStorageManager.WriteToPolicy(policyId, pbAccessLogs)
|
|
if err != nil {
|
|
remotelogs.Error("HTTP_ACCESS_LOG_POLICY", "write failed: "+err.Error())
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func (this *StorageManager) Write(pbAccessLogs []*pb.HTTPAccessLog) error {
|
|
if len(pbAccessLogs) == 0 {
|
|
return nil
|
|
}
|
|
|
|
var policyId = this.publicPolicyId
|
|
if policyId <= 0 {
|
|
return nil
|
|
}
|
|
|
|
select {
|
|
case httpAccessLogQueue <- pbAccessLogs:
|
|
default:
|
|
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// WriteToPolicy 写入日志到策略
|
|
func (this *StorageManager) WriteToPolicy(policyId int64, accessLogs []*pb.HTTPAccessLog) (success bool, failMessage string, err error) {
|
|
if !teaconst.IsPlus {
|
|
return false, "only works in plus version", nil
|
|
}
|
|
|
|
this.locker.Lock()
|
|
storage, ok := this.storageMap[policyId]
|
|
this.locker.Unlock()
|
|
|
|
if !ok {
|
|
return false, "the policy has not been started yet", nil
|
|
}
|
|
|
|
if !storage.IsOk() {
|
|
return false, "the policy failed to start", nil
|
|
}
|
|
|
|
err = storage.Write(accessLogs)
|
|
if err != nil {
|
|
return false, "", fmt.Errorf("write access log to policy '%d' failed: %w", policyId, err)
|
|
}
|
|
return true, "", nil
|
|
}
|