로그파일 설정을 houston으로 이동
This commit is contained in:
@ -33,10 +33,11 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type runcommand struct {
|
type runcommand struct {
|
||||||
Exec string `json:"exec"`
|
Exec string `json:"exec"`
|
||||||
Args []string `json:"args"`
|
Args []string `json:"args"`
|
||||||
Version string `json:"version"`
|
Version string `json:"version"`
|
||||||
AutoRestart bool `json:"auto_restart"`
|
AutoRestart bool `json:"auto_restart"`
|
||||||
|
OutputLogFile string `json:"logfile"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type easyruncommand runcommand
|
type easyruncommand runcommand
|
||||||
@ -99,6 +100,7 @@ type procmeta struct {
|
|||||||
recover bool
|
recover bool
|
||||||
state int32
|
state int32
|
||||||
stdin io.WriteCloser
|
stdin io.WriteCloser
|
||||||
|
logfile string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (pm *procmeta) isState(s protos.ProcessState) bool {
|
func (pm *procmeta) isState(s protos.ProcessState) bool {
|
||||||
@ -493,10 +495,11 @@ func NewClient(standalone bool) (HoustonClient, error) {
|
|||||||
if found.recover {
|
if found.recover {
|
||||||
time.Sleep(time.Second)
|
time.Sleep(time.Second)
|
||||||
sr := shared.StartProcessRequest{
|
sr := shared.StartProcessRequest{
|
||||||
Name: found.name,
|
Name: found.name,
|
||||||
Version: found.version,
|
Version: found.version,
|
||||||
Args: found.args,
|
Args: found.args,
|
||||||
AutoRestart: found.recover,
|
AutoRestart: found.recover,
|
||||||
|
OutputLogFile: found.logfile,
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := hc.startChildProcess(&sr); err != nil {
|
if err := hc.startChildProcess(&sr); err != nil {
|
||||||
@ -583,10 +586,11 @@ func (hc *houstonClient) Start() {
|
|||||||
// service 서비스
|
// service 서비스
|
||||||
for i := 0; i < count; i++ {
|
for i := 0; i < count; i++ {
|
||||||
sr := shared.StartProcessRequest{
|
sr := shared.StartProcessRequest{
|
||||||
Name: service,
|
Name: service,
|
||||||
Version: cmd.Version,
|
Version: cmd.Version,
|
||||||
Args: append([]string{cmd.Exec}, cmd.Args...),
|
Args: append([]string{cmd.Exec}, cmd.Args...),
|
||||||
AutoRestart: cmd.AutoRestart,
|
AutoRestart: cmd.AutoRestart,
|
||||||
|
OutputLogFile: cmd.OutputLogFile,
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := hc.startChildProcess(&sr); err != nil {
|
if err := hc.startChildProcess(&sr); err != nil {
|
||||||
|
|||||||
@ -220,37 +220,12 @@ func prepareProcessLaunch(storageRoot string, req *shared.StartProcessRequest) (
|
|||||||
verpath: verpath,
|
verpath: verpath,
|
||||||
state: int32(protos.ProcessState_Stopped),
|
state: int32(protos.ProcessState_Stopped),
|
||||||
stdin: stdin,
|
stdin: stdin,
|
||||||
|
logfile: req.OutputLogFile,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
return nil, errors.New("not found")
|
return nil, errors.New("not found")
|
||||||
}
|
}
|
||||||
|
|
||||||
func makeLogFilePrefix(meta *procmeta, index int) string {
|
|
||||||
now := time.Now().UTC()
|
|
||||||
ext := path.Ext(meta.args[0])
|
|
||||||
nameonly := path.Base(filepath.ToSlash(meta.args[0]))
|
|
||||||
if len(ext) > 0 {
|
|
||||||
nameonly = nameonly[:len(nameonly)-len(ext)]
|
|
||||||
}
|
|
||||||
ts := now.Format("2006-01-02T15-04-05")
|
|
||||||
if index == 0 {
|
|
||||||
|
|
||||||
return path.Join(meta.verpath, "logs", fmt.Sprintf("%s_%s", nameonly, ts))
|
|
||||||
}
|
|
||||||
|
|
||||||
return path.Join(meta.verpath, "logs", fmt.Sprintf("%s_%d_%s", nameonly, index, ts))
|
|
||||||
}
|
|
||||||
|
|
||||||
func evaluateExpression(expression string, params map[string]any) (any, error) {
|
|
||||||
expression = strings.TrimSpace(expression)
|
|
||||||
expr, err := govaluate.NewEvaluableExpression(expression)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return expr.Evaluate(params)
|
|
||||||
}
|
|
||||||
|
|
||||||
func evaluateArgs(args []string, params map[string]any) ([]string, error) {
|
func evaluateArgs(args []string, params map[string]any) ([]string, error) {
|
||||||
re := regexp.MustCompile(`\$\(\((.*?)\)\)`)
|
re := regexp.MustCompile(`\$\(\((.*?)\)\)`)
|
||||||
|
|
||||||
@ -314,7 +289,7 @@ func (hc *houstonClient) launch(meta *procmeta) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
stdReader := func(jobName string, r io.ReadCloser, index int) {
|
stdReader := func(jobName string, r io.ReadCloser, index int, logfile string) {
|
||||||
defer func() {
|
defer func() {
|
||||||
reco := recover()
|
reco := recover()
|
||||||
if reco != nil {
|
if reco != nil {
|
||||||
@ -335,62 +310,30 @@ func (hc *houstonClient) launch(meta *procmeta) error {
|
|||||||
defer r.Close()
|
defer r.Close()
|
||||||
|
|
||||||
reader := bufio.NewReader(r)
|
reader := bufio.NewReader(r)
|
||||||
thisFileSize := 0
|
|
||||||
logFileIndex := 0
|
|
||||||
|
|
||||||
var logWriter func([]byte)
|
var logWriter func([]byte)
|
||||||
if *logger.UseLogFile {
|
if len(logfile) > 0 {
|
||||||
logFileNamePrefix := makeLogFilePrefix(meta, index)
|
logfilePath := path.Join("logs", logfile)
|
||||||
logFileName := fmt.Sprintf("%s_%d.log", logFileNamePrefix, logFileIndex)
|
targetFile, err := os.OpenFile(logfilePath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0666)
|
||||||
targetFile, err := os.Create(logFileName)
|
if err == nil && targetFile != nil {
|
||||||
if err != nil {
|
defer func() {
|
||||||
logger.Println("failed to create log file :", logFileName)
|
if targetFile != nil {
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
exef, _ := os.Executable()
|
|
||||||
var linkPath string
|
|
||||||
if index == 0 {
|
|
||||||
linkPath = path.Join(path.Dir(exef), path.Dir(logFileName), meta.name+".log")
|
|
||||||
} else {
|
|
||||||
linkPath = path.Join(path.Dir(exef), path.Dir(logFileName), fmt.Sprintf("%s_%d.log", meta.name, index))
|
|
||||||
}
|
|
||||||
|
|
||||||
os.Remove(linkPath)
|
|
||||||
os.Symlink(path.Base(filepath.ToSlash(targetFile.Name())), linkPath)
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
if targetFile != nil {
|
|
||||||
targetFile.Close()
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
logWriter = func(buff []byte) {
|
|
||||||
for written := 0; written < len(buff); {
|
|
||||||
n, err := targetFile.Write(buff)
|
|
||||||
if err != nil {
|
|
||||||
logger.Println("write log file failed :", logFileName, err)
|
|
||||||
break
|
|
||||||
} else {
|
|
||||||
written += n
|
|
||||||
thisFileSize += n
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if thisFileSize > 5*1024*1024 {
|
|
||||||
logFileIndex++
|
|
||||||
logFileName = fmt.Sprintf("%s_%d.log", logFileNamePrefix, logFileIndex)
|
|
||||||
nextTargetFile, err := os.Create(logFileName)
|
|
||||||
if err != nil {
|
|
||||||
logger.Println("failed to create log file :", logFileName)
|
|
||||||
} else {
|
|
||||||
targetFile.Close()
|
targetFile.Close()
|
||||||
targetFile = nextTargetFile
|
}
|
||||||
os.Remove(linkPath)
|
}()
|
||||||
os.Symlink(path.Base(filepath.ToSlash(targetFile.Name())), linkPath)
|
|
||||||
thisFileSize = 0
|
logWriter = func(buff []byte) {
|
||||||
|
for written := 0; written < len(buff); {
|
||||||
|
n, err := targetFile.Write(buff)
|
||||||
|
if err != nil {
|
||||||
|
logger.Println("write log file failed :", logfilePath, err)
|
||||||
|
break
|
||||||
|
} else {
|
||||||
|
written += n
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
logger.Println("failed to create log file :", logfilePath)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
logWriter = func(buff []byte) {
|
logWriter = func(buff []byte) {
|
||||||
@ -487,14 +430,35 @@ func (hc *houstonClient) launch(meta *procmeta) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
go stdReader(meta.name, stdout, index)
|
// 자체 환경 변수
|
||||||
|
customEnv := map[string]string{
|
||||||
|
"HOUSTON_SIBLIING_INDEX": fmt.Sprintf("%d", index),
|
||||||
|
"HOUSTON_PROC_TIMESTAMP": time.Now().UTC().Format("2006-01-02T15-04-05"),
|
||||||
|
}
|
||||||
|
|
||||||
meta.cmd.Env = append(os.Environ(), fmt.Sprintf("HOUSTON_SIBLIING_INDEX=%d", index))
|
// 프로세스 환경 변수에 반영
|
||||||
|
meta.cmd.Env = os.Environ()
|
||||||
|
for k, v := range customEnv {
|
||||||
|
meta.cmd.Env = append(meta.cmd.Env, fmt.Sprintf("%s=%s", k, v))
|
||||||
|
}
|
||||||
|
|
||||||
|
// argument 표현식 계산
|
||||||
meta.cmd.Args, err = evaluateArgs(meta.cmd.Args, parseEnv(meta.cmd.Env))
|
meta.cmd.Args, err = evaluateArgs(meta.cmd.Args, parseEnv(meta.cmd.Env))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Println("evaluateArgs failed :", err)
|
logger.Println("evaluateArgs failed :", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 로그파일에 환경변수 적용
|
||||||
|
evalfile := os.Expand(meta.logfile, func(n string) string {
|
||||||
|
v := os.Getenv(n)
|
||||||
|
if len(v) == 0 {
|
||||||
|
return customEnv[n]
|
||||||
|
}
|
||||||
|
return v
|
||||||
|
})
|
||||||
|
|
||||||
|
go stdReader(meta.name, stdout, index, evalfile)
|
||||||
logger.Println("startChildProcess :", meta.cmd.Args)
|
logger.Println("startChildProcess :", meta.cmd.Args)
|
||||||
|
|
||||||
err = meta.cmd.Start()
|
err = meta.cmd.Start()
|
||||||
|
|||||||
@ -27,10 +27,11 @@ type WithdrawRequest struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type StartProcessRequest struct {
|
type StartProcessRequest struct {
|
||||||
Name string
|
Name string
|
||||||
Version string
|
Version string
|
||||||
Args []string
|
Args []string
|
||||||
AutoRestart bool
|
AutoRestart bool
|
||||||
|
OutputLogFile string
|
||||||
}
|
}
|
||||||
|
|
||||||
type StopProcessRequest struct {
|
type StopProcessRequest struct {
|
||||||
|
|||||||
Reference in New Issue
Block a user