Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
slogパッケージの深掘り
Search
やーびー
July 09, 2025
Programming
900
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
slogパッケージの深掘り
DMM.go #10登壇資料
やーびー
July 09, 2025
More Decks by やーびー
See All by やーびー
30msの広告配信を支える レイテンシ短縮の技術
integral0515
0
370
range over funcで始めるグラフアルゴリズム
integral0515
0
400
Other Decks in Programming
See All in Programming
Materialが消えた日 〜真っ白なFlutterキャンバスにRenderObjectで絵を描く〜
umigishiaoi
0
120
TanStack Vue Query と Pinia Colada から学ぶ非同期状態の型設計
aoshi
0
490
現場と育てるRailsモデリング 〜Spreadsheetから始めたモデル設計〜
siroemk
2
1.1k
AI Augmentation Techniques with Liberty
ivargrimstad
0
190
AIが生成したコードは読むべきか?抽象化設計とコードの品質保証 / abstraction-design-and-quality
minodriven
12
7.8k
Seven New Principles of Software Engineering
yegor256
0
390
AI時代のシニアエンジニアとは
yosuke_furukawa
PRO
12
11k
そのデザイントークン、Flutterでも同じ見た目になりますか?
nakamizu
0
140
dotNET_vulnclicker_intro.pdf
deka_morita
0
160
複雑なUIコンポーネントとの ⻑い付き合い⽅:波及するバグからテスト戦略を経て、安全な再設計へ
mixplace
0
490
當我們開始不讀 Code - AI Agent 時代,Code Review 與 Clean Code 還剩下什麼?
jame2408
1
350
学びを記事・スライド・Xへ高速展開する― AI-assisted Learning Loopで回すコンテンツ生成術
ochtum
0
170
Featured
See All Featured
Ethics towards AI in product and experience design
skipperchong
2
450
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.9k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Fireside Chat
paigeccino
43
4.1k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
470
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
2
2.9k
A Modern Web Designer's Workflow
chriscoyier
699
190k
Deep Space Network (abreviated)
tonyrice
0
390
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
460
Transcript
slogパッケージの深掘り DMM.go #10 屋比久怜央
自己紹介 2 屋比久怜央 やびくれお 名前 開発統括本部 マーケティングテクノロジー部 所属 ビリヤード・リアル脱出ゲーム 趣味
今回のテーマ 3 slog
slogとは 4 logに続いて、go 1.21で追加された標準ライブラリ 誕生の経緯 structured logging(構造化ログ)の略 timestamp, severity, key-valueなどの小さなデータの集合
名称の由来
皆さんに覚えて帰って欲しいこと 5 1. slogには3種類のHandlerが用意されている 2. slogはgoroutineセーフ 3. バッファ管理にsync.Poolが利用されている
6 slogには3種類のHandlerが利用されている
Handlerとは 7 Handlerを付け替えて、出力形式を変える Handlerの役割 • DefaultHandler • TextHandler • JSONHander
Handlerの種類
DefaultHandler 8 2025/05/06 18:46:02 ERROR error 実装例 出力例
TextHandler 9 time=2025-05-06T18:49:30.543+09:00 level=ERROR msg=error 実装例 出力例
JSONHandler 10 {"time":"2025-05-06T18:31:28.471417+09:00","level":"ERROR"," msg":"error"} 実装例 出力例
Handlerによる出力の比較 11 2025/05/06 18:46:02 ERROR error time=2025-05-06T18:49:30.543+09:00 level=ERROR msg=error {"time":"2025-05-06T18:31:28.471417+09:00",
"level":"ERROR","msg":"error"} DefaultHandler TextHandler JSONHandler
皆さんに覚えて帰って欲しいこと 12 1. slogには3種類のHandlerが用意されている 2. slogはgoroutineセーフ 3. バッファ管理にsync.Poolが利用されている 再掲
13 slogはgoroutineセーフ
goroutineとは 14 複数のgoroutineを発行すると、並行処理を行うことができる 複数の処理を並行して実行できる 概要 実行イメージ API呼び出し API呼び出し 2つのレスポンスを 利用した処理
goroutineとは 15 実装例 count! count! count!
goroutineセーフとは 16 複数のgoroutineから呼び出した時に、処理が競合しないこと 概要 • 変数の値を更新する時 • 文字列を出力する時 考慮すべきタイミング slogの性能に関わる
goroutineセーフじゃない例 17 どのような不都合が発生するのかを確認する目的で、 異なるgoroutineから呼ばれうることを考慮せずに実装した 雑logを自作してみる 受け取った文字列を、既定のio.Writerに書き込むだけのLogger 5個のgoroutineから並行にログ出力を呼び出す 方針
goroutineセーフじゃない例 18 実装 HellHello HeHeollWorlld Woor Wo! ldrl! d!Hlo elWo
rldlo! World! 出力
slogなら大丈夫 19 実装 time=2025-05-07T11:41:10.632+09:00 level=INFO msg="Hello World!" time=2025-05-07T11:41:10.632+09:00 level=INFO msg="Hello
World!" time=2025-05-07T11:41:10.632+09:00 level=INFO msg="Hello World!" time=2025-05-07T11:41:10.632+09:00 level=INFO msg="Hello World!" time=2025-05-07T11:41:10.632+09:00 level=INFO msg="Hello World!" 出力
slogはgoroutineセーフ - 内部実装 20 異なるgoroutineからほぼ同時に呼び出されることが想定されている 具体的には、ログの書き込み処理にロックがかけられている なぜslogでは問題が発生しないのか h.mu.Lock() defer h.mu.Unlock()
_, err := h.w.Write(*state.buf) slogのソースコードより抜粋 1 3 2 他のgoroutineからの書き込みを制限 ログを書き込む 他のgoroutineに、書き込みを解放
slogはgoroutineセーフ 21 Goでは、goroutineによって並行処理を実現することができる まとめ ただ文字列を出力するだけだと、異なるgoroutine間でほぼ同時にロ グを出力した時に、出力が重なり合う 場合がある しかし、slogはロックの機構を適切に実装しているのでgoroutineを 意識せずに 利用することができる
皆さんに覚えて帰って欲しいこと 22 1. slogには3種類のHandlerが用意されている 2. slogはgoroutineセーフ 3. バッファ管理にsync.Poolが利用されている 再掲
23 バッファ管理にsync.Poolが利用されている
バッファ管理に sync.Poolが利用されている 24 • バッファとは • sync.Poolとは • slogにsync.Poolを用いる目的 この章で話すこと
バッファ管理に sync.Poolが利用されている 25 • バッファとは • sync.Poolとは • slogにsync.Poolを用いる目的 この章で話すこと
バッファとは 26 I/O(読み取り・書き込み)処理がボトルネックになるのを防ぐ 広い意味でのバッファの用途 1. 小さいデータをいくつか出力する時に、まとめてI/O 2. 大きいデータを出力する時に、分割してI/O バッファの種類
小さいデータをまとめて I/O 27 バッファを利用しない場合 バッファを利用した場合 aaa bbb ccc 書き込み 書き込み
書き込み 標準 出力 aaa bbb ccc 一時保存 一時保存 一時保存 標準 出力 バッファ 書き込み 時間のかかるI/O処理を 何度も実行するため 効率が悪い
大きいデータを分割して I/O 28 バッファを利用しない場合 バッファを利用した場合 書き込み 一時保存 標準 出力 バッファ
一度のI/O処理に 時間がかかるため 効率が悪い 長い文章 hogehoge hogehoge 標準 出力 書き込み 書き込み 書き込み 長い文章 hogehoge hogehoge
slogにおけるバッファとは 29 slogにおいては、前者を指している つまり、小さいデータをいくつか出力する時に、まとめてI/Oすること slogにおけるバッファの役割 timestamp, severity, key-valueなどの小さなデータの集合がログである つまり、小さなデータをまとめて出力することになる structured
loggingとの相性が良い
バッファ管理に sync.Poolが利用されている 30 • バッファとは • sync.Poolとは • slogにsync.Poolを用いる目的 この章で話すこと
sync.Poolとは 31 再利用されるオブジェクトを効率的に使い回す仕組み オブジェクトの初期化処理が重い時に効果を発揮する 概要 利用方法のイメージ sync.Pool オブジェクト オブジェクト オブジェクト
オブジェクト オブジェクト オブジェクトを利用 関数A オブジェクトを利用 関数B
バッファ管理に sync.Poolが利用されている 32 • バッファとは • sync.Poolとは • slogにsync.Poolを用いる目的 この章で話すこと
slogにおけるsync.Pool 33 標準パッケージのbytesなどを使うことなく、 sync.Poolを利用した独自のバッファを実装している slog独自のバッファ ログ出力の度にバッファを用意するのは非効率 バッファを使い回すことで、大量のログ出力を捌けるようになる sync.Poolによる効率化
バッファ管理に sync.Poolが利用されている - まとめ 34 小さいデータをいくつか出力する時に、まとめてI/Oする仕組み バッファとは 再利用されるオブジェクトを使い回す仕組み sync.Poolとは 出力用のバッファを頻繁に使い回す効率を上げるため
slogにsync.Poolを用いる目的
皆さんに覚えて帰って欲しいこと 35 1. slogには3種類のHandlerが用意されている 2. slogはgoroutineセーフ 3. バッファ管理にsync.Poolが利用されている 再掲
ご清聴ありがとうございました! 36