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}