| 88 | } |
| 89 | |
| 90 | func (b *Builder) Build(inv *serpent.Invocation) (log slog.Logger, closeLog func(), err error) { |
| 91 | var ( |
| 92 | sinks = []slog.Sink{} |
| 93 | closers = []func() error{} |
| 94 | ) |
| 95 | defer func() { |
| 96 | if err != nil { |
| 97 | for _, closer := range closers { |
| 98 | _ = closer() |
| 99 | } |
| 100 | } |
| 101 | }() |
| 102 | |
| 103 | noopClose := func() {} |
| 104 | |
| 105 | addSinkIfProvided := func(sinkFn func(io.Writer) slog.Sink, loc string) error { |
| 106 | switch loc { |
| 107 | case "", "/dev/null": |
| 108 | case "/dev/stdout": |
| 109 | sinks = append(sinks, sinkFn(inv.Stdout)) |
| 110 | |
| 111 | case "/dev/stderr": |
| 112 | sinks = append(sinks, sinkFn(inv.Stderr)) |
| 113 | |
| 114 | default: |
| 115 | logWriter := &LumberjackWriteCloseFixer{Writer: &lumberjack.Logger{ |
| 116 | Filename: loc, |
| 117 | MaxSize: 5, // MB |
| 118 | // Without this, rotated logs will never be deleted. |
| 119 | MaxBackups: 1, |
| 120 | }} |
| 121 | closers = append(closers, logWriter.Close) |
| 122 | sinks = append(sinks, sinkFn(logWriter)) |
| 123 | } |
| 124 | return nil |
| 125 | } |
| 126 | |
| 127 | err = addSinkIfProvided(sloghuman.Sink, b.Human) |
| 128 | if err != nil { |
| 129 | return slog.Logger{}, noopClose, xerrors.Errorf("add human sink: %w", err) |
| 130 | } |
| 131 | err = addSinkIfProvided(slogjson.Sink, b.JSON) |
| 132 | if err != nil { |
| 133 | return slog.Logger{}, noopClose, xerrors.Errorf("add json sink: %w", err) |
| 134 | } |
| 135 | err = addSinkIfProvided(slogstackdriver.Sink, b.Stackdriver) |
| 136 | if err != nil { |
| 137 | return slog.Logger{}, noopClose, xerrors.Errorf("add stackdriver sink: %w", err) |
| 138 | } |
| 139 | |
| 140 | if b.Trace { |
| 141 | sinks = append(sinks, tracing.SlogSink{}) |
| 142 | } |
| 143 | |
| 144 | // User should log to null device if they don't want logs. |
| 145 | if len(sinks) == 0 { |
| 146 | return slog.Logger{}, noopClose, xerrors.New("no loggers provided, use /dev/null to disable logging") |
| 147 | } |