github.com/goravel/framework@v1.13.9/log/logger/daily.go (about)

     1  package logger
     2  
     3  import (
     4  	"errors"
     5  	"path/filepath"
     6  	"strings"
     7  	"time"
     8  
     9  	rotatelogs "github.com/goravel/file-rotatelogs/v2"
    10  	"github.com/rifflock/lfshook"
    11  	"github.com/sirupsen/logrus"
    12  
    13  	"github.com/goravel/framework/contracts/config"
    14  	"github.com/goravel/framework/log/formatter"
    15  	"github.com/goravel/framework/support"
    16  )
    17  
    18  type Daily struct {
    19  	config config.Config
    20  }
    21  
    22  func NewDaily(config config.Config) *Daily {
    23  	return &Daily{
    24  		config: config,
    25  	}
    26  }
    27  
    28  func (daily *Daily) Handle(channel string) (logrus.Hook, error) {
    29  	var hook logrus.Hook
    30  	logPath := daily.config.GetString(channel + ".path")
    31  	if logPath == "" {
    32  		return hook, errors.New("error log path")
    33  	}
    34  
    35  	ext := filepath.Ext(logPath)
    36  	logPath = strings.ReplaceAll(logPath, ext, "")
    37  	logPath = filepath.Join(support.RelativePath, logPath)
    38  
    39  	writer, err := rotatelogs.New(
    40  		logPath+"-%Y-%m-%d"+ext,
    41  		rotatelogs.WithRotationTime(time.Duration(24)*time.Hour),
    42  		rotatelogs.WithRotationCount(uint(daily.config.GetInt(channel+".days"))),
    43  	)
    44  	if err != nil {
    45  		return hook, errors.New("Config local file system for logger error: " + err.Error())
    46  	}
    47  
    48  	levels := getLevels(daily.config.GetString(channel + ".level"))
    49  	writerMap := lfshook.WriterMap{}
    50  	for _, level := range levels {
    51  		writerMap[level] = writer
    52  	}
    53  
    54  	return lfshook.NewHook(
    55  		writerMap,
    56  		formatter.NewGeneral(daily.config),
    57  	), nil
    58  }