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}