SlideShare a Scribd company logo
1 of 36
Download to read offline
Loggerの
構造と拡張
Genki Sugawara
Elixir Meetup #1 in Drecom
お前誰よ
• twitter: @sgwr_dts
• github/bitbicket: winebarrel
• インフラまわりのお仕事やってます
• RubyとかAWSとか
• Elixirレベル: たまねぎ剣士
事の始まり
• mariaex
• MariaDB/MySQLのクライアント
{:ok, p} = Mariaex.Connection.start_link(
username: "ecto", database: "ecto_test")
rs = Mariaex.Connection.query(
p, "SELECT id, title FROM test1")
事の始まり
• 接続時のエラーをハンドルしたい
• ユーザ名・パスワードの間違い
• DB名の間違い…etc
事の始まり
start_linkでのエラー時に{:error, _}が返ってくるので
ハンドルしてみる
# mariaex: v0.4.3
_pid = case Mariaex.Connection.start_link(username: "ecto", database: "ecto_test") do
{:ok, pid} -> pid
{:error, err} ->
IO.puts err.mariadb.message
exit(1)
end
事の始まり
!?
事の始まり
handle_otp_reportsをfalseにしてみる
config :logger, handle_otp_reports: false
事の始まり
!?
事の始まり
• handle_otp_reportsをfalseにするとErlangのエラーハンドラ
が有効になる
• …仕方ないのでLoggerのソースコードを読むことに
Logger
• http://elixir-lang.org/docs/stable/logger/Logger.html
• https://github.com/elixir-lang/elixir/tree/master/lib/logger
• 標準ライブラリではない?ビルトインのロギングモジュール
Logger
mixでプロジェクトを作ると、デフォルトで起動
defmodule Hoge.Mixfile do
use Mix.Project
# ...
def application do
[applications: [:logger],
mod: {Hoge, []}]
end
Logger
mixでプロジェクトを作ると、デフォルトで起動
defmodule Hoge.Mixfile do
use Mix.Project
# ...
def application do
[applications: [:logger],
mod: {Hoge, []}]
end
Logger
こんな感じでコンソールにログ出力
iex(1)> require Logger
nil
iex(2)> Logger.info "oops"
:ok
18:45:59.211 [info] oops
Supervision Tree
Logger.App (supervisor: rest_for_one)
+ Logger.Watcher (worker①)
| + Logger.Watcher (supervisor: simple_one_for_one)
| + Logger.Watcher (worker②)
+ Logger.Watcher (worker③)
Supervision Tree
[worker(GenEvent, [[name: Logger]]),
worker(Logger.Watcher, [Logger, Logger.Config, []],
[id: Logger.Config, function: :watcher]),
supervisor(Logger.Watcher, [Logger.Config, :handlers, []]),
worker(Logger.Watcher,
[:error_logger, Logger.ErrorHandler,
{otp_reports?, sasl_reports?, threshold}, :link],
[id: Logger.ErrorHandler, function: :watcher])]
Logger.App
• アプリケーションモジュール
• プロジェクト開始時にLogger.App.start()を実行
Logger.Watcher
• supervisor兼worker
• GenEvent(name: Logger)のmonitor
• GenEventにハンドラを登録
• 再起動戦略のためにsupervisor化?
Logger.Watcher
# mod: GenEvent(Logger)
def init({mod, handler, args, :monitor}) do
ref = Process.monitor(mod)
res = GenEvent.add_mon_handler(mod, handler, args)
do_init(res, mod, handler, ref)
end
def init({mod, handler, args, :link}) do
res = :gen_event.add_sup_handler(mod, handler, args)
do_init(res, mod, handler, nil)
end
Handlers
• GenEventのハンドラ
• handle_event()でログ出力(とか)を行う
Handlers
以下のような感じで、
イベントハンドラにメッセージが送られる
Logger.info(msg)
-> Logger.bare_log(msg)
-> Logger.notify(msg)
-> GenEvent.notify(Logger, msg)
Handlers
• Logger.Watcher worker①
• → Logger.Config
• Logger.Watcher worker②
• → Logger.Backends.Consoleとか
• Logger.Watcher worker③
• → Logger.ErrorHandler
Logger.Config
• log levelやmodeなどの設定を保持
• なんでイベントをハンドルしてんの?
• → sync/asyncを変更するため
Logger.Config
:sync_threshold - if the Logger manager has more than
sync_threshold messages in its queue, Logger will change to sync
mode, to apply backpressure to the clients.
• ログメッセージのイベントを受信
• → メッセージキューの長さをみて動的に同期・非同期を変更
Logger.Backends.Console
• コンソールに出力するBackend
• ログ出力先(Backend)の一実装
• ビルトインで実装されているのはこれだけ
Logger.Backends.Console
設定の:consoleはLogger.Backends.Consoleに変換される
カスタムバックエンドはモジュールを渡す必要がある
config :logger, backends: [:console] # デフォルト値
def translate_backend(:console), do: Logger.Backends.Console
def translate_backend(other), do: other
Logger.ErrorHandler
• ErlangのOTP/SASLのエラーログをハンドル
Logger.ErrorHandler
そもそもErlangのOTP/SASLのエラーはハンドルされてるっぽい
• :error_logger
• http://www.erlang.org/doc/man/error_logger.html
以下のハンドラがデフォルトで追加されている
• error_logger_tty_h
• sasl_logger_tty_h
OTPのエラーハンドリング
ErrorHandler追加時の動作:
handle_otp_reports: trueの場合
• error_loggerからerror_logger_tty_hを削除
• GenEventにErrorHandlerを追加
• state: otp: true
OTPのエラーハンドリング
ErrorHandler追加時の動作:
handle_otp_reports: falseの場合
• error_loggerの操作は行わない
• GenEventにErrorHandlerを追加
• state: otp: false
OTPのエラーハンドリング
handle_otp_reportsがtrue/falseに関わらず
Logger.ErrorHandlerには
OPTのエラーイベント(error_report等)は飛んでくる
ただし、state: otp: trueの場合、ログ出力し
state: otp: falseの場合はログ出力しない
OTPのエラーハンドリング
結果として
• handle_otp_reports: true
• ErrorHandler: ログ出力あり (state: otp: trueのため)
• error_logger: ログ出力なし (ハンドラが削除されているため)
• handle_otp_reports: false
• ErrorHandler: ログ出力なし (state: otp: falseのため)
• error_logger: ログ出力あり (ハンドラがそのままのため)
OTPエラー出力の抑止
config :logger, handle_otp_reports: false
# 手動でerror_loggerからハンドラを削除
:error_logger.delete_report_handler(:error_logger_tty_h)
# mariaex: v0.4.3
_pid = case Mariaex.Connection.start_link(username: "ecto", database: "ecto_test") do
{:ok, pid} -> pid
{:error, err} ->
IO.puts err.mariadb.message
exit(1)
end
おまけ: 雑カスタムBackend
defmodule MyBackend do
use GenEvent
def init(__MODULE__) do
init({:user, []})
end
def init({device, _opts}) do
config = Application.get_env(:logger, :my_backend, [])
format = Keyword.get(config, :format) |> Logger.Formatter.compile
level = Keyword.get(config, :level, :info)
metadata = Keyword.get(config, :metadata, [])
{:ok, %{format: format, metadata: metadata,
level: level, colors: %{}, device: device}}
end
おまけ: 雑カスタムBackend
def handle_call({:configure, _options}, state) do
{:ok, :ok, state}
end
def handle_event({_level, gl, _event}, state)
when node(gl) != node() do
{:ok, state}
end
def handle_event({level, _gl, {Logger, msg, _ts, _md}}, state) do
IO.inspect [level, msg]
{:ok, state}
end
end
おまけ: 雑カスタムBackend
config :logger, backends: [MyBackend]
$ mix run test.exs
[:info, "hello"]
以上です
ご静聴ありがとうございました

