Feature: change log level in-flight (#1023)
* feat: change log level in flight Signed-off-by: Jim Ma <majinjing3@gmail.com>
This commit is contained in:
parent
621e52e9f1
commit
009fbc6db1
|
|
@ -1,5 +1,27 @@
|
||||||
# Troubleshooting Guide
|
# Troubleshooting Guide
|
||||||
|
|
||||||
|
## Change log level
|
||||||
|
|
||||||
|
Send `SIGUSR1` signal to dragonfly process to change log level
|
||||||
|
|
||||||
|
```shell
|
||||||
|
kill -s SIGUSR1 <pid of dfdaemon, scheduler, cdn, or manager>
|
||||||
|
```
|
||||||
|
|
||||||
|
stdout:
|
||||||
|
|
||||||
|
```text
|
||||||
|
change log level to debug
|
||||||
|
change log level to fatal
|
||||||
|
change log level to panic
|
||||||
|
change log level to dpanic
|
||||||
|
change log level to error
|
||||||
|
change log level to warn
|
||||||
|
change log level to info
|
||||||
|
```
|
||||||
|
|
||||||
|
> The change log level event will print in stdout and `core.log` file, but if the level is greater than `info`, stdout only.
|
||||||
|
|
||||||
## Download slowly than without Dragonfly
|
## Download slowly than without Dragonfly
|
||||||
|
|
||||||
1. Confirm limit rate in [dfget.yaml](https://github.com/dragonflyoss/Dragonfly2/blob/main/docs/en/deployment/configuration/dfget.yaml#L65)
|
1. Confirm limit rate in [dfget.yaml](https://github.com/dragonflyoss/Dragonfly2/blob/main/docs/en/deployment/configuration/dfget.yaml#L65)
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,27 @@
|
||||||
# 问题排查
|
# 问题排查
|
||||||
|
|
||||||
|
## 修改日志级别
|
||||||
|
|
||||||
|
发送 `SIGUSR1` 信号给蜻蜓进程即可修改日志级别
|
||||||
|
|
||||||
|
```shell
|
||||||
|
kill -s SIGUSR1 <pid of dfdaemon, scheduler, cdn, or manager>
|
||||||
|
```
|
||||||
|
|
||||||
|
标准输出:
|
||||||
|
|
||||||
|
```text
|
||||||
|
change log level to debug
|
||||||
|
change log level to fatal
|
||||||
|
change log level to panic
|
||||||
|
change log level to dpanic
|
||||||
|
change log level to error
|
||||||
|
change log level to warn
|
||||||
|
change log level to info
|
||||||
|
```
|
||||||
|
|
||||||
|
> 修改日志级别的事件将记录在标准输出和 `core.log` 中,但是如果修改的级别高于 `info` 的话,则仅有标准输出
|
||||||
|
|
||||||
## 下载速度比不用蜻蜓的时候慢
|
## 下载速度比不用蜻蜓的时候慢
|
||||||
|
|
||||||
1. 确认限速值是否合适 [dfget.yaml](https://github.com/dragonflyoss/Dragonfly2/blob/main/docs/zh-CN/config/dfget.yaml#L61)
|
1. 确认限速值是否合适 [dfget.yaml](https://github.com/dragonflyoss/Dragonfly2/blob/main/docs/zh-CN/config/dfget.yaml#L61)
|
||||||
|
|
|
||||||
|
|
@ -20,9 +20,35 @@ import (
|
||||||
"path"
|
"path"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
|
"go.uber.org/zap"
|
||||||
|
|
||||||
logger "d7y.io/dragonfly/v2/internal/dflog"
|
logger "d7y.io/dragonfly/v2/internal/dflog"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type logInitMeta struct {
|
||||||
|
fileName string
|
||||||
|
setSugaredLoggerFunc func(*zap.SugaredLogger)
|
||||||
|
setLoggerFunc func(log *zap.Logger)
|
||||||
|
}
|
||||||
|
|
||||||
|
func createLogger(meta []logInitMeta, logDir string) error {
|
||||||
|
for _, m := range meta {
|
||||||
|
log, level, err := CreateLogger(path.Join(logDir, m.fileName), false, false)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if m.setSugaredLoggerFunc != nil {
|
||||||
|
m.setSugaredLoggerFunc(log.Sugar())
|
||||||
|
} else {
|
||||||
|
m.setLoggerFunc(log)
|
||||||
|
}
|
||||||
|
|
||||||
|
levels = append(levels, level)
|
||||||
|
}
|
||||||
|
startLoggerSignalHandler()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func InitManager(console bool, dir string) error {
|
func InitManager(console bool, dir string) error {
|
||||||
if console {
|
if console {
|
||||||
return nil
|
return nil
|
||||||
|
|
@ -30,31 +56,26 @@ func InitManager(console bool, dir string) error {
|
||||||
|
|
||||||
logDir := filepath.Join(dir, "manager")
|
logDir := filepath.Join(dir, "manager")
|
||||||
|
|
||||||
coreLogger, err := CreateLogger(path.Join(logDir, CoreLogFileName), false, false)
|
var meta = []logInitMeta{
|
||||||
if err != nil {
|
{
|
||||||
return err
|
fileName: CoreLogFileName,
|
||||||
|
setSugaredLoggerFunc: logger.SetCoreLogger,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
fileName: GrpcLogFileName,
|
||||||
|
setSugaredLoggerFunc: logger.SetGrpcLogger,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
fileName: GCLogFileName,
|
||||||
|
setSugaredLoggerFunc: logger.SetGCLogger,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
fileName: JobLogFileName,
|
||||||
|
setSugaredLoggerFunc: logger.SetJobLogger,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
logger.SetCoreLogger(coreLogger.Sugar())
|
|
||||||
|
|
||||||
grpcLogger, err := CreateLogger(path.Join(logDir, GrpcLogFileName), false, false)
|
return createLogger(meta, logDir)
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
logger.SetGrpcLogger(grpcLogger.Sugar())
|
|
||||||
|
|
||||||
gcLogger, err := CreateLogger(path.Join(logDir, GCLogFileName), false, false)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
logger.SetGCLogger(gcLogger.Sugar())
|
|
||||||
|
|
||||||
jobLogger, err := CreateLogger(path.Join(logDir, JobLogFileName), false, false)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
logger.SetJobLogger(jobLogger.Sugar())
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func InitScheduler(console bool, dir string) error {
|
func InitScheduler(console bool, dir string) error {
|
||||||
|
|
@ -64,31 +85,26 @@ func InitScheduler(console bool, dir string) error {
|
||||||
|
|
||||||
logDir := filepath.Join(dir, "scheduler")
|
logDir := filepath.Join(dir, "scheduler")
|
||||||
|
|
||||||
coreLogger, err := CreateLogger(path.Join(logDir, CoreLogFileName), false, false)
|
var meta = []logInitMeta{
|
||||||
if err != nil {
|
{
|
||||||
return err
|
fileName: CoreLogFileName,
|
||||||
|
setSugaredLoggerFunc: logger.SetCoreLogger,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
fileName: GrpcLogFileName,
|
||||||
|
setSugaredLoggerFunc: logger.SetGrpcLogger,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
fileName: GCLogFileName,
|
||||||
|
setSugaredLoggerFunc: logger.SetGCLogger,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
fileName: JobLogFileName,
|
||||||
|
setSugaredLoggerFunc: logger.SetJobLogger,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
logger.SetCoreLogger(coreLogger.Sugar())
|
|
||||||
|
|
||||||
grpcLogger, err := CreateLogger(path.Join(logDir, GrpcLogFileName), false, false)
|
return createLogger(meta, logDir)
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
logger.SetGrpcLogger(grpcLogger.Sugar())
|
|
||||||
|
|
||||||
gcLogger, err := CreateLogger(path.Join(logDir, GCLogFileName), false, false)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
logger.SetGCLogger(gcLogger.Sugar())
|
|
||||||
|
|
||||||
jobLogger, err := CreateLogger(path.Join(logDir, JobLogFileName), false, false)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
logger.SetJobLogger(jobLogger.Sugar())
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func InitCdnSystem(console bool, dir string) error {
|
func InitCdnSystem(console bool, dir string) error {
|
||||||
|
|
@ -97,55 +113,42 @@ func InitCdnSystem(console bool, dir string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
logDir := filepath.Join(dir, "cdn")
|
logDir := filepath.Join(dir, "cdn")
|
||||||
|
var meta = []logInitMeta{
|
||||||
coreLogger, err := CreateLogger(path.Join(logDir, CoreLogFileName), false, false)
|
{
|
||||||
if err != nil {
|
fileName: CoreLogFileName,
|
||||||
return err
|
setSugaredLoggerFunc: logger.SetCoreLogger,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
fileName: GrpcLogFileName,
|
||||||
|
setSugaredLoggerFunc: logger.SetGrpcLogger,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
fileName: GCLogFileName,
|
||||||
|
setSugaredLoggerFunc: logger.SetGCLogger,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
fileName: StorageGCLogFileName,
|
||||||
|
setSugaredLoggerFunc: logger.SetStorageGCLogger,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
fileName: JobLogFileName,
|
||||||
|
setSugaredLoggerFunc: logger.SetJobLogger,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
fileName: StatSeedLogFileName,
|
||||||
|
setLoggerFunc: logger.SetStatSeedLogger,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
fileName: DownloaderLogFileName,
|
||||||
|
setLoggerFunc: logger.SetDownloadLogger,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
fileName: KeepAliveLogFileName,
|
||||||
|
setSugaredLoggerFunc: logger.SetKeepAliveLogger,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
logger.SetCoreLogger(coreLogger.Sugar())
|
|
||||||
|
|
||||||
grpcLogger, err := CreateLogger(path.Join(logDir, GrpcLogFileName), false, false)
|
return createLogger(meta, logDir)
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
logger.SetGrpcLogger(grpcLogger.Sugar())
|
|
||||||
|
|
||||||
gcLogger, err := CreateLogger(path.Join(logDir, GCLogFileName), false, false)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
logger.SetGCLogger(gcLogger.Sugar())
|
|
||||||
|
|
||||||
storageGCLogger, err := CreateLogger(path.Join(logDir, StorageGCLogFileName), false, false)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
logger.SetGCLogger(storageGCLogger.Sugar())
|
|
||||||
|
|
||||||
jobLogger, err := CreateLogger(path.Join(logDir, JobLogFileName), false, false)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
logger.SetJobLogger(jobLogger.Sugar())
|
|
||||||
|
|
||||||
statSeedLogger, err := CreateLogger(path.Join(logDir, StatSeedLogFileName), true, true)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
logger.SetStatSeedLogger(statSeedLogger)
|
|
||||||
|
|
||||||
downloaderLogger, err := CreateLogger(path.Join(logDir, DownloaderLogFileName), false, false)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
logger.SetDownloadLogger(downloaderLogger)
|
|
||||||
|
|
||||||
keepAliveLogger, err := CreateLogger(path.Join(logDir, KeepAliveLogFileName), false, false)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
logger.SetKeepAliveLogger(keepAliveLogger.Sugar())
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func InitDaemon(console bool, dir string) error {
|
func InitDaemon(console bool, dir string) error {
|
||||||
|
|
@ -155,25 +158,22 @@ func InitDaemon(console bool, dir string) error {
|
||||||
|
|
||||||
logDir := filepath.Join(dir, "daemon")
|
logDir := filepath.Join(dir, "daemon")
|
||||||
|
|
||||||
coreLogger, err := CreateLogger(path.Join(logDir, CoreLogFileName), false, false)
|
var meta = []logInitMeta{
|
||||||
if err != nil {
|
{
|
||||||
return err
|
fileName: CoreLogFileName,
|
||||||
|
setSugaredLoggerFunc: logger.SetCoreLogger,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
fileName: GrpcLogFileName,
|
||||||
|
setSugaredLoggerFunc: logger.SetGrpcLogger,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
fileName: GCLogFileName,
|
||||||
|
setSugaredLoggerFunc: logger.SetGCLogger,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
logger.SetCoreLogger(coreLogger.Sugar())
|
|
||||||
|
|
||||||
grpcLogger, err := CreateLogger(path.Join(logDir, GrpcLogFileName), false, false)
|
return createLogger(meta, logDir)
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
logger.SetGrpcLogger(grpcLogger.Sugar())
|
|
||||||
|
|
||||||
gcLogger, err := CreateLogger(path.Join(logDir, GCLogFileName), false, false)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
logger.SetGCLogger(gcLogger.Sugar())
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func InitDfget(console bool, dir string) error {
|
func InitDfget(console bool, dir string) error {
|
||||||
|
|
@ -183,17 +183,16 @@ func InitDfget(console bool, dir string) error {
|
||||||
|
|
||||||
logDir := filepath.Join(dir, "dfget")
|
logDir := filepath.Join(dir, "dfget")
|
||||||
|
|
||||||
coreLogger, err := CreateLogger(path.Join(logDir, CoreLogFileName), false, false)
|
var meta = []logInitMeta{
|
||||||
if err != nil {
|
{
|
||||||
return err
|
fileName: CoreLogFileName,
|
||||||
|
setSugaredLoggerFunc: logger.SetCoreLogger,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
fileName: GrpcLogFileName,
|
||||||
|
setSugaredLoggerFunc: logger.SetGrpcLogger,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
logger.SetCoreLogger(coreLogger.Sugar())
|
|
||||||
|
|
||||||
grpcLogger, err := CreateLogger(path.Join(logDir, GrpcLogFileName), false, false)
|
return createLogger(meta, logDir)
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
logger.SetGrpcLogger(grpcLogger.Sugar())
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,7 @@ const (
|
||||||
var coreLevel = zap.NewAtomicLevelAt(zapcore.InfoLevel)
|
var coreLevel = zap.NewAtomicLevelAt(zapcore.InfoLevel)
|
||||||
var grpcLevel = zap.NewAtomicLevelAt(zapcore.WarnLevel)
|
var grpcLevel = zap.NewAtomicLevelAt(zapcore.WarnLevel)
|
||||||
|
|
||||||
func CreateLogger(filePath string, compress bool, stats bool) (*zap.Logger, error) {
|
func CreateLogger(filePath string, compress bool, stats bool) (*zap.Logger, zap.AtomicLevel, error) {
|
||||||
rotateConfig := &lumberjack.Logger{
|
rotateConfig := &lumberjack.Logger{
|
||||||
Filename: filePath,
|
Filename: filePath,
|
||||||
MaxSize: defaultRotateMaxSize,
|
MaxSize: defaultRotateMaxSize,
|
||||||
|
|
@ -80,7 +80,7 @@ func CreateLogger(filePath string, compress bool, stats bool) (*zap.Logger, erro
|
||||||
opts = append(opts, zap.AddCaller(), zap.AddStacktrace(zap.WarnLevel), zap.AddCallerSkip(1))
|
opts = append(opts, zap.AddCaller(), zap.AddStacktrace(zap.WarnLevel), zap.AddCallerSkip(1))
|
||||||
}
|
}
|
||||||
|
|
||||||
return zap.New(core, opts...), nil
|
return zap.New(core, opts...), level, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func SetCoreLevel(level zapcore.Level) {
|
func SetCoreLevel(level zapcore.Level) {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,58 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2022 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 (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"os/signal"
|
||||||
|
"syscall"
|
||||||
|
|
||||||
|
"go.uber.org/zap"
|
||||||
|
"go.uber.org/zap/zapcore"
|
||||||
|
|
||||||
|
logger "d7y.io/dragonfly/v2/internal/dflog"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
levels []zap.AtomicLevel
|
||||||
|
level = zapcore.InfoLevel
|
||||||
|
)
|
||||||
|
|
||||||
|
func startLoggerSignalHandler() {
|
||||||
|
signals := make(chan os.Signal, 1)
|
||||||
|
signal.Notify(signals, syscall.SIGUSR1)
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-signals:
|
||||||
|
level--
|
||||||
|
if level < zapcore.DebugLevel {
|
||||||
|
level = zapcore.FatalLevel
|
||||||
|
}
|
||||||
|
|
||||||
|
// use fmt.Printf print change log level event when log level is greater than info level
|
||||||
|
fmt.Printf("change log level to %s\n", level.String())
|
||||||
|
logger.Infof("change log level to %s", level.String())
|
||||||
|
for _, l := range levels {
|
||||||
|
l.SetLevel(level)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
@ -17,11 +17,8 @@
|
||||||
package log
|
package log
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"path"
|
|
||||||
|
|
||||||
"go.uber.org/zap/zapcore"
|
"go.uber.org/zap/zapcore"
|
||||||
|
|
||||||
logger "d7y.io/dragonfly/v2/internal/dflog"
|
|
||||||
"d7y.io/dragonfly/v2/internal/dflog/logcore"
|
"d7y.io/dragonfly/v2/internal/dflog/logcore"
|
||||||
"d7y.io/dragonfly/v2/pkg/dfpath"
|
"d7y.io/dragonfly/v2/pkg/dfpath"
|
||||||
)
|
)
|
||||||
|
|
@ -52,25 +49,5 @@ func SetupDaemon(logDir string, console bool) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
logDir = path.Join(d.LogDir(), "daemon")
|
return logcore.InitDaemon(false, d.LogDir())
|
||||||
|
|
||||||
coreLogger, err := logcore.CreateLogger(path.Join(logDir, logcore.CoreLogFileName), false, false)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
logger.SetCoreLogger(coreLogger.Sugar())
|
|
||||||
|
|
||||||
grpcLogger, err := logcore.CreateLogger(path.Join(logDir, logcore.GrpcLogFileName), false, false)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
logger.SetGrpcLogger(grpcLogger.Sugar())
|
|
||||||
|
|
||||||
gcLogger, err := logcore.CreateLogger(path.Join(logDir, logcore.GCLogFileName), false, false)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
logger.SetGCLogger(gcLogger.Sugar())
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue