99 lines
2.6 KiB
Go
99 lines
2.6 KiB
Go
/*
|
|
* Copyright 2020 The Dragonfly Authors
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package logcore
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"d7y.io/dragonfly/v2/pkg/unit"
|
|
"d7y.io/dragonfly/v2/pkg/util/fileutils"
|
|
"d7y.io/dragonfly/v2/pkg/util/fileutils/filerw"
|
|
"go.uber.org/zap"
|
|
"go.uber.org/zap/zapcore"
|
|
"gopkg.in/natefinch/lumberjack.v2"
|
|
)
|
|
|
|
const (
|
|
CoreLogFileName = "core.log"
|
|
GrpcLogFileName = "grpc.log"
|
|
GCLogFileName = "gc.log"
|
|
)
|
|
|
|
var coreLevel = zap.NewAtomicLevelAt(zapcore.InfoLevel)
|
|
var grpcLevel = zap.NewAtomicLevelAt(zapcore.WarnLevel)
|
|
|
|
func CreateLogger(filePath string, maxSize int, maxAge int, maxBackups int, compress bool, stats bool) (*zap.Logger, error) {
|
|
var syncer zapcore.WriteSyncer
|
|
|
|
if maxAge < 0 || maxBackups < 0 {
|
|
if err := fileutils.MkdirAll(filepath.Dir(filePath)); err != nil {
|
|
return nil, err
|
|
}
|
|
fileInfo, err := os.Stat(filePath)
|
|
if err == nil && fileInfo.Size() >= int64(maxSize)*unit.MB.ToNumber() {
|
|
_, _ = filerw.CopyFile(filePath, filePath+".old")
|
|
_ = filerw.CleanFile(filePath)
|
|
}
|
|
if syncer, _, err = zap.Open(filePath); err != nil {
|
|
return nil, err
|
|
}
|
|
} else {
|
|
rotateConfig := &lumberjack.Logger{
|
|
Filename: filePath,
|
|
MaxSize: maxSize,
|
|
MaxAge: maxAge,
|
|
MaxBackups: maxBackups,
|
|
LocalTime: true,
|
|
Compress: compress,
|
|
}
|
|
syncer = zapcore.AddSync(rotateConfig)
|
|
}
|
|
|
|
encoderConfig := zap.NewProductionEncoderConfig()
|
|
encoderConfig.EncodeTime = zapcore.TimeEncoderOfLayout("2006-01-02 15:04:05.000")
|
|
|
|
level := zap.NewAtomicLevel()
|
|
if strings.HasSuffix(filePath, GrpcLogFileName) {
|
|
level = grpcLevel
|
|
} else if strings.HasSuffix(filePath, CoreLogFileName) {
|
|
level = coreLevel
|
|
}
|
|
|
|
core := zapcore.NewCore(
|
|
zapcore.NewJSONEncoder(encoderConfig),
|
|
syncer,
|
|
level,
|
|
)
|
|
|
|
var opts []zap.Option
|
|
if !stats {
|
|
opts = append(opts, zap.AddCaller(), zap.AddStacktrace(zap.WarnLevel), zap.AddCallerSkip(1))
|
|
}
|
|
|
|
return zap.New(core, opts...), nil
|
|
}
|
|
|
|
func SetCoreLevel(level zapcore.Level) {
|
|
coreLevel.SetLevel(level)
|
|
}
|
|
|
|
func SetGrpcLevel(level zapcore.Level) {
|
|
grpcLevel.SetLevel(level)
|
|
}
|