More Related Content

What's hot

Docker+CoreOS+GCEで自動スケール分散レイトレ
Docker+CoreOS+GCEで自動スケール分散レイトレDocker+CoreOS+GCEで自動スケール分散レイトレ
Docker+CoreOS+GCEで自動スケール分散レイトレ
peryaudo
 
Pythonユーザのための構成管理入門 #pyconapac
Pythonユーザのための構成管理入門 #pyconapacPythonユーザのための構成管理入門 #pyconapac
Pythonユーザのための構成管理入門 #pyconapac
Takeshi Komiya
 

What's hot (20)

Docker+CoreOS+GCEで自動スケール分散レイトレ
Docker+CoreOS+GCEで自動スケール分散レイトレDocker+CoreOS+GCEで自動スケール分散レイトレ
Docker+CoreOS+GCEで自動スケール分散レイトレ
 
Kubernetes helm & helmc
Kubernetes helm & helmcKubernetes helm & helmc
Kubernetes helm & helmc
 
もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境
もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境
もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境
 
Vagrant で PHP 開発環境を作る ハンズオン
Vagrant で PHP 開発環境を作る ハンズオンVagrant で PHP 開発環境を作る ハンズオン
Vagrant で PHP 開発環境を作る ハンズオン
 
Scala on Hadoop
Scala on HadoopScala on Hadoop
Scala on Hadoop
 
