GitRoot
craft your forge, build your project, grow your community freely
1// SPDX-FileCopyrightText: 2025 Romain Maneschi <romain@gitroot.dev>
2//
3// SPDX-License-Identifier: EUPL-1.2
4
5package lib
6
7import (
8 "fmt"
9 "os"
10 "sync"
11 "time"
12)
13
14type LogWriter struct {
15 mu sync.Mutex
16 file *os.File
17 writtenBytes int64
18 limit int64
19 limitReached bool
20 jobStartMs int64
21}
22
23func (lw *LogWriter) WriteLine(prefix string, line []byte) {
24 lw.mu.Lock()
25 defer lw.mu.Unlock()
26
27 if lw.limitReached {
28 return
29 }
30
31 now := time.Now().UnixMilli()
32 relTime := now - lw.jobStartMs
33
34 header := fmt.Sprintf("%s[+%d] ", prefix, relTime)
35 lineLen := int64(len(header) + len(line) + 1)
36
37 if lw.writtenBytes+lineLen > lw.limit {
38 msg := fmt.Sprintf("%s... LOG LIMIT REACHED (%d MB)\n", prefix, lw.limit/(1024*1024))
39 lw.file.WriteString(msg)
40 lw.limitReached = true
41 return
42 }
43
44 lw.file.WriteString(header)
45 lw.file.Write(line)
46 lw.file.WriteString("\n")
47 lw.writtenBytes += lineLen
48}
49
50func (lw *LogWriter) Flush() {
51 lw.mu.Lock()
52 defer lw.mu.Unlock()
53 if lw.file != nil {
54 lw.file.Sync()
55 }
56}