본문으로 건너뛰기

Go Agent v0.4.3

2024년 10월 16일

Fixed os.Stdout, os.Stderr 로그 수집 오류 수정

  • trace.Init 함수에서 로그 수집 기능을 활성화하도록 수정합니다. 최대한 다른 로그 라이브러리 보다 먼저 실행할 수 있도록 변경합니다.

  • os.Stdout, os.Stderr를 래핑한 io.Writer를 사용할 수 있는 함수를 추가했습니다.


다음은 변경된 로그 수집 기능 사용 안내입니다.

에이전트 설정하기

애플리케이션 실행 전에 whatap.conf 파일에 에이전트 옵션을 설정하세요.

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 출력은 유지하면서 동시에 와탭 로그로 수집합니다.

zap library example
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.Writeros.Stderr에 출력 후 로그 내용을 와탭 로그로 수집합니다.

  • log 패키지

    import 시점(init 함수)에서 os.Stderr를 설정합니다. trace.Init 함수를 먼저 호출할 수 없기 때문에 래핑한 io.Writer (os.Stderr)를 log.SetOutput 함수를 통해 설정합니다.

이후 사용되는 log 패키지의 print 함수를 사용한 출력은 래핑한 io.Writer를 통해서 os.Stderr에 출력 후 로그 내용을 와탭 로그로 수집합니다.

log package
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")

...

정보

다운로드