Add "reopen_logger" command to daemon for log file management
- Introduced `CmdReopenLogger` for reopening daemon log files. - Added `ReOpen` method to `Logger` interface and its implementations. - Updated daemon logic to handle the "reopen_logger" command via Unix socket communication. - Extended localization files with translations for new command messages. - Registered `CmdReopenLogger` in the main CLI application.
This commit is contained in:
48
internal/cmd/daemon/reopen_logger.go
Normal file
48
internal/cmd/daemon/reopen_logger.go
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
package daemon
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"git.kor-elf.net/kor-elf-shield/kor-elf-shield/internal/i18n"
|
||||||
|
"git.kor-elf.net/kor-elf-shield/kor-elf-shield/internal/setting"
|
||||||
|
"git.kor-elf.net/kor-elf-shield/kor-elf-shield/internal/socket"
|
||||||
|
"github.com/urfave/cli/v3"
|
||||||
|
)
|
||||||
|
|
||||||
|
func CmdReopenLogger() *cli.Command {
|
||||||
|
return &cli.Command{
|
||||||
|
Name: "reopen_logger",
|
||||||
|
Usage: i18n.Lang.T("cmd.daemon.reopen_logger.Usage"),
|
||||||
|
Description: i18n.Lang.T("cmd.daemon.reopen_logger.Description"),
|
||||||
|
Action: cmdReopenLogger,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func cmdReopenLogger(_ context.Context, _ *cli.Command) error {
|
||||||
|
if setting.Config.SocketFile == "" {
|
||||||
|
return errors.New(i18n.Lang.T("socket file is not specified"))
|
||||||
|
}
|
||||||
|
|
||||||
|
sock, err := socket.NewSocketClient(setting.Config.SocketFile)
|
||||||
|
if err != nil {
|
||||||
|
return errors.New(i18n.Lang.T("daemon is not running"))
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
_ = sock.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
|
result, err := sock.Send("reopen_logger")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if result != "ok" {
|
||||||
|
return errors.New(i18n.Lang.T("daemon is not reopening logger"))
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("ok")
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
@@ -37,6 +37,7 @@ func NewMainApp(appVer AppVersion, defaultConfigPath string) *cli.Command {
|
|||||||
daemon.CmdStart(),
|
daemon.CmdStart(),
|
||||||
daemon.CmdStop(),
|
daemon.CmdStop(),
|
||||||
daemon.CmdStatus(),
|
daemon.CmdStatus(),
|
||||||
|
daemon.CmdReopenLogger(),
|
||||||
}
|
}
|
||||||
|
|
||||||
return app
|
return app
|
||||||
|
|||||||
@@ -97,6 +97,12 @@ func (d *daemon) socketCommand(command string, socket socket.Connect) error {
|
|||||||
return socket.Write("ok")
|
return socket.Write("ok")
|
||||||
case "status":
|
case "status":
|
||||||
return socket.Write("ok")
|
return socket.Write("ok")
|
||||||
|
case "reopen_logger":
|
||||||
|
if err := d.logger.ReOpen(); err != nil {
|
||||||
|
_ = socket.Write("logger reopen failed: " + err.Error())
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return socket.Write("ok")
|
||||||
default:
|
default:
|
||||||
_ = socket.Write("unknown command")
|
_ = socket.Write("unknown command")
|
||||||
return errors.New("unknown command")
|
return errors.New("unknown command")
|
||||||
|
|||||||
@@ -12,6 +12,9 @@
|
|||||||
"cmd.daemon.status.Usage": "Checking if the daemon is running",
|
"cmd.daemon.status.Usage": "Checking if the daemon is running",
|
||||||
"cmd.daemon.status.Description": "Checking if the daemon is running",
|
"cmd.daemon.status.Description": "Checking if the daemon is running",
|
||||||
|
|
||||||
|
"cmd.daemon.reopen_logger.Usage": "Reopen the file for logging",
|
||||||
|
"cmd.daemon.reopen_logger.Description": "Reopen the file where the daemon's logs are written",
|
||||||
|
|
||||||
"Command error": "Command error",
|
"Command error": "Command error",
|
||||||
"invalid log level": "The log level specified in the settings is invalid. It is currently set to: {{.Level}}. Valid values: {{.Levels}}",
|
"invalid log level": "The log level specified in the settings is invalid. It is currently set to: {{.Level}}. Valid values: {{.Levels}}",
|
||||||
"invalid log encoding": "Invalid encoding setting. Currently set to: {{.Encoding}}. Valid values: {{.Encodings}}",
|
"invalid log encoding": "Invalid encoding setting. Currently set to: {{.Encoding}}. Valid values: {{.Encodings}}",
|
||||||
@@ -21,5 +24,6 @@
|
|||||||
"socket file is not specified": "Socket file is not specified",
|
"socket file is not specified": "Socket file is not specified",
|
||||||
"daemon stopped": "Daemon stopped",
|
"daemon stopped": "Daemon stopped",
|
||||||
"daemon stop failed": "Daemon stop failed",
|
"daemon stop failed": "Daemon stop failed",
|
||||||
"daemon is not running": "Daemon is not running"
|
"daemon is not running": "Daemon is not running",
|
||||||
|
"daemon is not reopening logger": "The daemon did not reopen the log"
|
||||||
}
|
}
|
||||||
@@ -12,6 +12,9 @@
|
|||||||
"cmd.daemon.status.Usage": "Демонның жұмыс істеп тұрғанын тексеру",
|
"cmd.daemon.status.Usage": "Демонның жұмыс істеп тұрғанын тексеру",
|
||||||
"cmd.daemon.status.Description": "Демонның жұмыс істеп тұрғанын тексеру",
|
"cmd.daemon.status.Description": "Демонның жұмыс істеп тұрғанын тексеру",
|
||||||
|
|
||||||
|
"cmd.daemon.reopen_logger.Usage": "Файлды тіркеу үшін қайта ашыңыз",
|
||||||
|
"cmd.daemon.reopen_logger.Description": "Демонның журналдары жазылған файлды қайта ашыңыз.",
|
||||||
|
|
||||||
"Command error": "Командалық қате",
|
"Command error": "Командалық қате",
|
||||||
"invalid log level": "Параметрлерде көрсетілген журнал деңгейі жарамсыз. Ол қазір мына күйге орнатылған: {{.Level}}. Жарамды мәндер: {{.Levels}}",
|
"invalid log level": "Параметрлерде көрсетілген журнал деңгейі жарамсыз. Ол қазір мына күйге орнатылған: {{.Level}}. Жарамды мәндер: {{.Levels}}",
|
||||||
"invalid log encoding": "Жарамсыз кодтау параметрі. Қазіргі уақытта орнатылған: {{.Encoding}}. Жарамды мәндер: {{.Encodings}}",
|
"invalid log encoding": "Жарамсыз кодтау параметрі. Қазіргі уақытта орнатылған: {{.Encoding}}. Жарамды мәндер: {{.Encodings}}",
|
||||||
@@ -21,5 +24,6 @@
|
|||||||
"socket file is not specified": "сокет файлы көрсетілмеген",
|
"socket file is not specified": "сокет файлы көрсетілмеген",
|
||||||
"daemon stopped": "Жын тоқтатылды",
|
"daemon stopped": "Жын тоқтатылды",
|
||||||
"daemon stop failed": "Жынды тоқтату сәтсіз аяқталды",
|
"daemon stop failed": "Жынды тоқтату сәтсіз аяқталды",
|
||||||
"daemon is not running": "Демон жұмыс істемейді"
|
"daemon is not running": "Демон жұмыс істемейді",
|
||||||
|
"daemon is not reopening logger": "Жын журналды қайта ашпады"
|
||||||
}
|
}
|
||||||
@@ -12,6 +12,9 @@
|
|||||||
"cmd.daemon.status.Usage": "Проверка запущен ли демон",
|
"cmd.daemon.status.Usage": "Проверка запущен ли демон",
|
||||||
"cmd.daemon.status.Description": "Проверка запущен ли демон",
|
"cmd.daemon.status.Description": "Проверка запущен ли демон",
|
||||||
|
|
||||||
|
"cmd.daemon.reopen_logger.Usage": "Переоткрыть файл для логирования",
|
||||||
|
"cmd.daemon.reopen_logger.Description": "Переоткроет файл, куда пишутся логи от демона",
|
||||||
|
|
||||||
"Command error": "Ошибка команды",
|
"Command error": "Ошибка команды",
|
||||||
"invalid log level": "В настройках указан не верный уровень log. Сейчас указан: {{.Level}}. Допустимые значения: {{.Levels}}",
|
"invalid log level": "В настройках указан не верный уровень log. Сейчас указан: {{.Level}}. Допустимые значения: {{.Levels}}",
|
||||||
"invalid log encoding": "Неверная настройка encoding. Сейчас указан: {{.Encoding}}. Допустимые значения: {{.Encodings}}",
|
"invalid log encoding": "Неверная настройка encoding. Сейчас указан: {{.Encoding}}. Допустимые значения: {{.Encodings}}",
|
||||||
@@ -21,5 +24,6 @@
|
|||||||
"socket file is not specified": "Файл сокета не указан",
|
"socket file is not specified": "Файл сокета не указан",
|
||||||
"daemon stopped": "Демон остановлен",
|
"daemon stopped": "Демон остановлен",
|
||||||
"daemon stop failed": "Остановка демона не удалась",
|
"daemon stop failed": "Остановка демона не удалась",
|
||||||
"daemon is not running": "Демон не запущен"
|
"daemon is not running": "Демон не запущен",
|
||||||
|
"daemon is not reopening logger": "Демон не открыл журнал повторно"
|
||||||
}
|
}
|
||||||
@@ -4,13 +4,16 @@ import "os"
|
|||||||
|
|
||||||
type falseLogger struct{}
|
type falseLogger struct{}
|
||||||
|
|
||||||
func (l *falseLogger) Debug(msg string) {}
|
func (l *falseLogger) Debug(_ string) {}
|
||||||
func (l *falseLogger) Info(msg string) {}
|
func (l *falseLogger) Info(_ string) {}
|
||||||
func (l *falseLogger) Warn(msg string) {}
|
func (l *falseLogger) Warn(_ string) {}
|
||||||
func (l *falseLogger) Error(msg string) {}
|
func (l *falseLogger) Error(_ string) {}
|
||||||
|
|
||||||
func (l *falseLogger) Fatal(msg string) {
|
func (l *falseLogger) Fatal(_ string) {
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *falseLogger) Sync() error { return nil }
|
func (l *falseLogger) Sync() error { return nil }
|
||||||
|
func (l *falseLogger) ReOpen() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|||||||
@@ -18,11 +18,13 @@ type Logger interface {
|
|||||||
Fatal(msg string)
|
Fatal(msg string)
|
||||||
|
|
||||||
Sync() error
|
Sync() error
|
||||||
|
ReOpen() error
|
||||||
}
|
}
|
||||||
|
|
||||||
type logger struct {
|
type logger struct {
|
||||||
zap *zap.Logger
|
zap *zap.Logger
|
||||||
dev bool
|
dev bool
|
||||||
|
opts *LoggerOptions
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *logger) Debug(msg string) {
|
func (l *logger) Debug(msg string) {
|
||||||
@@ -49,33 +51,21 @@ func (l *logger) Sync() error {
|
|||||||
return l.zap.Sync()
|
return l.zap.Sync()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (l *logger) ReOpen() error {
|
||||||
|
_ = l.Sync()
|
||||||
|
l.zap = newZap(l.opts)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func NewLogger(opts LoggerOptions) (Logger, error) {
|
func NewLogger(opts LoggerOptions) (Logger, error) {
|
||||||
if !opts.Enabled {
|
if !opts.Enabled {
|
||||||
return &falseLogger{}, nil
|
return &falseLogger{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
cfg := zap.Config{
|
|
||||||
Level: opts.Level,
|
|
||||||
Development: opts.Development,
|
|
||||||
|
|
||||||
// Reduce the amount of noise in logs during mass events.
|
|
||||||
Sampling: &zap.SamplingConfig{
|
|
||||||
Initial: 100, // The first 100 identical messages per second will be written to the log
|
|
||||||
Thereafter: 100, // Every 100th message will be written to the log
|
|
||||||
},
|
|
||||||
|
|
||||||
Encoding: opts.Encoding.String(),
|
|
||||||
EncoderConfig: encoderConfig(&opts),
|
|
||||||
OutputPaths: opts.Paths,
|
|
||||||
ErrorOutputPaths: opts.LogErrorPaths,
|
|
||||||
}
|
|
||||||
cfg.DisableStacktrace = !opts.Development
|
|
||||||
cfg.DisableCaller = !opts.Development
|
|
||||||
|
|
||||||
zapLogger := zap.Must(cfg.Build()).WithOptions(zap.AddCallerSkip(1))
|
|
||||||
return &logger{
|
return &logger{
|
||||||
zap: zapLogger,
|
zap: newZap(&opts),
|
||||||
dev: opts.Development,
|
opts: &opts,
|
||||||
|
dev: opts.Development,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,3 +83,25 @@ func encoderConfig(opts *LoggerOptions) zapcore.EncoderConfig {
|
|||||||
|
|
||||||
return encoderConfig
|
return encoderConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func newZap(opts *LoggerOptions) *zap.Logger {
|
||||||
|
cfg := zap.Config{
|
||||||
|
Level: opts.Level,
|
||||||
|
Development: opts.Development,
|
||||||
|
|
||||||
|
// Reduce the amount of noise in logs during mass events.
|
||||||
|
Sampling: &zap.SamplingConfig{
|
||||||
|
Initial: 100, // The first 100 identical messages per second will be written to the log
|
||||||
|
Thereafter: 100, // Every 100th message will be written to the log
|
||||||
|
},
|
||||||
|
|
||||||
|
Encoding: opts.Encoding.String(),
|
||||||
|
EncoderConfig: encoderConfig(opts),
|
||||||
|
OutputPaths: opts.Paths,
|
||||||
|
ErrorOutputPaths: opts.LogErrorPaths,
|
||||||
|
}
|
||||||
|
cfg.DisableStacktrace = !opts.Development
|
||||||
|
cfg.DisableCaller = !opts.Development
|
||||||
|
|
||||||
|
return zap.Must(cfg.Build()).WithOptions(zap.AddCallerSkip(1))
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user