파일에 직접 로깅하는 로거로 교체

This commit is contained in:
2023-06-13 20:03:10 +09:00
parent d490188bd2
commit c1847ee3e1
12 changed files with 116 additions and 77 deletions

View File

@ -20,7 +20,6 @@ import (
"time"
"unsafe"
"repositories.action2quare.com/ayo/gocommon/logger"
"repositories.action2quare.com/ayo/houston/shared"
"repositories.action2quare.com/ayo/houston/shared/protos"
@ -197,7 +196,7 @@ func NewClient() (HoustonClient, error) {
var client *grpc.ClientConn
for {
logger.Println("grpc.DialContext :", clientConfig.GrpcAddress)
shared.Logger().Println("grpc.DialContext :", clientConfig.GrpcAddress)
dialContext, cancelDial := context.WithTimeout(context.Background(), 15*time.Second)
client, err = grpc.DialContext(dialContext, clientConfig.GrpcAddress, grpc.WithBlock(), grpc.WithTransportCredentials(insecure.NewCredentials()))
if err == nil {
@ -206,11 +205,11 @@ func NewClient() (HoustonClient, error) {
}
cancelDial()
logger.Println("grpc.DialContext failed :", err)
shared.Logger().Println("grpc.DialContext failed :", err)
time.Sleep(5 * time.Second)
}
logger.Println("grpc.DialContext succeeded")
shared.Logger().Println("grpc.DialContext succeeded")
exefile, err := os.Executable()
if err != nil {
return nil, err
@ -284,7 +283,7 @@ func NewClient() (HoustonClient, error) {
var dr shared.DeployRequest
unmarshal(&dr, resp.Args)
logger.Println(dr.Name, myname)
shared.Logger().Println(dr.Name, myname)
if dr.Name == myname {
if srcdir, replacer, err := hc.prepareUpdateSelf(&dr); err == nil {
args := []string{
@ -293,14 +292,15 @@ func NewClient() (HoustonClient, error) {
filepath.ToSlash(os.Args[0]),
}
args = append(args, os.Args[1:]...)
shared.Logger().Println(replacer, args)
cmd := exec.Command(replacer, args...)
if err := cmd.Start(); err != nil {
logger.Println(err)
shared.Logger().Println(err)
} else {
hc.shutdownFunc()
}
} else {
logger.Println(err)
shared.Logger().Println(err)
}
} else {
if err := hc.deploy(&dr); err == nil {
@ -308,7 +308,7 @@ func NewClient() (HoustonClient, error) {
hc.deploys[dr.Name] = prog
op.Refresh(ctx, hc.makeOperationQueryRequest())
} else {
logger.Println(err)
shared.Logger().Println(err)
}
}
@ -325,35 +325,35 @@ func NewClient() (HoustonClient, error) {
}
op.Refresh(ctx, hc.makeOperationQueryRequest())
} else {
logger.Println(err)
shared.Logger().Println(err)
}
case shared.Start:
var sr shared.StartProcessRequest
unmarshal(&sr, resp.Args)
if err := hc.startChildProcess(&sr); err != nil {
logger.Println(err)
shared.Logger().Println(err)
}
case shared.Stop:
var sr shared.StopProcessRequest
unmarshal(&sr, resp.Args)
if err := hc.stopChildProcess(&sr); err != nil {
logger.Println(err)
shared.Logger().Println(err)
}
case shared.Restart:
var rr shared.RestartProcessRequest
unmarshal(&rr, resp.Args)
if err := hc.restartChildProcess(&rr); err != nil {
logger.Println(err)
shared.Logger().Println(err)
}
case shared.Upload:
var ur shared.UploadRequest
unmarshal(&ur, resp.Args)
if err := hc.uploadFiles(&ur); err != nil {
logger.Println(err)
shared.Logger().Println(err)
}
}
}
@ -390,7 +390,7 @@ func (hc *houstonClient) Start() {
go func() {
c := <-interrupt
logger.Println("interrupt!!!!!!!! :", c.String())
shared.Logger().Println("interrupt!!!!!!!! :", c.String())
hc.shutdownFunc()
}()
@ -402,7 +402,7 @@ func (hc *houstonClient) Start() {
default:
err := hc.checkOperation()
if err != nil {
logger.Println("hc.checkUpdate failed :", err)
shared.Logger().Println("hc.checkUpdate failed :", err)
}
}
}
@ -416,7 +416,7 @@ func (hc *houstonClient) checkOperation() error {
defer func() {
r := recover()
if r != nil {
logger.Error(r)
shared.Logger().Println(r)
}
}()
@ -438,7 +438,7 @@ func (hc *houstonClient) checkOperation() error {
cl.CloseSend()
return err
}
logger.Println(update)
shared.Logger().Println(update)
hc.operationChan <- update
}
}

View File

@ -13,8 +13,6 @@ import (
"path/filepath"
"strings"
"repositories.action2quare.com/ayo/gocommon/logger"
"repositories.action2quare.com/ayo/houston/shared"
"golang.org/x/text/encoding/korean"
@ -258,20 +256,24 @@ func (hc *houstonClient) prepareUpdateSelf(req *shared.DeployRequest) (srcdir st
selfname, _ := os.Executable()
srcreplacer := path.Join(path.Dir(fname), "replacer") + path.Ext(selfname)
replacer = "replacer" + path.Ext(selfname)
replacer = "./" + filepath.ToSlash("replacer"+path.Ext(selfname))
err = copy(srcreplacer, replacer)
if err == nil {
err = os.Chmod(replacer, 0775)
}
// replacer먼저 가져옴
return filepath.ToSlash(tempdir), filepath.ToSlash(replacer), copy(srcreplacer, replacer)
return filepath.ToSlash(tempdir), replacer, err
}
func (hc *houstonClient) deploy(req *shared.DeployRequest) error {
logger.Println("start deploying")
shared.Logger().Println("start deploying")
root, err := hc.prepareDeploy(req.Name, req.Version)
if err != nil {
return err
}
logger.Println("start downloading", req.Url)
shared.Logger().Println("start downloading", req.Url)
// verpath에 배포 시작
fname, err := download(root, hc.makeDownloadUrl(req.Url), req.AccessToken)
if err != nil {

View File

@ -18,8 +18,6 @@ import (
"syscall"
"time"
"repositories.action2quare.com/ayo/gocommon/logger"
"repositories.action2quare.com/ayo/houston/shared"
"repositories.action2quare.com/ayo/houston/shared/protos"
)
@ -56,7 +54,7 @@ func (hc *houstonClient) uploadZipLogFile(zipFile string, name string, version s
req, err := http.NewRequest("POST", hc.httpAddr+"/upload", zf)
if err != nil {
logger.Error(err)
shared.Logger().Println(err)
}
req.Header.Set("Houston-Service-Name", name)
req.Header.Set("Houston-Service-Version", version)
@ -121,19 +119,19 @@ func zipLogFiles(req *shared.UploadRequest, start, except string) (string, []str
relative := file[len(root)+1:]
fw, err := w.Create(relative)
if err != nil {
logger.Error(err)
shared.Logger().Println(err)
return "", nil, err
}
src, err := os.Open(file)
if err != nil {
logger.Error(err)
shared.Logger().Println(err)
return "", nil, err
}
defer src.Close()
if _, err = io.Copy(fw, src); err != nil {
logger.Error(err)
shared.Logger().Println(err)
return "", nil, err
}
}
@ -220,7 +218,7 @@ func (hc *houstonClient) launch(meta *procmeta) error {
defer func() {
r := recover()
if r != nil {
logger.Println(r)
shared.Logger().Println(r)
debug.PrintStack()
}
close(relayChan)
@ -266,10 +264,10 @@ func (hc *houstonClient) launch(meta *procmeta) error {
os.Remove(oldf)
}
} else {
logger.Println("uploadZipLogFile failed :", err)
shared.Logger().Println("uploadZipLogFile failed :", err)
}
} else if err != nil {
logger.Println("zipLogFiles failed :", err)
shared.Logger().Println("zipLogFiles failed :", err)
}
}(startFile, nextFile)
@ -325,7 +323,7 @@ func (hc *houstonClient) launch(meta *procmeta) error {
var errPrepareprocessLaunchFailed = errors.New("prepareProcessLaunch failed")
func (hc *houstonClient) startChildProcess(req *shared.StartProcessRequest) error {
logger.Println("startChildProcess :", *req)
shared.Logger().Println("startChildProcess :", *req)
if req.Version == "latest" {
// 최신 버전을 찾음
latest, err := shared.FindLastestVersion(req.Name)
@ -503,10 +501,10 @@ func (hc *houstonClient) uploadFiles(req *shared.UploadRequest) error {
req.Version = latest
}
logger.Println("uploadFiles req :", *req)
shared.Logger().Println("uploadFiles req :", *req)
for _, child := range hc.childProcs {
if child.version == req.Version && child.name == req.Name {
logger.Println("uploadFiles found :", child.version, child.name)
shared.Logger().Println("uploadFiles found :", child.version, child.name)
child.logUploadChan <- req
return nil
}
@ -521,10 +519,10 @@ func (hc *houstonClient) uploadFiles(req *shared.UploadRequest) error {
os.Remove(oldf)
}
} else {
logger.Println("uploadZipLogFile failed :", err)
shared.Logger().Println("uploadZipLogFile failed :", err)
}
} else if err != nil {
logger.Println("zipLogFiles failed :", err)
shared.Logger().Println("zipLogFiles failed :", err)
}
return nil

1
go.mod
View File

@ -6,7 +6,6 @@ require (
golang.org/x/text v0.9.0
google.golang.org/grpc v1.55.0
google.golang.org/protobuf v1.30.0
repositories.action2quare.com/ayo/gocommon v0.0.0-20230528100715-93bd4f6c0bab
)
require (

2
go.sum
View File

@ -18,5 +18,3 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng=
google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
repositories.action2quare.com/ayo/gocommon v0.0.0-20230528100715-93bd4f6c0bab h1:EMlxwDayv3rn8ttJcJuDLYoHA5odVn85+LjdAuw+2dw=
repositories.action2quare.com/ayo/gocommon v0.0.0-20230528100715-93bd4f6c0bab/go.mod h1:ng62uGMGXyQSeuxePG5gJAMtip4Rnspu5Tu7hgvaXns=

View File

@ -3,28 +3,30 @@ package main
import (
"flag"
"repositories.action2quare.com/ayo/gocommon/logger"
"repositories.action2quare.com/ayo/houston/client"
"repositories.action2quare.com/ayo/houston/server"
"repositories.action2quare.com/ayo/houston/shared"
)
var runAsClient = flag.Bool("client", false, "")
var runAsServer = flag.Bool("server", false, "")
func main() {
shared.InitLogger()
if !flag.Parsed() {
flag.Parse()
}
if !*runAsClient && !*runAsServer {
logger.Fatal("client or server flag is needed")
shared.Logger().Fatal("client or server flag is needed")
return
}
if *runAsClient {
hc, err := client.NewClient()
if err != nil {
logger.Fatal(err)
shared.Logger().Fatal(err)
return
}
hc.Start()

View File

@ -2,8 +2,8 @@ package main
import (
"errors"
"fmt"
"io"
"log"
"os"
"os/exec"
"path"
@ -48,23 +48,28 @@ func copy(src, dst string) error {
}
func main() {
logfile, _ := os.OpenFile("replacer.log", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666)
defer logfile.Close()
stdlog := log.New(logfile, "", log.LstdFlags)
args := os.Args
// args[1] : 나를 시작한 pid. pid가 종료될 때 까지 기다림
// args[2] : target 폴더
// args[3:] : 다시 시작할 때 넘겨줄 arguments(프로세스 이름 포함)
fmt.Println(args)
stdlog.Println(args)
pid, err := strconv.Atoi(args[1])
if err != nil {
panic(err)
stdlog.Fatal(err)
}
proc, err := os.FindProcess(pid)
if err != nil {
panic(err)
stdlog.Fatal(err)
}
proc.Wait()
selfext, _ := os.Executable()
selfext = path.Base(selfext)
entries, _ := os.ReadDir(args[2])
for _, ent := range entries {
@ -74,16 +79,27 @@ func main() {
if ent.IsDir() {
if err := os.MkdirAll(ent.Name(), 0775); err != nil {
panic(err)
stdlog.Fatal(err)
}
} else {
if err := copy(path.Join(args[2], ent.Name()), ent.Name()); err != nil {
panic(err)
stdlog.Println("copy failed :", path.Join(args[2], ent.Name()), ent.Name())
stdlog.Fatal(err)
}
}
}
os.RemoveAll(args[2])
err = os.RemoveAll(args[2])
if err != nil {
stdlog.Println("os.RemoveAll failed :", args[2], err)
}
err = os.Chmod(args[3], 0775)
if err != nil {
stdlog.Println("os.Chmod failed :", err)
}
stdlog.Println("exec.Command :", args)
cmd := exec.Command(args[3], args[4:]...)
cmd.Start()
}

View File

@ -9,7 +9,6 @@ import (
"strconv"
"time"
"repositories.action2quare.com/ayo/gocommon/logger"
"repositories.action2quare.com/ayo/houston/shared"
)
@ -26,7 +25,7 @@ func (h *houstonHandler) GetAgents(w http.ResponseWriter, r *http.Request) {
func (h *houstonHandler) GetDeploySources(w http.ResponseWriter, r *http.Request) {
files, err := os.ReadDir(h.deployPath)
if err != nil {
logger.Error(err)
shared.Logger().Println(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
@ -62,7 +61,7 @@ func (h *houstonHandler) UploadDeploySource(w http.ResponseWriter, r *http.Reque
// </form>
file, header, err := r.FormFile("file")
if err != nil {
logger.Error(err)
shared.Logger().Println(err)
w.WriteHeader(http.StatusBadRequest)
return
}
@ -70,7 +69,7 @@ func (h *houstonHandler) UploadDeploySource(w http.ResponseWriter, r *http.Reque
contents, err := io.ReadAll(file)
if err != nil {
logger.Error(err)
shared.Logger().Println(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
@ -89,7 +88,7 @@ func (h *houstonHandler) UploadDeploySource(w http.ResponseWriter, r *http.Reque
}
if err = os.MkdirAll(path.Dir(filename), 0775); err != nil {
logger.Error(err)
shared.Logger().Println(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
@ -97,7 +96,7 @@ func (h *houstonHandler) UploadDeploySource(w http.ResponseWriter, r *http.Reque
// 파일 저장
err = os.WriteFile(filename, contents, 0644)
if err != nil {
logger.Error(err)
shared.Logger().Println(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
@ -119,7 +118,7 @@ func (h *houstonHandler) DeleteDeploySource(w http.ResponseWriter, r *http.Reque
// deploys 폴더는 파일시스템 서비스이므로 다운로드 가능
targetpath := path.Join(h.deployPath, name, version)
if err := os.RemoveAll(targetpath); err != nil {
logger.Println("deleteDeploySource failed :", err)
shared.Logger().Println("deleteDeploySource failed :", err)
w.WriteHeader(http.StatusInternalServerError)
return
}
@ -139,7 +138,7 @@ func (h *houstonHandler) Deploy(w http.ResponseWriter, r *http.Request) {
var targets []string
if len(traws) > 0 {
if err := json.Unmarshal([]byte(traws), &targets); err != nil {
logger.Error(err)
shared.Logger().Println(err)
w.WriteHeader(http.StatusBadRequest)
return
}
@ -153,7 +152,7 @@ func (h *houstonHandler) Deploy(w http.ResponseWriter, r *http.Request) {
relPath := path.Join(h.deployPath, name, version)
files, err := os.ReadDir(relPath)
if err != nil {
logger.Error(err)
shared.Logger().Println(err)
w.WriteHeader(http.StatusBadRequest)
return
}
@ -200,7 +199,7 @@ func (h *houstonHandler) Undeploy(w http.ResponseWriter, r *http.Request) {
var targets []string
if len(traws) > 0 {
if err := json.Unmarshal([]byte(traws), &targets); err != nil {
logger.Error(err)
shared.Logger().Println(err)
w.WriteHeader(http.StatusBadRequest)
return
}
@ -236,7 +235,7 @@ func (h *houstonHandler) StartProcess(w http.ResponseWriter, r *http.Request) {
var targets []string
if len(traws) > 0 {
if err := json.Unmarshal([]byte(traws), &targets); err != nil {
logger.Error(err)
shared.Logger().Println(err)
w.WriteHeader(http.StatusBadRequest)
return
}
@ -275,7 +274,7 @@ func (h *houstonHandler) StopProcess(w http.ResponseWriter, r *http.Request) {
var targets []string
if len(traws) > 0 {
if err := json.Unmarshal([]byte(traws), &targets); err != nil {
logger.Error(err)
shared.Logger().Println(err)
w.WriteHeader(http.StatusBadRequest)
return
}
@ -312,7 +311,7 @@ func (h *houstonHandler) UploadLogs(w http.ResponseWriter, r *http.Request) {
}
var targets []string
if err := json.Unmarshal([]byte(traws), &targets); err != nil {
logger.Error(err)
shared.Logger().Println(err)
w.WriteHeader(http.StatusBadRequest)
return
}

View File

@ -10,7 +10,7 @@ import (
"runtime/debug"
"strings"
"repositories.action2quare.com/ayo/gocommon/logger"
"repositories.action2quare.com/ayo/houston/shared"
)
const (
@ -57,7 +57,7 @@ func (h *houstonHandler) RegisterHandlers(serveMux *http.ServeMux, prefix string
return err
}
logger.Printf("houstonHandler registed. deployPath : %s, downloadPath : %s", h.deployPath, h.downloadPath)
shared.Logger().Printf("houstonHandler registed. deployPath : %s, downloadPath : %s", h.deployPath, h.downloadPath)
if len(prefix) > 0 {
prefix = "/" + prefix
@ -74,7 +74,7 @@ func (h *houstonHandler) RegisterHandlers(serveMux *http.ServeMux, prefix string
defer func() {
s := recover()
if s != nil {
logger.Println(s)
shared.Logger().Println(s)
debug.PrintStack()
}
io.Copy(io.Discard, r.Body)
@ -107,7 +107,7 @@ func (h *houstonHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
defer func() {
s := recover()
if s != nil {
logger.Println(s)
shared.Logger().Println(s)
debug.PrintStack()
}
}()
@ -132,7 +132,7 @@ func (h *houstonHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
method, ok := h.methods[strings.ToLower(operation)]
if !ok {
// 없는 operation
logger.Println("fail to call api. operation is not valid :", operation)
shared.Logger().Println("fail to call api. operation is not valid :", operation)
w.WriteHeader(http.StatusBadRequest)
return
}

View File

@ -7,8 +7,6 @@ import (
"reflect"
"sync"
"repositories.action2quare.com/ayo/gocommon/logger"
"repositories.action2quare.com/ayo/houston/shared"
"repositories.action2quare.com/ayo/houston/shared/protos"
)
@ -75,7 +73,7 @@ func (sp *hostPool) regist(desc *protos.OperationQueryRequest) (string, chan *op
sp.hosts[desc.Hostname] = host
test, _ := json.Marshal(sp.hosts)
logger.Println(string(test))
shared.Logger().Println(string(test))
return desc.Hostname, host.opChan
}
@ -90,7 +88,7 @@ func (sp *hostPool) refresh(desc *protos.OperationQueryRequest) {
}
test, _ := json.Marshal(sp.hosts)
logger.Println(string(test))
shared.Logger().Println(string(test))
}
func (sp *hostPool) unregist(key string) {

View File

@ -6,7 +6,6 @@ import (
"net"
"os"
"repositories.action2quare.com/ayo/gocommon/logger"
"repositories.action2quare.com/ayo/houston/shared"
"repositories.action2quare.com/ayo/houston/shared/protos"
@ -110,7 +109,7 @@ type Operation interface {
func loadServerConfig() serverConfig {
configFile, err := os.Open("config.json")
if err != nil {
logger.Error(err)
shared.Logger().Println(err)
return serverConfig{
GrpcPort: 8080,
}
@ -126,14 +125,14 @@ func loadServerConfig() serverConfig {
dec := json.NewDecoder(configFile)
err = dec.Decode(&config)
if err != nil {
logger.Error(err)
shared.Logger().Println(err)
return serverConfig{
GrpcPort: 8080,
}
}
if config.Houston == nil {
logger.Error(`"houston" object is missing in config.json`)
shared.Logger().Println(`"houston" object is missing in config.json`)
return serverConfig{
GrpcPort: 8080,
}
@ -167,7 +166,7 @@ type houstonServer struct {
}
func (hs *houstonServer) Start() error {
logger.Println("houston server is started at port", hs.port)
shared.Logger().Println("houston server is started at port", hs.port)
lis, err := net.Listen("tcp", fmt.Sprintf("0.0.0.0:%d", hs.port))
if err != nil {
return err

28
shared/logger.go Normal file
View File

@ -0,0 +1,28 @@
package shared
import (
"log"
"os"
"path"
)
var defLogger *log.Logger
func InitLogger() {
name, _ := os.Executable()
base := path.Base(name)
logfile, _ := os.OpenFile(base+".log", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666)
defLogger = log.New(logfile, "", log.LstdFlags)
}
func Logger() *log.Logger {
return defLogger
}
func CloseLogger() {
outfile := defLogger.Writer().(*os.File)
if outfile != nil {
outfile.Close()
}
}