Skip to content

Commit

Permalink
Log kanx child out/err to parent stdout/err
Browse files Browse the repository at this point in the history
  • Loading branch information
tdmanv committed Oct 13, 2024
1 parent 691adf3 commit 93d0675
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 5 deletions.
41 changes: 41 additions & 0 deletions pkg/kanx/logger.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package kanx

import (
"io"
"sync"

"github.com/kanisterio/kanister/pkg/field"
"github.com/kanisterio/kanister/pkg/log"
)

var _ io.Writer = (*logWriter)(nil)

type logWriter struct {
logger log.Logger
writer io.Writer
fields field.M
mutex *sync.Mutex
}

func newLogWriter(l log.Logger, w io.Writer) *logWriter {
return &logWriter{
logger: l,
writer: w,
fields: nil,
mutex: &sync.Mutex{},
}
}

func (lw *logWriter) SetFields(m field.M) {
lw.mutex.Lock()
defer lw.mutex.Unlock()
lw.fields = m
}

func (lw *logWriter) Write(buf []byte) (int, error) {
lw.mutex.Lock()
f := lw.fields
lw.mutex.Unlock()
lw.logger.PrintTo(lw.writer, string(buf), f)
return len(buf), nil
}
16 changes: 11 additions & 5 deletions pkg/kanx/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"bytes"
"context"
"fmt"
"io"
"net"
"os"
"os/exec"
Expand Down Expand Up @@ -68,15 +69,20 @@ func (s *processServiceServer) CreateProcesses(_ context.Context, cpr *CreatePro
stderr: stderr,
cancel: can,
}
cmd.Stdout = p.stdout
cmd.Stderr = p.stderr
stdoutLogWriter := newLogWriter(log.Info(), os.Stdout)
stderrLogWriter := newLogWriter(log.Info(), os.Stderr)
cmd.Stdout = io.MultiWriter(p.stdout, stdoutLogWriter)
cmd.Stderr = io.MultiWriter(p.stderr, stderrLogWriter)

err = cmd.Start()
if err != nil {
return nil, err
}
s.processes[int64(cmd.Process.Pid)] = p
log.Info().Print(processToProto(p).String(), field.M{"stdout": stdout.Name(), "stderr": stderr.Name()})
fields := field.M{"pid": cmd.Process.Pid, "stdout": stdout.Name(), "stderr": stderr.Name()}
stdoutLogWriter.SetFields(fields)
stderrLogWriter.SetFields(fields)
log.Info().Print(processToProto(p).String(), fields)
go func() {
err := p.cmd.Wait()
p.err = err
Expand All @@ -85,11 +91,11 @@ func (s *processServiceServer) CreateProcesses(_ context.Context, cpr *CreatePro
}
err = stdout.Close()
if err != nil {
log.Error().WithError(err).Print("Failed to close stdout", field.M{"pid": cmd.Process.Pid})
log.Error().WithError(err).Print("Failed to close stdout", fields)
}
err = stderr.Close()
if err != nil {
log.Error().WithError(err).Print("Failed to close stderr", field.M{"pid": cmd.Process.Pid})
log.Error().WithError(err).Print("Failed to close stderr", fields)
}
close(p.doneCh)
log.Info().Print(processToProto(p).String())
Expand Down

0 comments on commit 93d0675

Please sign in to comment.