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 LogFilePath(baseDir string, workflowID models.WorkflowId) string { 34 logFilePath := filepath.Join(baseDir, fmt.Sprintf("%s.log", workflowID.String())) 35 return logFilePath 36} 37 38func (l *WorkflowLogger) Close() error { 39 return l.file.Close() 40} 41 42func (l *WorkflowLogger) DataWriter(stream string) io.Writer { 43 // TODO: emit stream 44 return &jsonWriter{logger: l, kind: models.LogKindData} 45} 46 47func (l *WorkflowLogger) ControlWriter() io.Writer { 48 return &jsonWriter{logger: l, kind: models.LogKindControl} 49} 50 51type jsonWriter struct { 52 logger *WorkflowLogger 53 kind models.LogKind 54} 55 56func (w *jsonWriter) Write(p []byte) (int, error) { 57 line := strings.TrimRight(string(p), "\r\n") 58 59 entry := models.LogLine{ 60 Kind: w.kind, 61 Content: line, 62 } 63 64 if err := w.logger.encoder.Encode(entry); err != nil { 65 return 0, err 66 } 67 68 return len(p), nil 69}