mirror of
https://github.com/minio/minio.git
synced 2025-11-07 12:52:58 -05:00
add logrotate support for MinIO logs (#19641)
This commit is contained in:
@@ -65,5 +65,5 @@ var (
|
||||
MinioBannerName = "MinIO Object Storage Server"
|
||||
|
||||
// MinioLicense - MinIO server license.
|
||||
MinioLicense = "GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html>"
|
||||
MinioLicense = "GNU AGPLv3 - https://www.gnu.org/licenses/agpl-3.0.html"
|
||||
)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2015-2021 MinIO, Inc.
|
||||
// Copyright (c) 2015-2024 MinIO, Inc.
|
||||
//
|
||||
// This file is part of MinIO Object Storage stack
|
||||
//
|
||||
@@ -20,6 +20,7 @@ package cmd
|
||||
import (
|
||||
"container/ring"
|
||||
"context"
|
||||
"io"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
|
||||
@@ -49,10 +50,10 @@ type HTTPConsoleLoggerSys struct {
|
||||
|
||||
// NewConsoleLogger - creates new HTTPConsoleLoggerSys with all nodes subscribed to
|
||||
// the console logging pub sub system
|
||||
func NewConsoleLogger(ctx context.Context) *HTTPConsoleLoggerSys {
|
||||
func NewConsoleLogger(ctx context.Context, w io.Writer) *HTTPConsoleLoggerSys {
|
||||
return &HTTPConsoleLoggerSys{
|
||||
pubsub: pubsub.New[log.Info, madmin.LogMask](8),
|
||||
console: console.New(),
|
||||
console: console.New(w),
|
||||
logBuf: ring.New(defaultLogBufferCount),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -134,7 +134,6 @@ func newApp(name string) *cli.App {
|
||||
|
||||
// Register all commands.
|
||||
registerCommand(serverCmd)
|
||||
registerCommand(gatewayCmd) // hidden kept for guiding users.
|
||||
|
||||
// Set up app.
|
||||
cli.HelpFlag = cli.BoolFlag{
|
||||
@@ -181,7 +180,7 @@ func versionBanner(c *cli.Context) io.Reader {
|
||||
banner := &strings.Builder{}
|
||||
fmt.Fprintln(banner, color.Bold("%s version %s (commit-id=%s)", c.App.Name, c.App.Version, CommitID))
|
||||
fmt.Fprintln(banner, color.Blue("Runtime:")+color.Bold(" %s %s/%s", runtime.Version(), runtime.GOOS, runtime.GOARCH))
|
||||
fmt.Fprintln(banner, color.Blue("License:")+color.Bold(" GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html>"))
|
||||
fmt.Fprintln(banner, color.Blue("License:")+color.Bold(" GNU AGPLv3 - https://www.gnu.org/licenses/agpl-3.0.html"))
|
||||
fmt.Fprintln(banner, color.Blue("Copyright:")+color.Bold(" 2015-%s MinIO, Inc.", CopyrightYear))
|
||||
return strings.NewReader(banner.String())
|
||||
}
|
||||
|
||||
@@ -28,6 +28,7 @@ import (
|
||||
"net"
|
||||
"os"
|
||||
"os/signal"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
"strings"
|
||||
"syscall"
|
||||
@@ -191,20 +192,19 @@ var ServerFlags = []cli.Flag{
|
||||
EnvVar: "MINIO_RECV_BUF_SIZE",
|
||||
Hidden: true,
|
||||
},
|
||||
}
|
||||
|
||||
var gatewayCmd = cli.Command{
|
||||
Name: "gateway",
|
||||
Usage: "start object storage gateway",
|
||||
Hidden: true,
|
||||
Flags: append(ServerFlags, GlobalFlags...),
|
||||
HideHelpCommand: true,
|
||||
Action: gatewayMain,
|
||||
}
|
||||
|
||||
func gatewayMain(ctx *cli.Context) error {
|
||||
logger.Fatal(errInvalidArgument, "Gateway is deprecated, To continue to use Gateway please use releases no later than 'RELEASE.2022-10-24T18-35-07Z'. We recommend all our users to migrate from gateway mode to server mode. Please read https://blog.min.io/deprecation-of-the-minio-gateway/")
|
||||
return nil
|
||||
cli.StringFlag{
|
||||
Name: "log-dir",
|
||||
Usage: "specify the directory to save the server log",
|
||||
EnvVar: "MINIO_LOG_DIR",
|
||||
Hidden: true,
|
||||
},
|
||||
cli.IntFlag{
|
||||
Name: "log-size",
|
||||
Usage: "specify the maximum server log file size in bytes before its rotated",
|
||||
Value: 10 * humanize.MiByte,
|
||||
EnvVar: "MINIO_LOG_SIZE",
|
||||
Hidden: true,
|
||||
},
|
||||
}
|
||||
|
||||
var serverCmd = cli.Command{
|
||||
@@ -667,6 +667,29 @@ func getServerListenAddrs() []string {
|
||||
return addrs.ToSlice()
|
||||
}
|
||||
|
||||
var globalLoggerOutput io.WriteCloser
|
||||
|
||||
func initializeLogRotate(ctx *cli.Context) (io.WriteCloser, error) {
|
||||
lgDir := ctx.String("log-dir")
|
||||
if lgDir == "" {
|
||||
return os.Stderr, nil
|
||||
}
|
||||
lgDirAbs, err := filepath.Abs(lgDir)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
lgSize := ctx.Int("log-size")
|
||||
output, err := logger.NewDir(logger.Options{
|
||||
Directory: lgDirAbs,
|
||||
MaximumFileSize: int64(lgSize),
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
logger.EnableJSON()
|
||||
return output, nil
|
||||
}
|
||||
|
||||
// serverMain handler called for 'minio server' command.
|
||||
func serverMain(ctx *cli.Context) {
|
||||
var warnings []string
|
||||
@@ -679,11 +702,23 @@ func serverMain(ctx *cli.Context) {
|
||||
|
||||
// Initialize globalConsoleSys system
|
||||
bootstrapTrace("newConsoleLogger", func() {
|
||||
globalConsoleSys = NewConsoleLogger(GlobalContext)
|
||||
output, err := initializeLogRotate(ctx)
|
||||
if err == nil {
|
||||
logger.Output = output
|
||||
globalConsoleSys = NewConsoleLogger(GlobalContext, output)
|
||||
globalLoggerOutput = output
|
||||
} else {
|
||||
logger.Output = os.Stderr
|
||||
globalConsoleSys = NewConsoleLogger(GlobalContext, os.Stderr)
|
||||
}
|
||||
logger.AddSystemTarget(GlobalContext, globalConsoleSys)
|
||||
|
||||
// Set node name, only set for distributed setup.
|
||||
globalConsoleSys.SetNodeName(globalLocalNodeName)
|
||||
if err != nil {
|
||||
// We can only log here since we need globalConsoleSys initialized
|
||||
logger.Fatal(err, "invalid --logrorate-dir option")
|
||||
}
|
||||
})
|
||||
|
||||
// Always load ENV variables from files first.
|
||||
|
||||
@@ -31,6 +31,10 @@ import (
|
||||
func handleSignals() {
|
||||
// Custom exit function
|
||||
exit := func(success bool) {
|
||||
if globalLoggerOutput != nil {
|
||||
globalLoggerOutput.Close()
|
||||
}
|
||||
|
||||
// If global profiler is set stop before we exit.
|
||||
globalProfilerMu.Lock()
|
||||
defer globalProfilerMu.Unlock()
|
||||
|
||||
@@ -109,7 +109,7 @@ func TestMain(m *testing.M) {
|
||||
setMaxResources(nil)
|
||||
|
||||
// Initialize globalConsoleSys system
|
||||
globalConsoleSys = NewConsoleLogger(context.Background())
|
||||
globalConsoleSys = NewConsoleLogger(context.Background(), io.Discard)
|
||||
|
||||
globalInternodeTransport = NewInternodeHTTPTransport(0)()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user