JSON ロギングと Datadog
ログにJSONを使用する理由
現在 JSON ログを使用していない場合は、おそらくプレーンテキスト ログと正規表現に依存してログの意味を理解しているでしょう。最初はうまくいくかもしれませんが、システムが拡大するにつれて、壊れ始め、構造が失われ、どんどん悪化していきます。JSON ロギングが標準です。現代のアプリケーションでは、構造化され、簡単に解析できるログを持つことはもはやオプションではありません。柔軟性を維持しながら、サービス間で一定レベルの一貫性を実現します。
Datadog が JSON ログ記録を推奨するのには理由があります。ログが有効な JSON として出力されると、Datadog のプリプロセッサは自動的にログを解析し、オーバーヘッドを削減して一貫したフィールド抽出を保証するいくつかの予約済み属性にマッピングします。これらの予約済み属性は最も関連性の高いフィールドを提供するため、他のシステムとの統合、ログのフィルタリング、効率的な検索、アラートの設定が容易になり、追加の構成は必要ありません。重要な予約済み属性には、ホスト、サービス、ステータス、トレース ID、スパン ID などがあり、これらは監視とトラブルシューティングに不可欠です。
設定方法
私の経験では、JSON ログを最適に構成する方法に関するリソースは豊富にありました。私が使用した主な参考資料は、Datadog のドキュメントです: https://docs.datadoghq.com/logs/log_collection/java/?tab=logback. Datadog は私たちが使用した主な観測ツールであり、問題が発生した場合にトラブルシューティングが容易になるため、これが最適だと判断しました。
Datadog のドキュメントをガイドとして使用し、まず logback-spring.xml 構成ファイルを作成しました。ここでほとんどの作業が行われます。最初は、さまざまな JSON エンコーダーを試して、役立つと思われるフィールドを追加しました。最終的に、私はシンプルさの威力に気づきました。つまり、クリーンで最小限の構成であれば、保守が容易になり、壊れる可能性も低くなります。
<springProfile name="json-logs">
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="net.logstash.logback.encoder.LogstashEncoder" />
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
</root>
必要な Logback 依存関係を追加し、このコードを logback-spring.xml ファイルに追加した後、最後の主要なステップは、アプリケーション YAML でアクティブな Spring プロファイルとして 'json-logs' を設定することです。これにより、JSON ログが環境全体で有効になり、すべてのサービスで一貫して機能するようになります。
これらの手順を正しく実行すると、ログを追跡して結果を確認できるはずです。これらは次のようなキー値ログにあるはずです。
{"@timestamp":"2025-1-13T13:02:27.512333-02:00","@version":"1","message":"Tomcat initialized with port 8080(http)",
"logger_name":"org.springframework.boot.web.embedded.tomcat.TomcatWebServer","thread_name":"main","level":"INFO",
"level_value":20000,"appName":"json-logs"}
この時点で、Datadog のログは構造化され、トレース ID を持つログに対してトレース相関が機能し、より詳細で一貫性のある属性が表示されるはずです。
よくある間違いとアドバイス
- システムに最適な場合は、ファイル アペンダーを使用します。私たちの環境では、コンソールアペンダーの方がニーズに合っていました。
- JSONエンコーダの多様なオプションにとらわれないでください。少なくとも最初は、シンプルな方が通常は良いです。
- Datadog エージェントで既存のログ処理ルールを確認します。これらのルールは JSON ログに干渉し、正しく解析または配信されなくなる可能性があります。レガシーロガーが設定と競合していないことを確認してください
- より細かく制御するには、複数の Spring プロファイルを作成することを検討してください。これにより、アプリケーションコードを変更することなく、環境間でログレベルやフォーマットを切り替えることができます。
- Datadog 上の多くのログでトレースが機能しない場合は、多くのログのトレースが自動的にサンプリングされるためです。JSONは機能しているので心配しないでください。ただし、別のレートに設定することもできます。
適切な設定を行うと、Datadog での JSON ログ記録の信頼性が高まり、保守がはるかに容易になります。従来の前提を排除し、構成をシンプルに保つことで、構造化されたログ、一貫性のあるフィールド、トレースの相関関係、フィルタリングとアラートの容易さを実現できます。JSON ロギングは単なるベストプラクティスではなく、最新のアプリケーションの可観測性を向上させるために不可欠です。
著者について
聞いてみてどうでしたか?自分に合ったものについてご質問がありますか?ぜひご相談ください!お問い合わせ