WIP: logging in the background process
This commit is contained in:
parent
b22529be7b
commit
ab987ffdf8
3
go.mod
3
go.mod
@ -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
16
go.sum
@ -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=
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user