this repo has no description
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 dir := filepath.Join(baseDir, wid.String())
21 if err := os.MkdirAll(dir, 0755); err != nil {
22 return nil, fmt.Errorf("creating log dir: %w", err)
23 }
24
25 path := LogFilePath(baseDir, wid)
26
27 file, err := os.Create(path)
28 if err != nil {
29 return nil, fmt.Errorf("creating log file: %w", err)
30 }
31
32 return &WorkflowLogger{
33 file: file,
34 encoder: json.NewEncoder(file),
35 }, nil
36}
37
38func (l *WorkflowLogger) Write(p []byte) (n int, err error) {
39 return l.file.Write(p)
40}
41
42func (l *WorkflowLogger) Close() error {
43 return l.file.Close()
44}
45
46func OpenLogFile(baseDir string, workflowID models.WorkflowId) (*os.File, error) {
47 logPath := LogFilePath(baseDir, workflowID)
48
49 file, err := os.Open(logPath)
50 if err != nil {
51 return nil, fmt.Errorf("error opening log file: %w", err)
52 }
53
54 return file, nil
55}
56
57func LogFilePath(baseDir string, workflowID models.WorkflowId) string {
58 logFilePath := filepath.Join(baseDir, fmt.Sprintf("%s.log", workflowID.String()))
59 return logFilePath
60}
61
62func (l *WorkflowLogger) Stdout() io.Writer {
63 return &jsonWriter{logger: l, stream: "stdout"}
64}
65
66func (l *WorkflowLogger) Stderr() io.Writer {
67 return &jsonWriter{logger: l, stream: "stderr"}
68}
69
70type jsonWriter struct {
71 logger *WorkflowLogger
72 stream string
73}
74
75func (w *jsonWriter) Write(p []byte) (int, error) {
76 line := strings.TrimRight(string(p), "\r\n")
77
78 entry := models.LogLine{
79 Stream: w.stream,
80 Data: line,
81 }
82
83 if err := w.logger.encoder.Encode(entry); err != nil {
84 return 0, err
85 }
86
87 return len(p), nil
88}