init
This commit is contained in:
@@ -0,0 +1,153 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
|
||||
"github.com/goravel/framework/contracts/http"
|
||||
"github.com/goravel/framework/facades"
|
||||
|
||||
apperrors "goravel/app/errors"
|
||||
"goravel/app/http/helpers"
|
||||
"goravel/app/models"
|
||||
"goravel/app/utils/traceid"
|
||||
)
|
||||
|
||||
type SystemLogService interface {
|
||||
// GetByID 根据ID获取系统日志
|
||||
GetByID(id uint) (*models.SystemLog, error)
|
||||
// GetList 获取系统日志列表
|
||||
GetList(filters SystemLogFilters, page, pageSize int) ([]models.SystemLog, int64, error)
|
||||
// RecordHTTP 记录系统日志(HTTP context)
|
||||
RecordHTTP(ctx http.Context, level, module, message string, attributes map[string]any) error
|
||||
// Record 记录系统日志(标准 context)
|
||||
Record(ctx context.Context, level, module, message string, attributes map[string]any) error
|
||||
}
|
||||
|
||||
// SystemLogFilters 系统日志查询过滤器
|
||||
type SystemLogFilters struct {
|
||||
Level string
|
||||
Module string
|
||||
TraceID string
|
||||
Message string
|
||||
StartTime string
|
||||
EndTime string
|
||||
OrderBy string
|
||||
}
|
||||
|
||||
type SystemLogServiceImpl struct {
|
||||
}
|
||||
|
||||
func NewSystemLogService() SystemLogService {
|
||||
return &SystemLogServiceImpl{}
|
||||
}
|
||||
|
||||
// GetByID 根据ID获取系统日志
|
||||
func (s *SystemLogServiceImpl) GetByID(id uint) (*models.SystemLog, error) {
|
||||
var log models.SystemLog
|
||||
if err := facades.Orm().Query().Where("id", id).FirstOrFail(&log); err != nil {
|
||||
return nil, apperrors.ErrLogNotFound.WithError(err)
|
||||
}
|
||||
return &log, nil
|
||||
}
|
||||
|
||||
// GetList 获取系统日志列表
|
||||
func (s *SystemLogServiceImpl) GetList(filters SystemLogFilters, page, pageSize int) ([]models.SystemLog, int64, error) {
|
||||
query := facades.Orm().Query().Model(&models.SystemLog{})
|
||||
|
||||
// 应用筛选条件
|
||||
if filters.Level != "" {
|
||||
query = query.Where("level = ?", filters.Level)
|
||||
}
|
||||
if filters.Module != "" {
|
||||
query = query.Where("module LIKE ?", "%"+filters.Module+"%")
|
||||
}
|
||||
if filters.TraceID != "" {
|
||||
query = query.Where("trace_id LIKE ?", "%"+filters.TraceID+"%")
|
||||
}
|
||||
if filters.Message != "" {
|
||||
query = query.Where("message LIKE ?", "%"+filters.Message+"%")
|
||||
}
|
||||
if filters.StartTime != "" {
|
||||
query = query.Where("created_at >= ?", filters.StartTime)
|
||||
}
|
||||
if filters.EndTime != "" {
|
||||
query = query.Where("created_at <= ?", filters.EndTime)
|
||||
}
|
||||
|
||||
// 应用排序
|
||||
orderBy := filters.OrderBy
|
||||
if orderBy == "" {
|
||||
orderBy = "id:desc"
|
||||
}
|
||||
query = helpers.ApplySort(query, orderBy, "id:desc")
|
||||
|
||||
// 分页查询
|
||||
var logs []models.SystemLog
|
||||
var total int64
|
||||
if err := query.Paginate(page, pageSize, &logs, &total); err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
|
||||
return logs, total, nil
|
||||
}
|
||||
|
||||
// RecordHTTP 记录系统日志(HTTP context)
|
||||
func (s *SystemLogServiceImpl) RecordHTTP(ctx http.Context, level, module, message string, attributes map[string]any) error {
|
||||
var contextJSON string
|
||||
if len(attributes) > 0 {
|
||||
if data, err := json.Marshal(attributes); err == nil {
|
||||
contextJSON = string(data)
|
||||
}
|
||||
}
|
||||
|
||||
traceID := traceid.FromHTTPContext(ctx)
|
||||
if traceID == "" {
|
||||
traceID = traceid.EnsureHTTPContext(ctx, "")
|
||||
}
|
||||
|
||||
log := models.SystemLog{
|
||||
Level: level,
|
||||
Module: module,
|
||||
TraceID: traceID,
|
||||
Message: message,
|
||||
Context: contextJSON,
|
||||
IP: ctx.Request().Ip(),
|
||||
UserAgent: ctx.Request().Header("User-Agent", ""),
|
||||
}
|
||||
|
||||
if err := facades.Orm().Query().Create(&log); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Record 记录系统日志(标准 context)
|
||||
func (s *SystemLogServiceImpl) Record(ctx context.Context, level, module, message string, attributes map[string]any) error {
|
||||
var contextJSON string
|
||||
if len(attributes) > 0 {
|
||||
if data, err := json.Marshal(attributes); err == nil {
|
||||
contextJSON = string(data)
|
||||
}
|
||||
}
|
||||
|
||||
traceID := traceid.FromContext(ctx)
|
||||
if traceID == "" {
|
||||
var newCtx context.Context
|
||||
newCtx, traceID = traceid.EnsureContext(ctx)
|
||||
ctx = newCtx
|
||||
}
|
||||
|
||||
log := models.SystemLog{
|
||||
Level: level,
|
||||
Module: module,
|
||||
TraceID: traceID,
|
||||
Message: message,
|
||||
Context: contextJSON,
|
||||
}
|
||||
|
||||
if err := facades.Orm().Query().Create(&log); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user