WIP: logging in the background process
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user