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}