WIP: logging in the background process

This commit is contained in:
2025-06-24 19:47:21 +10:00
parent b22529be7b
commit ab987ffdf8
3 changed files with 54 additions and 20 deletions

View File

@@ -29,6 +29,9 @@ import (
pb "gitea.suyono.dev/suyono/go-agent/proto"
"gitea.suyono.dev/suyono/go-agent/storage"
"github.com/rs/zerolog"
"github.com/rs/zerolog/diode"
"github.com/rs/zerolog/log"
"google.golang.org/grpc"
"google.golang.org/protobuf/types/known/emptypb"
)
@@ -82,6 +85,7 @@ func (s *server) Get(ctx context.Context, req *pb.CacheGetRequest) (*pb.CacheVal
func (s *server) Set(ctx context.Context, req *pb.CacheSetRequest) (*pb.SetStatus, error) {
err := s.stor.Set(req.GetKey(), req.GetValue())
if err != nil {
log.Error().Err(err).Caller().Msg("failed to set cache")
return nil, err
}
return &pb.SetStatus{
@@ -96,42 +100,53 @@ func (s *server) Shutdown(context.Context, *emptypb.Empty) (*emptypb.Empty, erro
return &emptypb.Empty{}, nil
}
func GetDaemonLogPath() (string, error) {
// The child process of the main program should call this function and set up the logging infrastructure
envVal, ok := os.LookupEnv(goAgentDaemonLogPath)
if !ok {
return "", fmt.Errorf("programming issue: parent process did not set log path")
}
return envVal, nil
}
func ExecBackground(opt Option) (BgProcFlag, error) {
var (
cmd *exec.Cmd
ok bool
envVal string
cmd *exec.Cmd
envVal string
logPath string
err error
f *os.File
)
args := opt.ExecArgs()
envVal, ok = os.LookupEnv(goAgentDaemonEnvFlag)
if !opt.Background() || len(args) == 0 || (envVal == "1" && ok) {
envVal = os.Getenv(goAgentDaemonEnvFlag)
if !opt.Background() || len(args) == 0 || envVal == "1" {
if envVal == "1" {
logPath = os.Getenv(goAgentDaemonLogPath)
if logPath == "" {
panic(fmt.Errorf("cannot start background process without log path"))
}
if f, err = os.OpenFile(logPath, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0600); err != nil {
panic(fmt.Errorf("opening log file: %w", err))
}
log.Logger = zerolog.New(diode.NewWriter(f, 1000, 10*time.Millisecond, func(missed int) {
fmt.Printf("Logger Dropped %d messages", missed)
}))
}
return child, nil
}
if opt.ExecLogPath() == "" {
return parent, fmt.Errorf("cannot start background process without log path")
}
if len(args) > 1 {
cmd = exec.Command(args[0], args[1:]...)
} else {
cmd = exec.Command(args[0])
}
cmd.Env = append(os.Environ(), fmt.Sprintf("%s=1", goAgentDaemonEnvFlag))
if opt.ExecLogPath() != "" {
cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", goAgentDaemonLogPath, opt.ExecLogPath()))
}
cmd.Env = append(cmd.Env, opt.ExecEnv()...)
cmd.Env = append(os.Environ(), opt.ExecEnv()...)
cmd.Env = append(cmd.Env,
fmt.Sprintf("%s=1", goAgentDaemonEnvFlag),
fmt.Sprintf("%s=%s", goAgentDaemonLogPath, opt.ExecLogPath()))
cmd.SysProcAttr = &syscall.SysProcAttr{Setsid: true}
cmd.Stdin, cmd.Stdout, cmd.Stderr = nil, nil, nil
if err := cmd.Start(); err != nil {
if err = cmd.Start(); err != nil {
return parent, err
}