Go 언어 에이전트를 사용하면 다른 뉴렐릭 데이터의 컨텍스트에서 앱 로그를 볼 수 있는 logs in context 를) 얻을 수 있습니다. 이 기능에 대한 일반 정보는 컨텍스트의 APM 로그를 참조하세요.
팁
Go 로그가 많습니까? 최적화 및 관리 방법에 대한 자습서를확인하십시오.
지원되는 로깅 라이브러리
도서관 | 속성 수집을 지원합니까? |
---|---|
아니요 | |
네 | |
네 | |
네 | |
곧 출시 예정 |
에이전트의 컨텍스트에서 로그 구성
컨텍스트 기능에서 다음 로그를 사용하려면 Go 에이전트의 구성 옵션을 수정해야 합니다.
대부분의 사용자에게는 Go 에이전트에 내장된 자동 로그 전달을 사용하는 것이 최상의 솔루션입니다. 설정하기 쉽고 대부분의 사용 사례에 적합합니다. 로그 전달 제한에 대해 알아보세요.
이제 Go 에이전트 버전 3.20.0에서 자동 애플리케이션 로그 전달이 기본적으로 활성화됩니다. 또는 더 높게. 애플리케이션에서 이러한 Go 에이전트 버전을 사용하는 경우 자동 로그 전달을 활성화하기 위해 구성 옵션을 변경할 필요가 없습니다.
이전 버전의 Go 에이전트를 사용하는 경우 애플리케이션 로그 전달을 사용하도록 구성을 수정해야 합니다.
app, err := newrelic.NewApplication( newrelic.ConfigAppLogForwardingEnabled(true),)
사용자 정의 로깅이 더 필요한 사용자 또는 60초 주기당 10,000개 이상의 로그 또는 5초 주기당 833개 이상의 로그를 New Relic으로 보내려는 사용자의 경우 로그 전달을 수동으로 설정하는 것이 좋습니다. 로그를 New Relic에 보내도록 구성된 로그 전달자가 있으면 Go 에이전트가 다음 설정을 포함하도록 구성을 수정하여 전달할 로그를 강화할 수 있습니다.
app, err := newrelic.NewApplication( newrelic.ConfigAppLogDecoratingEnabled(true),)
Go 에이전트 버전 v3.20.0 이상을 사용하는 경우 New Relic에서 수집한 로그가 복제되지 않도록 애플리케이션 로그 전달을 비활성화해야 합니다.
app, err := newrelic.NewApplication( newrelic.ConfigAppLogDecoratingEnabled(true), newrelic.ConfigAppLogForwardingEnabled(false),)
로그인 컨텍스트 플러그인 설치
에이전트가 New Relic에 로그를 보내도록 구성되면 컨텍스트 플러그인에 로그를 설치하여 로깅 라이브러리를 계측합니다.
logWriter 라이브러리는 최신 New Relic Logs in Context 기능을 go 표준 라이브러리 로거에 자동으로 통합하는 io.Writer
입니다. 다음 단계에 따라 애플리케이션에 설치하십시오. 이 라이브러리를 사용하려면 설치된 Go 에이전트 버전이 3.19.1 이상이어야 합니다.
모듈에 logWriter 패키지를 추가하십시오.
bash$go get github.com/newrelic/go-agent/v3/integrations/logcontext-v2/logWriter로거를 초기화하는 파일에서 logWriter 패키지를 가져옵니다.
import ("log""github.com/newrelic/go-agent/v3/integrations/logcontext-v2/logWriter")logWriter 개체를 만듭니다. 로그가 기록될 유효한 io.Writer와 초기화된 go-agent 애플리케이션을 전달해야 합니다. 다음 예는 표준 출력에 씁니다.
writer := logWriter.New(os.Stdout, newRelicApp)로거의 출력 대상으로 새 logWriter 개체를 사용하여 로거 개체를 만듭니다.
logger := log.New(&writer, "", log.Default().Flags())이 시점에서 생성된 로거로 작성된 모든 로그는 로깅 구성 설정에 따라 go-agent에서 처리됩니다.
업무
트랜잭션의 컨텍스트를 캡처하려면 새 logWriter 개체와 로거 개체를 만들어야 합니다. 트랜잭션에 대한 새 logWriter 객체를 만들려면 트랜잭션이 함수에 전달되는 방식에 따라
WithTransaction()
또는WithContext()
함수를 사용합니다. 이러한 함수는 트랜잭션 컨텍스트가 포함된 원본 logWriter 개체의 새 복사본을 만듭니다.함수가 트랜잭션으로 래핑된 컨텍스트를 수신하는 경우 WithContext() 함수를 사용합니다.
txnWriter := writer.WithContext(myWrappedContext)함수가 트랜잭션 포인터를 받으면 WithTransaction() 함수를 사용하십시오.
txnWriter := writer.WithTransaction(myTransaction)각 트랜잭션에 대해 항상 새 logWriter를 사용하여 새 로거를 생성해야 합니다. 이는 비동기 프로세스가 다른 컨텍스트 정보를 사용하여 동일한 로거 객체에 액세스할 가능성을 방지합니다.
txnLogger := log.New(txnWriter, "", log.Default().Flags())문제점 해결
logWriter 도구는 자동으로 실패하도록 설계되었습니다. 디버깅 정보를 활성화하려면 logWriter 객체에서
DebugLogging(true)
메서드를 호출하세요. logWriter에서 오류가 발생하면 편집되지 않은 로그 행이 항상 첫 번째 행에 인쇄됩니다. DebugLogging이 활성화되면 오류가 발생하면 다음 줄에 오류 메시지가 인쇄됩니다.writer.DebugLogging(true)
zerologWriter 라이브러리는 최신 New Relic Logs in Context 기능을 zerolog에 자동으로 통합하는 io.Writer
입니다. 다음 단계에 따라 애플리케이션에 설치하십시오. 이 라이브러리를 사용하려면 설치된 go-agent 버전이 3.19.1 이상이어야 합니다.
모듈에 zerologWriter 패키지를 추가합니다.
bash$go get github.com/newrelic/go-agent/v3/integrations/logcontext-v2/zerologWriterzerolog 로거를 초기화하는 파일에서 zerologWriter 패키지를 가져옵니다.
import ("log""github.com/newrelic/go-agent/v3/integrations/logcontext-v2/zerologWriter")zerologWriter 개체를 만듭니다. 로그가 기록될 유효한 io.Writer와 초기화된 go-agent 애플리케이션을 전달해야 합니다. 다음 예는 표준 출력에 씁니다.
writer := logWriter.New(os.Stdout, newRelicApp)로거의 출력 대상으로 새 zerologWriter 개체를 사용하여 로거 개체를 만듭니다.
logger := zerolog.New(writer)이 시점에서 생성된 로거로 작성된 모든 로그는 로깅 구성 설정에 따라 go-agent에서 처리됩니다.
업무
트랜잭션의 컨텍스트를 캡처하려면 새로운 zerologWriter 개체와 로거 개체를 만들어야 합니다. 트랜잭션에 대한 새로운 zerologWriter 객체를 생성하려면 트랜잭션이 함수에 전달되는 방식에 따라
WithTransaction()
또는WithContext()
함수를 사용합니다. 이러한 함수는 트랜잭션 컨텍스트가 포함된 원래 zerologWriter 개체의 새 복사본을 만듭니다.함수가 트랜잭션으로 래핑된 컨텍스트를 수신하는 경우 WithContext() 함수를 사용합니다.
txnWriter := writer.WithContext(myWrappedContext)함수가 트랜잭션 포인터를 받으면 WithTransaction() 함수를 사용하십시오.
txnWriter := writer.WithTransaction(myTransaction)각 트랜잭션에 대해 항상 새로운 zerologWriter를 사용하여 새 로거를 생성해야 합니다. 이는 비동기 프로세스가 다른 컨텍스트 정보를 사용하여 동일한 로거 객체에 액세스할 가능성을 방지합니다.
txnLogger := logger.Output(txnWriter)문제점 해결
zerologWriter 도구는 자동으로 실패하도록 설계되었습니다. 디버깅 정보를 활성화하려면 zerologWriter 객체에서
DebugLogging(true)
메서드를 호출하세요. zerologWriter에서 오류가 발생하면 항상 첫 번째 줄에 편집되지 않은 로그 줄을 인쇄합니다. DebugLogging이 활성화되면 오류가 발생하면 다음 줄에 오류 메시지가 인쇄됩니다.writer.DebugLogging(true)
nrlogrus 플러그인은 logrus 로깅 프레임워크를 사용하여 컨텍스트 수집에서 자동 로그를 활성화합니다. 애플리케이션이 이를 사용하도록 구성되면 Go 에이전트는 logrus에 기록된 모든 로그를 자동으로 수집합니다. 이를 위해서는 Go 에이전트 버전 3.18.0 이상이 필요합니다.
nrlogrus 패키지를 모듈에 추가합니다.
bash$go get github.com/newrelic/go-agent/v3/integrations/logcontext-v2/nrlogrus- logrus 로거를 초기화하는 파일에서 nrlogrus 패키지를 가져옵니다.
import ("github.com/newrelic/go-agent/v3/integrations/logcontext-v2/nrlogrus""github.com/sirupsen/logrus")새 nrlogrus 포맷터를 구성하고 만듭니다. 유효한 애플리케이션과 유효한 logrus 포맷터를 전달해야 합니다. 전달된 포맷터는 기록되는 로그의 모양을 결정합니다.
nrlogrusFormatter := nrlogrus.NewFormatter(newRelicApplication, &logrus.TextFormatter{})로거의 포맷터를 새로 생성된 nrlogrus 포맷터로 설정합니다.
log := logrus.New()log.SetFormatter(nrlogrusFormatter)이 시점에서 생성된 로거로 작성된 모든 로그는 로깅 구성 설정에 따라 go-agent에서 처리됩니다.
업무
트랜잭션 내부의 로그를 계측할 때 해당 트랜잭션을 logrus에 컨텍스트로 전달해야 합니다. 그러면 에이전트가 처리한 로그를 트랜잭션 및 발생한 범위에 연결하는 해당 트랜잭션에 대한 새 로거 개체가 생성됩니다.
트랜잭션이 포함된 컨텍스트가 있는 경우:
txnLogger := log.WithContext(yourWrappedContext)그렇지 않으면 컨텍스트를 만들어 logrus에 전달할 수 있습니다.
txnLogger := log.WithContext(newrelic.NewContext(context.Background(), txn))
nrzap 플러그인은 Zap 로깅 프레임워크를 사용하여 컨텍스트 수집에서 자동 로그를 활성화합니다. 애플리케이션이 이를 사용하도록 구성되면 go-agent는 Zap으로 작성된 모든 로그를 자동으로 수집합니다. 이를 위해서는 설치된 go-agent 버전이 3.22.1 이상이어야 합니다.
nrzap 패키지를 모듈에 추가하십시오.
bash$go get github.com/newrelic/go-agent/v3/integrations/logcontext-v2/nrzapZap 로거를 초기화하는 파일에서 nrzap 패키지를 가져옵니다.
import ("github.com/newrelic/go-agent/v3/integrations/logcontext-v2/nrzap""go.uber.org/zap""go.uber.org/zap/zapcore")애플리케이션 로깅을 위한 새 Zap 핵심 개체를 구성하고 만듭니다. 코어 개체는 변경할 필요가 없고 래핑만 하면 되므로 이 개체에 대한 포인터를 사용 가능한 상태로 유지하여 래핑된 Zap 코어를 보다 효율적으로 만드는 데 재사용할 수 있도록 하는 것이 좋습니다.
core := zapcore.NewCore(zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()), zapcore.AddSync(os.Stdout), zap.InfoLevel)Zap 코어 개체를 래핑하여 로그를 캡처하고 New Relic으로 보냅니다. wrap 함수에 유효한 Zap 코어가 전달되는 한 반환되는 코어는 오류가 반환되더라도 유효합니다. 이러한 이유로 오류 유형을 확인하는 것이 중요합니다.
backgroundCore, err := nrzap.WrapBackgroundCore(core, app)if err != nil && err != nrzap.ErrNilApp {panic(err)}backgroundLogger := zap.New(backgroundCore)업무
트랜잭션 내에서 로그를 구성할 때 새 Zap 코어 및 로거를 생성해야 합니다. 이는
WrapTransactionCore()
함수를 호출하여 수행할 수 있습니다.txn := app.StartTransaction("nrzap example transaction")txnCore, err := nrzap.WrapTransactionCore(core, txn)if err != nil && err != nrzap.ErrNilTxn {panic(err)}txnLogger := zap.New(txnCore)
nrslog 플러그인은 표준 라이브러리 slog 프레임워크를 사용하여 컨텍스트 수집에서 자동 로그를 활성화합니다. 애플리케이션이 이를 사용하도록 구성되면 Go 에이전트는 래핑된 슬로그 로거로 작성된 모든 로그를 자동으로 수집합니다. 이를 위해서는 Go 에이전트 버전 3.30.0 이상이 필요합니다.
모듈에 nrslog 패키지를 추가합니다.
bash$go get github.com/newrelic/go-agent/v3/integrations/logcontext-v2/nrslogslog 로거를 초기화하는 파일에서 nrslog 패키지를 가져옵니다.
import ("github.com/newrelic/go-agent/v3/integrations/logcontext-v2/nrslog""log/slog")새 nrslog 핸들러를 구성하고 생성합니다. 유효한 New Relilc 애플리케이션 포인터, io.Writer 및 slog.HandlerOptions 객체에 대한 포인터를 전달해야 합니다. slog에서 기본으로 제공되는 텍스트 및 json 핸들러를 자동으로 로그로 변환하기 위해 편의 함수가 nrslog에 패키지되어 있습니다. 이 예에서는
slog.TextHandler
래핑합니다.instrumentedTextHandler := nrslog.TextHandler(app, os.Stdout, &slog.HandlerOptions{})계측된 핸들러를 사용하여 새 로거를 만듭니다.
logger := slog.New(instrumentedTextHandler)이 시점에서 이 새로운 로거로 작성된 모든 로그는 로깅 구성 설정에 따라 go-에이전트에 의해 처리됩니다.
업무
사본 내부에서 권한을 부여하는 경우 해당 사본을
nrslog
에 전달해야 합니다. 이를 수행하는 가장 좋은 방법은 컨텍스트 내부에서 slog로 전달하는 것입니다. 트랜잭션이 포함된 컨텍스트가 있는 경우:txnCtx := newrelic.NewContext(context.Background(), txn)logger.InfoContext(txnCtx, "My log message")
이 문서가 설치하는데 도움이 되셨나요?
데이터 보호
로그에는 HIPAA 또는 기타 규정 준수 프로토콜로 보호되는 민감한 정보가 포함될 수 있습니다. 기본적으로 신용 카드 또는 사회 보장 번호와 같은 항목에 대해 표시되는 번호 패턴을 난독화하지만 추가 정보를 해시하거나 마스킹해야 할 수도 있습니다.
자세한 내용은 난독화 표현식 및 규칙 에 대한 설명서를 참조하세요. New Relic UI를 사용하거나 GraphQL API인 NerdGraph를 사용하여 로그 데이터를 해시하거나 마스킹할 수 있습니다.
다음은 뭐지?
컨텍스트에 맞게 로그를 설정한 후 로깅 데이터를 최대한 활용하세요.