diff --git a/go.mod b/go.mod index b8bf0996..712796ae 100644 --- a/go.mod +++ b/go.mod @@ -23,6 +23,7 @@ require ( go.temporal.io/server v1.23.0 golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 google.golang.org/protobuf v1.34.2 + gopkg.in/natefinch/lumberjack.v2 v2.2.1 gopkg.in/yaml.v3 v3.0.1 istio.io/api v1.22.3-0.20240703105953-437a88321a16 istio.io/client-go v1.22.3 diff --git a/go.sum b/go.sum index 3fc552fd..2a7e629e 100644 --- a/go.sum +++ b/go.sum @@ -507,6 +507,8 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/validator.v2 v2.0.0-20200605151824-2b28d334fa05/go.mod h1:o4V0GXN9/CAmCsvJ0oXYZvrZOe7syiDZSN1GWGZTGzc= gopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY= gopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8= diff --git a/main.go b/main.go index 4f2b596d..4f253a1f 100644 --- a/main.go +++ b/main.go @@ -19,8 +19,9 @@ package main import ( "flag" + "gopkg.in/natefinch/lumberjack.v2" + "io" "os" - // Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.) // to ensure that exec-entrypoint and run can make use of them. _ "k8s.io/client-go/plugin/pkg/client/auth" @@ -66,21 +67,27 @@ func main() { metricsAddr string enableLeaderElection bool probeAddr string + logOutputFile string ) flag.StringVar(&metricsAddr, "metrics-bind-address", ":8080", "The address the metric endpoint binds to.") flag.StringVar(&probeAddr, "health-probe-bind-address", ":8081", "The address the probe endpoint binds to.") flag.BoolVar(&enableLeaderElection, "leader-elect", false, "Enable leader election for controller manager. Enabling this will ensure there is only one active controller manager.") + flag.StringVar(&logOutputFile, "logOutputFile", "", + "Log to output file using go lumberjack in addition to stdout.") + flag.Parse() opts := zap.Options{ Development: true, + DestWriter: logWriter(logOutputFile), } opts.BindFlags(flag.CommandLine) - flag.Parse() ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts))) + setupLog.Info("logOutputFile " + logOutputFile) + mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ Scheme: scheme, Metrics: metricsserver.Options{ @@ -162,3 +169,16 @@ func main() { os.Exit(1) } } + +func logWriter(outputFile string) io.Writer { + if len(outputFile) > 0 { + return io.MultiWriter(os.Stdout, &lumberjack.Logger{ + Filename: outputFile, + MaxSize: 2, // megabytes + MaxBackups: 100, + MaxAge: 30, // days + Compress: true, // compress rotated log files + }) + } + return os.Stdout +}