serverspecを使用したサーバ設定テストの実例
serverspecを使用したサーバ設定テストの実例serverspecを使用したサーバ設定テストの実例
serverspecを使用したサーバ設定テストの実例
 
はじめての Gatling
はじめての Gatlingはじめての Gatling
はじめての Gatling
 
Puppet on AWS
Puppet on AWSPuppet on AWS
Puppet on AWS
 
Ansible ではじめるインフラのコード化入門
Ansible ではじめるインフラのコード化入門Ansible ではじめるインフラのコード化入門
Ansible ではじめるインフラのコード化入門
 
当社のawsへの取組
当社のawsへの取組当社のawsへの取組
当社のawsへの取組
 
Vagrant環境のAnsibleを速くしたい
Vagrant環境のAnsibleを速くしたいVagrant環境のAnsibleを速くしたい
Vagrant環境のAnsibleを速くしたい
 
Leap MotionとLambdaで「第九」を鳴らしてみる
Leap MotionとLambdaで「第九」を鳴らしてみるLeap MotionとLambdaで「第九」を鳴らしてみる
Leap MotionとLambdaで「第九」を鳴らしてみる
 
ビルドサーバで使うDocker
ビルドサーバで使うDockerビルドサーバで使うDocker
ビルドサーバで使うDocker
 
Using Windows Azure
Using Windows AzureUsing Windows Azure
Using Windows Azure
 
サバカン屋のサバ缶はre:Inventで通用したのか&すぐに使える!最新運用ネタ #re:Port2016
サバカン屋のサバ缶はre:Inventで通用したのか&すぐに使える!最新運用ネタ #re:Port2016サバカン屋のサバ缶はre:Inventで通用したのか&すぐに使える!最新運用ネタ #re:Port2016
サバカン屋のサバ缶はre:Inventで通用したのか&すぐに使える!最新運用ネタ #re:Port2016
 
Amazon ECS事始め
Amazon ECS事始めAmazon ECS事始め
Amazon ECS事始め
 
成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略
 
MHA on AWS+Rails
MHA on AWS+RailsMHA on AWS+Rails
MHA on AWS+Rails
 
Pythonユーザのための構成管理入門 #pyconapac
Pythonユーザのための構成管理入門 #pyconapacPythonユーザのための構成管理入門 #pyconapac
Pythonユーザのための構成管理入門 #pyconapac
 
Ansible roleとinventoryの書き方
Ansible roleとinventoryの書き方Ansible roleとinventoryの書き方
Ansible roleとinventoryの書き方
 

Viewers also liked (14)

ゴシッププロトコルによる冗長化と負荷分散の検証
ゴシッププロトコルによる冗長化と負荷分散の検証ゴシッププロトコルによる冗長化と負荷分散の検証
ゴシッププロトコルによる冗長化と負荷分散の検証
 
20111012 jaws ug-tokyo勉強会-cookpad-on-aws
20111012 jaws ug-tokyo勉強会-cookpad-on-aws20111012 jaws ug-tokyo勉強会-cookpad-on-aws
20111012 jaws ug-tokyo勉強会-cookpad-on-aws
 
200k/sec
200k/sec200k/sec
200k/sec
 
クックパッドの開発について
クックパッドの開発についてクックパッドの開発について
クックパッドの開発について
 
Gitを使ったRoute53の管理
Gitを使ったRoute53の管理Gitを使ったRoute53の管理
Gitを使ったRoute53の管理
 
20140930 anything as_code
20140930 anything as_code20140930 anything as_code
20140930 anything as_code
 
EC2の天井を超える
EC2の天井を超えるEC2の天井を超える
EC2の天井を超える
 
2014 09-23 Mechanism of Gossip protocol
2014 09-23 Mechanism of Gossip protocol2014 09-23 Mechanism of Gossip protocol
2014 09-23 Mechanism of Gossip protocol
 
EC2でkeepalived+LVS(DSR)
EC2でkeepalived+LVS(DSR)EC2でkeepalived+LVS(DSR)
EC2でkeepalived+LVS(DSR)
 
CloudWatch Logsについて
CloudWatch LogsについてCloudWatch Logsについて
CloudWatch Logsについて
 
