Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
もう少しだけ、ログと向き合ってみる 〜slogを使って構造化ログを出す〜
Search
kensho
September 14, 2024
0
6
もう少しだけ、ログと向き合ってみる 〜slogを使って構造化ログを出す〜
Funabashi.dev supported by KIKKAKE CREATION(
https://funabashidev.connpass.com/event/324776/
)
登壇資料
kensho
September 14, 2024
Tweet
Share
More Decks by kensho
See All by kensho
テーブル設計のよくある罠と それに対する処方箋
iwashi623
1
51
PHPerもIaCを使おう! 17年物のインフラをTerraformに大移行
iwashi623
2
1.6k
今ならわかるDirectConnect
iwashi623
0
62
あぁ…我らのECS…
iwashi623
0
1.3k
Featured
See All Featured
Code Review Best Practice
trishagee
64
17k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Build The Right Thing And Hit Your Dates
maggiecrowley
33
2.4k
Bash Introduction
62gerente
608
210k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
364
24k
BBQ
matthewcrist
85
9.3k
Raft: Consensus for Rubyists
vanstee
136
6.6k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
For a Future-Friendly Web
brad_frost
175
9.4k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
93
16k
Six Lessons from altMBA
skipperchong
27
3.5k
Transcript
もう少しだけ、 ログと向き合ってみる Funabashi.dev supported by KIKKAKE CREATION 岩下 拳勝(@iwashi623)
自己紹介 name: 岩下 拳勝 work: Backend Engineer(Go, PHP, AWS, Google
Cloud) hobby: プロ野球観戦(ガチ目の阪神ファン) SNS: @iwashi623
目次 1. 自己紹介 2. 事例紹介 3. 問題点 4. 解決策 5.
slogの実装 6. 結果 7. まとめ
皆さん、ログ出してますか ?
俺達はログが「 failure!」って泣いているとと悲しくなるし、 「Success!」なんてログを見たら一緒に嬉しくなっちまう、 そういう生き物なんだ
ちょうどログの良さを知ってもらった後だし、 具体的なログとの戯れ方の Howtoをご紹介していく !
目次 1. 自己紹介 2. 事例紹介 3. 問題点 4. 解決策 5.
slogの実装 6. 結果 7. まとめ
事例紹介 環境: Golang:1.23 FW: echo
事例紹介 いつものようにエラーが飛んできた
事例紹介 よーし、Google CloudのLog Explorerを見に行くぞ〜
事例紹介 なるほど、このCloud Runのエラーか! echo内部で500エラーを返すと 、LogExplorerが勝手にSeverityをエラー としてくれるから検知が簡単だなぁー
事例紹介 エラーになっているアクセスログの近く にログが落ちてた。 えっへん、エラーになったときは user_idをログを吐くようにしてあるん だ!😤 お問い合わせが来るかもしれない ユーザー情報があらかじめ掴めれる からすごく楽ちん〜
事例紹介 よしよし、 エディタの全文検索で簡単にエラー箇所もすぐ 特定できたし、修正も簡単だぞ!
事例紹介 数年後、 アプリケーションは成長して、ユーザーも増えてきた
事例紹介 うーん、最近いろんなものをログに出しすぎ てて、このエラーに対応するログがどれな のか全然わからないな。。。
事例紹介 原因究明に時間がかかるから、エラー つぶしも後回しになりがちだし、どんど ん原因不明エラーが溜まっていってる 。。。
事例紹介 エラーメッセージで場所を特定しようにも、同じよう なエラーメッセージを使用している箇所が50箇所 以上か。。。
事例紹介 知らないログめっちゃ怖いの悪循環
事例紹介 おわた
目次 1. 自己紹介 2. 事例紹介 3. 問題点 4. 解決策 5.
slogの実装 6. 結果 7. まとめ
問題点 この現状の問題点は、 - ログが追跡可能になっていないこと - ログがすべてプレーンテキストで出力されていること - アクセスログ以外の Severityが設定されていない です。
問題点 この現状の問題点は、 - ログが追跡可能になっていないこと - ログがすべてプレーンテキストで出力されていること - アクセスログ以外の Severityが設定されていない です。
昨日の僕の「助けてくれ〜」の Discordは、 SeverityがInfoだったんだな
問題点 追跡できないログはただのポエム fmt.Println()を許すな!
追えてなんぼのログに候
目次 1. 自己紹介 2. 事例紹介 3. 問題点 4. 解決策 5.
slogの実装 6. 結果 7. まとめ
解決策 構造化ログを吐いて、ログをカスタムしましょう
解決策 Goでは、1.21からslogという便利ロガーが標準パッケージとなりました
解決策 Goでは、1.21からslogという便利ロガーが標準パッケージとなりました そこで、slogをつかって素朴なecho用のロガーを実装してみます
目次 1. 自己紹介 2. 事例紹介 3. 問題点 4. 解決策 5.
slogの実装 6. 結果 7. まとめ
slogの実装 slogのセットアップと、echoのミドルウェアレベルでログとして出したいものをセットしている場所。 たとえば、リクエストのURLパスやHTTPメソッドなどをdefaultLogFuncの中で設定してる。
slogの実装 個別のハンドラーの中では、そのハンドラー特有のログのフィールドにしたい情報をセッ ト。 ここでは、リクエストパラメーターのuser_idをログのフィールドとして設定。
ログのレベルごとに別関数を実装する。 レベルがきちんと分かれていると、Log Expolorerな どで検索や監視アラートを作成する際にすごく簡単 になるのでぜひやりたい。 slogの実装
TraceIDの取得。 CloudRunは、受け取ったすべてのリクエスト に「X-Cloud-Trace-Context」という独自ヘッ ダーがくっついているためそこから取り出した IDをctxに詰める。 オリジナルのTraceIDヘッダーを使いたい方 はそちらをどうぞ。 slogの実装
このHandle関数といくつくかの関数シグネ チャさえ満たせば、自由にカスタムできるのが slogのいいところですね。 ログを吐いたときのファイル名や ※ StactTraceがほしいなら、エラーを外部 パッケージのcockroachdb/errorsなどを 使ってもいいかも slogの実装
目次 1. 自己紹介 2. 事例紹介 3. 問題点 4. 解決策 5.
slogの実装 6. 結果 7. まとめ
エラーログが、Severity=ERRORで出るようにでき た! fmt.Println()からの脱出🎉 結果
すべてのログがTraceIDで紐づいているので、ど のログがどのリクエストのものか、すぐに絞り込め る! 結果
すべてのログがTraceIDで紐づいているので、ど のログがどのリクエストのものか、すぐに絞り込め る! アクセスログ → 通常ログ → エラーログまでが一 気通貫で見れる🎉 結果
HTTPメソッドやuser_idなどをログに入れておく と、 「概要欄にフィールドを追加」を押せば。。。 結果
結果 HTTPメソッドやuser_idなどをログに入れておく と、 「概要欄にフィールドを追加」を押せば。。。 一覧で見たときに、どんなリクエストが流れてき ているのかすぐわかる。
結果 user_idで絞り込むと、そのユーザーがこれまでに どんな操作をしたのかも一目瞭然!
目次 1. 自己紹介 2. 事例紹介 3. 問題点 4. 解決策 5.
slogの実装 6. 結果 7. まとめ
まとめ 「ただ出てるログ」に、もう少し向き合ってみて工夫すると、今までになかったことまで見 えるようになります。 fmt.Printlnやvar_dumpもいいけど、構造化ログもいいですよ!
まとめ 「ただ出てるログ」に、もう少し向き合ってみて工夫すると、今までになかったことまで見 えるようになります。 fmt.Printlnやvar_dumpもいいけど、構造化ログもいいですよ! 追えてなんぼのログに候