| 14 | ) |
| 15 | |
| 16 | func initLogging(noLogFile bool, logLevel *enum.Enum, logFormat *enum.Enum, logConsole bool, logFileName string, logFileOverwrite bool) (*os.File, error) { |
| 17 | var logFile *os.File |
| 18 | zerologLevel, err := zerolog.ParseLevel(logLevel.String()) |
| 19 | if err != nil { |
| 20 | return nil, err |
| 21 | } |
| 22 | var writers []io.Writer |
| 23 | if !noLogFile { |
| 24 | flags := os.O_CREATE | os.O_WRONLY |
| 25 | if logFileOverwrite { |
| 26 | flags |= os.O_TRUNC |
| 27 | } else { |
| 28 | flags |= os.O_APPEND |
| 29 | } |
| 30 | logFile, err = os.OpenFile(logFileName, flags, 0666) |
| 31 | if err != nil { |
| 32 | return nil, err |
| 33 | } |
| 34 | if logFormat.String() == "text" { |
| 35 | // for file logging we don't need color. we can add it as an option but don't think it is useful |
| 36 | writers = append(writers, zerolog.ConsoleWriter{ |
| 37 | Out: logFile, |
| 38 | NoColor: true, |
| 39 | FormatTimestamp: formatTimestampUtcRfc3339, |
| 40 | }) |
| 41 | } else { |
| 42 | writers = append(writers, logFile) |
| 43 | } |
| 44 | } |
| 45 | if logConsole { |
| 46 | if err := os.Stdout.Close(); err != nil { |
| 47 | return nil, fmt.Errorf("failed to close stdout: %w", err) |
| 48 | } |
| 49 | if logFormat.String() == "text" { |
| 50 | writers = append(writers, zerolog.ConsoleWriter{ |
| 51 | Out: os.Stderr, |
| 52 | NoColor: true, |
| 53 | FormatTimestamp: formatTimestampUtcRfc3339, |
| 54 | }) |
| 55 | } else { |
| 56 | writers = append(writers, os.Stderr) |
| 57 | } |
| 58 | } |
| 59 | mw := io.MultiWriter(writers...) |
| 60 | secretAwareWriter := secrets.NewSecretAwareWriter(mw, secretAwareRedactor) |
| 61 | log.Logger = zerolog.New(secretAwareWriter).Level(zerologLevel).With().Str("module", "cli").Str("invocation_id", invocationUUID.String()).Timestamp().Logger() |
| 62 | if env.TenantID() != "" { |
| 63 | log.Logger = log.Logger.With().Str("tenant_id", env.TenantID()).Logger() |
| 64 | } |
| 65 | return logFile, nil |
| 66 | } |