Lambdaによるクラウド型言語の実装
Lambdaによるクラウド型言語の実装Lambdaによるクラウド型言語の実装
Lambdaによるクラウド型言語の実装
 
ナウなヤングにCloud Formationが流行ってほしい
ナウなヤングにCloud Formationが流行ってほしいナウなヤングにCloud Formationが流行ってほしい
ナウなヤングにCloud Formationが流行ってほしい
 
SQLによるDynamoDBの操作
SQLによるDynamoDBの操作SQLによるDynamoDBの操作
SQLによるDynamoDBの操作
 
ChefとPuppetの比較
ChefとPuppetの比較ChefとPuppetの比較
ChefとPuppetの比較
 

Similar to Elixir Meetup #1 Loggerの構造と拡張

fluentd を利用した大規模ウェブサービスのロギング
fluentd を利用した大規模ウェブサービスのロギングfluentd を利用した大規模ウェブサービスのロギング
fluentd を利用した大規模ウェブサービスのロギング
Yuichi Tateno
 
Programming Hive Reading #3
Programming Hive Reading #3Programming Hive Reading #3
Programming Hive Reading #3
moai kids
 
実録!Railsのはまりポイント10選
実録!Railsのはまりポイント10選実録!Railsのはまりポイント10選
実録!Railsのはまりポイント10選
Drecom Co., Ltd.
 
Firefoxの開発プロセス
Firefoxの開発プロセスFirefoxの開発プロセス
Firefoxの開発プロセス
Makoto Kato
 
WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterWTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniter
Masanori Oobayashi
 
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14
Masahiro Nagano
 
スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門
Hisashi HATAKEYAMA
 
C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努
Insight Technology, Inc.
 

Similar to Elixir Meetup #1 Loggerの構造と拡張 (20)

fluentd を利用した大規模ウェブサービスのロギング
fluentd を利用した大規模ウェブサービスのロギングfluentd を利用した大規模ウェブサービスのロギング
fluentd を利用した大規模ウェブサービスのロギング
 
Tottoruby 20110903
Tottoruby 20110903Tottoruby 20110903
Tottoruby 20110903
 
Haikara
HaikaraHaikara
Haikara
 
Web技術勉強会23回目
Web技術勉強会23回目Web技術勉強会23回目
Web技術勉強会23回目
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platform
 
社内向けTech Talk資料~Fluentdの基本紹介~
社内向けTech Talk資料~Fluentdの基本紹介~ 社内向けTech Talk資料~Fluentdの基本紹介~
社内向けTech Talk資料~Fluentdの基本紹介~
 
Play framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレードPlay framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレード
 
RoRとAWSで100,000Req/Minを処理する
RoRとAWSで100,000Req/Minを処理するRoRとAWSで100,000Req/Minを処理する
RoRとAWSで100,000Req/Minを処理する
 
Programming Hive Reading #3
Programming Hive Reading #3Programming Hive Reading #3
Programming Hive Reading #3
 
activerecord-turntable
activerecord-turntableactiverecord-turntable
activerecord-turntable
 
実録!Railsのはまりポイント10選
実録!Railsのはまりポイント10選実録!Railsのはまりポイント10選
実録!Railsのはまりポイント10選
 
Firefoxの開発プロセス
Firefoxの開発プロセスFirefoxの開発プロセス
Firefoxの開発プロセス
 
恋に落ちるデプロイツール
恋に落ちるデプロイツール恋に落ちるデプロイツール
恋に落ちるデプロイツール
 
#logstudy 01 rsyslog入門
#logstudy 01 rsyslog入門#logstudy 01 rsyslog入門
#logstudy 01 rsyslog入門
 
WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterWTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniter
 
Rails3.2ってどう変わるの?
Rails3.2ってどう変わるの?Rails3.2ってどう変わるの?
Rails3.2ってどう変わるの?
 
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14
 
スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門スマートフォン向けサービスにおけるサーバサイド設計入門
スマートフォン向けサービスにおけるサーバサイド設計入門
 
C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努
 
〜Apache Geode 入門 gfsh によるクラスター構築・管理
〜Apache Geode 入門 gfsh によるクラスター構築・管理〜Apache Geode 入門 gfsh によるクラスター構築・管理
〜Apache Geode 入門 gfsh によるクラスター構築・管理
 

Recently uploaded

Recently uploaded (11)

論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 

Elixir Meetup #1 Loggerの構造と拡張