Go Agent v0.4.3
2024년 10월 16일
Fixed
os.Stdout
, os.Stderr
로그 수집 오류 수정
-
trace.Init
함수에서 로그 수집 기능을 활성화하도록 수정합니다. 최대한 다른 로그 라이브러리 보다 먼저 실행할 수 있도록 변경합니다. -
os.Stdout
,os.Stderr
를 래핑한 io.Writer를 사용할 수 있는 함수를 추가했습니다.
다음은 변경된 로그 수집 기능 사용 안내입니다.
에이전트 설정하기
애플리케이션 실행 전에 whatap.conf 파일에 에이전트 옵션을 설정하세요.
logsink_enabled=true
# Enable stdout collection
logsink_stdout_enabled=true
# Enable stderr collection
logsink_stderr_enabled=true
# Optional. This is a setting for compressing data.
logsin_zip_enabled=true
로그 라이브러리 초기화 전
먼저 trace.Init()
함수를 호출해야 합니다. 내부적으로 os.Stdout
, os.Stderr
를 래핑합니다. 이후 로그 라이브러리가 os.Stdout
, os.Stderr
를 설정하면 자동으로 로그를 수집합니다.
zap 라이브러리 예
os.Stdout
을 설정하기 전에 trace.Init()
함수를 호출하면 자동으로 로그를 수집합니다. os.Stdout
출력은 유지하면서 동시에 와탭 로그로 수집합니다.
import (
"github.com/whatap/go-api/trace"
"github.com/whatap/go-api/logsink"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
func main() {
trace.Init(nil)
//It must be executed before closing the app.
defer trace.Shutdown()
// fmt.Println("Logger stdout=", os.Stdout, zapcore.AddSync(os.Stdout))
consoleCore := zapcore.NewCore(
zapcore.NewConsoleEncoder(consoleEncoderConfig),
zapcore.AddSync(os.Stdout),
zap.InfoLevel,
)
// Menggabungkan core file dan console
core := zapcore.NewTee(consoleCore)
Log = zap.New(core, zap.AddCaller(), zap.AddStacktrace(zapcore.ErrorLevel))
Log.Info("logger started")
...
}
로그 라이브러리 초기화 이후
로그 라이브러리의 설정 함수를 통해서 래핑한 io.Writer를 설정할 수 있습니다.
-
logsink.GetWriterHookStdout()
:os.Stderr
를 래핑한 io.Writer를 반환합니다.os.Stdout
에 출력하면서 동시에 해당 로그를 와탭 로그로 수집합니다. -
logsink.GetWriterHookStderr()
:os.Stderr
를 래핑한 io.Writer를 반환합니다. 래핑한 io.Writer는os.Stderr
에 출력 후 로그 내용을 와탭 로그로 수집합니다. -
log 패키지
import 시점(
init
함수)에서os.Stderr
를 설정합니다.trace.Init
함수를 먼저 호출할 수 없기 때문에 래핑한 io.Writer (os.Stderr
)를log.SetOutput
함수를 통해 설정합니다.
이후 사용되는 log 패키지의 print
함수를 사용한 출력은 래핑한 io.Writer를 통해서 os.Stderr
에 출력 후 로그 내용을 와탭 로그로 수집합니다.
import (
"log"
"github.com/whatap/go-api/logsink"
)
...
if logsink.GetWriterHookStderr() != nil {
// set single writer
log.SetOutput(logsink.GetWriterHookStderr())
// set multi writer
multi := io.MultiWriter(file, logsink.GetWriterFromStderr())
log.SetOutput(logsink.GetWriterHookStderr())
}
//
log.Println("aaaaa")
...