Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 52ace4b

Browse files
authored
fix(agent): Work around lumberjack reopening log file after close (#5941)
1 parent 89bf8dd commit 52ace4b

File tree

1 file changed

+33
-1
lines changed

1 file changed

+33
-1
lines changed

cli/agent.go

+33-1
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@ package cli
33
import (
44
"context"
55
"fmt"
6+
"io"
67
"net/http"
78
"net/http/pprof"
89
"net/url"
910
"os"
1011
"os/signal"
1112
"path/filepath"
1213
"runtime"
14+
"sync"
1315
"time"
1416

1517
"cloud.google.com/go/compute/metadata"
@@ -91,11 +93,14 @@ func workspaceAgent() *cobra.Command {
9193
// reaper.
9294
go dumpHandler(ctx)
9395

94-
logWriter := &lumberjack.Logger{
96+
ljLogger := &lumberjack.Logger{
9597
Filename: filepath.Join(logDir, "coder-agent.log"),
9698
MaxSize: 5, // MB
9799
}
100+
defer ljLogger.Close()
101+
logWriter := &closeWriter{w: ljLogger}
98102
defer logWriter.Close()
103+
99104
logger := slog.Make(sloghuman.Sink(cmd.ErrOrStderr()), sloghuman.Sink(logWriter)).Leveled(slog.LevelDebug)
100105

101106
version := buildinfo.Version()
@@ -229,3 +234,30 @@ func serveHandler(ctx context.Context, logger slog.Logger, handler http.Handler,
229234
_ = srv.Close()
230235
}
231236
}
237+
238+
// closeWriter is a wrapper around an io.WriteCloser that prevents
239+
// writes after Close. This is necessary because lumberjack will
240+
// re-open the file on write.
241+
type closeWriter struct {
242+
w io.WriteCloser
243+
mu sync.Mutex // Protects following.
244+
closed bool
245+
}
246+
247+
func (c *closeWriter) Close() error {
248+
c.mu.Lock()
249+
defer c.mu.Unlock()
250+
251+
c.closed = true
252+
return c.w.Close()
253+
}
254+
255+
func (c *closeWriter) Write(p []byte) (int, error) {
256+
c.mu.Lock()
257+
defer c.mu.Unlock()
258+
259+
if c.closed {
260+
return 0, io.ErrClosedPipe
261+
}
262+
return c.w.Write(p)
263+
}

0 commit comments

Comments
 (0)