Go 言語のエージェントを使用すると、 logs in contextを取得できます。これにより、他の New Relic データのコンテキストでアプリのログを確認できるようになります。 この機能の一般的な情報については、 「コンテキスト内の 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 にログを送信するようにエージェントを設定したら、logs in context プラグインをインストールして、ロギング ライブラリを計測します。
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 オブジェクトと logger オブジェクトを作成する必要があります。トランザクション用の新しい 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 オブジェクトと logger オブジェクトを作成する必要があります。トランザクション用の新しい 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 に送信します。ラップ関数に有効な 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 フレームワークを使用したコンテキスト取り込みでの自動ログを有効にします。 アプリケーションがそれを使用するように設定されると、ラップされた 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 オブジェクトへのポインタを渡す必要があります。 便利な関数が nrslog にパッケージ化されており、slog でそのまま提供されるテキストおよび json ハンドラーを自動的にインストルメントします。 この例では、
slog.TextHandler
をラップします。instrumentedTextHandler := nrslog.TextHandler(app, os.Stdout, &slog.HandlerOptions{})インストゥルメント化されたハンドラーを使用して新しいロガーを作成します。
logger := slog.New(instrumentedTextHandler)この時点で、この新しいロガーで書き込まれたログは、ログ構成設定に基づいて go-Agent によって処理されます。
トランザクション
ログが トランザクション 内でインストゥルメントされた場合、その トランザクション を
nrslog
に渡す必要があります。 これを行うための推奨される方法は、コンテキスト内で slog に渡すことです。 トランザクションを含むコンテキストがある場合:txnCtx := newrelic.NewContext(context.Background(), txn)logger.InfoContext(txnCtx, "My log message")
このドキュメントはインストールの役に立ちましたか?
データを保護する
ログには、HIPAAまたはその他のコンプライアンスプロトコルによって保護されている機密情報が含まれている場合があります。デフォルトでは、クレジットカードや社会保障番号などのアイテムのように見える番号パターンを難読化しますが、追加情報をハッシュまたはマスクする必要がある場合があります。
詳細については、難読化の式とルールに関するドキュメントを参照してください。 New Relic UIを使用するか、GraphQL APIであるNerdGraphを使用して、ログデータをハッシュまたはマスクできます。
次は何ですか?
コンテキスト内でログを設定したら、ロギング データを最大限に活用します。
- ログ UIを使用して、プラットフォーム全体のログ データを探索します。
- APM UI で、アプリケーションのパフォーマンスのコンテキストでログを確認できます。 エラーのトラブルシューティング 分散型トレース 、スタックトレース、アプリケーションログなどを使用します。
- ログをインフラストラクチャエージェントに転送することで、アプリケーションとシステム パフォーマンス データの両方をより深く把握できます。 UI でインフラストラクチャ ログを確認します。
- アラートを設定します。
- データをクエリし、ダッシュボードを作成します。