forked from
tangled.org/core
Monorepo for Tangled — https://tangled.org
1package engine
2
3import (
4 "encoding/json"
5 "fmt"
6 "io"
7 "os"
8 "path/filepath"
9 "strings"
10
11 "tangled.sh/tangled.sh/core/spindle/models"
12)
13
14type WorkflowLogger struct {
15 file *os.File
16 encoder *json.Encoder
17}
18
19func NewWorkflowLogger(baseDir string, wid models.WorkflowId) (*WorkflowLogger, error) {
20 path := LogFilePath(baseDir, wid)
21
22 file, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
23 if err != nil {
24 return nil, fmt.Errorf("creating log file: %w", err)
25 }
26
27 return &WorkflowLogger{
28 file: file,
29 encoder: json.NewEncoder(file),
30 }, nil
31}
32
33func (l *WorkflowLogger) Write(p []byte) (n int, err error) {
34 return l.file.Write(p)
35}
36
37func (l *WorkflowLogger) Close() error {
38 return l.file.Close()
39}
40
41func LogFilePath(baseDir string, workflowID models.WorkflowId) string {
42 logFilePath := filepath.Join(baseDir, fmt.Sprintf("%s.log", workflowID.String()))
43 return logFilePath
44}
45
46func (l *WorkflowLogger) Writer(stream string, stepId int) io.Writer {
47 return &jsonWriter{logger: l, stream: stream, stepId: stepId}
48}
49
50type jsonWriter struct {
51 logger *WorkflowLogger
52 stream string
53 stepId int
54}
55
56func (w *jsonWriter) Write(p []byte) (int, error) {
57 line := strings.TrimRight(string(p), "\r\n")
58
59 entry := models.LogLine{
60 Stream: w.stream,
61 Data: line,
62 StepId: w.stepId,
63 }
64
65 if err := w.logger.encoder.Encode(entry); err != nil {
66 return 0, err
67 }
68
69 return len(p), nil
70}