fix(cli/agent): wrap lumberjack logger to prevent re-open (#8229)

This commit is contained in:
Mathias Fredriksson
2023-06-27 15:49:44 +03:00
committed by GitHub
parent 6d176aee5d
commit b4751c72d8

View File

@@ -106,12 +106,12 @@ func (r *RootCmd) workspaceAgent() *clibase.Cmd {
// Spawn a reaper so that we don't accumulate a ton // Spawn a reaper so that we don't accumulate a ton
// of zombie processes. // of zombie processes.
if reaper.IsInitProcess() && !noReap && isLinux { if reaper.IsInitProcess() && !noReap && isLinux {
logWriter := &lumberjack.Logger{ logWriter := &lumberjackWriteCloseFixer{w: &lumberjack.Logger{
Filename: filepath.Join(logDir, "coder-agent-init.log"), Filename: filepath.Join(logDir, "coder-agent-init.log"),
MaxSize: 5, // MB MaxSize: 5, // MB
// Without this, rotated logs will never be deleted. // Without this, rotated logs will never be deleted.
MaxBackups: 1, MaxBackups: 1,
} }}
defer logWriter.Close() defer logWriter.Close()
sinks = append(sinks, sloghuman.Sink(logWriter)) sinks = append(sinks, sloghuman.Sink(logWriter))
@@ -149,14 +149,12 @@ func (r *RootCmd) workspaceAgent() *clibase.Cmd {
// reaper. // reaper.
go DumpHandler(ctx) go DumpHandler(ctx)
ljLogger := &lumberjack.Logger{ logWriter := &lumberjackWriteCloseFixer{w: &lumberjack.Logger{
Filename: filepath.Join(logDir, "coder-agent.log"), Filename: filepath.Join(logDir, "coder-agent.log"),
MaxSize: 5, // MB MaxSize: 5, // MB
// Without this, rotated logs will never be deleted. // Without this, rotated logs will never be deleted.
MaxBackups: 1, MaxBackups: 1,
} }}
defer ljLogger.Close()
logWriter := &closeWriter{w: ljLogger}
defer logWriter.Close() defer logWriter.Close()
sinks = append(sinks, sloghuman.Sink(logWriter)) sinks = append(sinks, sloghuman.Sink(logWriter))
@@ -403,16 +401,16 @@ func ServeHandler(ctx context.Context, logger slog.Logger, handler http.Handler,
} }
} }
// closeWriter is a wrapper around an io.WriteCloser that prevents // lumberjackWriteCloseFixer is a wrapper around an io.WriteCloser that
// writes after Close. This is necessary because lumberjack will // prevents writes after Close. This is necessary because lumberjack
// re-open the file on write. // re-opens the file on Write.
type closeWriter struct { type lumberjackWriteCloseFixer struct {
w io.WriteCloser w io.WriteCloser
mu sync.Mutex // Protects following. mu sync.Mutex // Protects following.
closed bool closed bool
} }
func (c *closeWriter) Close() error { func (c *lumberjackWriteCloseFixer) Close() error {
c.mu.Lock() c.mu.Lock()
defer c.mu.Unlock() defer c.mu.Unlock()
@@ -420,7 +418,7 @@ func (c *closeWriter) Close() error {
return c.w.Close() return c.w.Close()
} }
func (c *closeWriter) Write(p []byte) (int, error) { func (c *lumberjackWriteCloseFixer) Write(p []byte) (int, error) {
c.mu.Lock() c.mu.Lock()
defer c.mu.Unlock() defer c.mu.Unlock()