WIP: logging in the background process

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

3
go.mod
View File

@ -3,6 +3,9 @@ module gitea.suyono.dev/suyono/go-agent
go 1.24 go 1.24
require ( require (
github.com/mattn/go-colorable v0.1.14 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/rs/zerolog v1.34.0 // indirect
golang.org/x/net v0.41.0 // indirect golang.org/x/net v0.41.0 // indirect
golang.org/x/sys v0.33.0 // indirect golang.org/x/sys v0.33.0 // indirect
golang.org/x/text v0.26.0 // indirect golang.org/x/text v0.26.0 // indirect

16
go.sum
View File

@ -1,5 +1,21 @@
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0=
github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY=
github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ=
golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw= golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=
golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA= golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M=

View File

@ -29,6 +29,9 @@ import (
pb "gitea.suyono.dev/suyono/go-agent/proto" pb "gitea.suyono.dev/suyono/go-agent/proto"
"gitea.suyono.dev/suyono/go-agent/storage" "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/grpc"
"google.golang.org/protobuf/types/known/emptypb" "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) { func (s *server) Set(ctx context.Context, req *pb.CacheSetRequest) (*pb.SetStatus, error) {
err := s.stor.Set(req.GetKey(), req.GetValue()) err := s.stor.Set(req.GetKey(), req.GetValue())
if err != nil { if err != nil {
log.Error().Err(err).Caller().Msg("failed to set cache")
return nil, err return nil, err
} }
return &pb.SetStatus{ return &pb.SetStatus{
@ -96,42 +100,53 @@ func (s *server) Shutdown(context.Context, *emptypb.Empty) (*emptypb.Empty, erro
return &emptypb.Empty{}, nil 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) { func ExecBackground(opt Option) (BgProcFlag, error) {
var ( var (
cmd *exec.Cmd cmd *exec.Cmd
ok bool envVal string
envVal string logPath string
err error
f *os.File
) )
args := opt.ExecArgs() args := opt.ExecArgs()
envVal, ok = os.LookupEnv(goAgentDaemonEnvFlag) envVal = os.Getenv(goAgentDaemonEnvFlag)
if !opt.Background() || len(args) == 0 || (envVal == "1" && ok) { 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 return child, nil
} }
if opt.ExecLogPath() == "" {
return parent, fmt.Errorf("cannot start background process without log path")
}
if len(args) > 1 { if len(args) > 1 {
cmd = exec.Command(args[0], args[1:]...) cmd = exec.Command(args[0], args[1:]...)
} else { } else {
cmd = exec.Command(args[0]) cmd = exec.Command(args[0])
} }
cmd.Env = append(os.Environ(), fmt.Sprintf("%s=1", goAgentDaemonEnvFlag)) cmd.Env = append(os.Environ(), opt.ExecEnv()...)
if opt.ExecLogPath() != "" { cmd.Env = append(cmd.Env,
cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", goAgentDaemonLogPath, opt.ExecLogPath())) fmt.Sprintf("%s=1", goAgentDaemonEnvFlag),
} fmt.Sprintf("%s=%s", goAgentDaemonLogPath, opt.ExecLogPath()))
cmd.Env = append(cmd.Env, opt.ExecEnv()...)
cmd.SysProcAttr = &syscall.SysProcAttr{Setsid: true} cmd.SysProcAttr = &syscall.SysProcAttr{Setsid: true}
cmd.Stdin, cmd.Stdout, cmd.Stderr = nil, nil, nil cmd.Stdin, cmd.Stdout, cmd.Stderr = nil, nil, nil
if err := cmd.Start(); err != nil { if err = cmd.Start(); err != nil {
return parent, err return parent, err
} }