SlideShare a Scribd company logo
BOOST.LOGとFLUENTDで始めるログ活用術
Boost.勉強会#17@東京
Created by @termoshtt
自己紹介
大学院生(D3)
専攻= 流体数理(物理+ 応用数学)
シミュレーション= C++
データ解析= Python
CONTENTS
fluentd : ログ収集のための共通基盤
Boost.Logの構成と使い方
WHY DO WE NEED LOG?
一人で使う
時間のかかる処理の進捗
デバッグ
人の書いたコードを使う
FOR LIBRARIAN
問題が発生した事をユーザーに伝える
問題を解決するための情報を集める
FOR USER
発生した状況の情報を得る
開発者に問題を解決してもらうために情報を提供する
つまり人が目視で確認する
Boost.Logとfluentdで始めるログ活用術
FLUENTD
ログを集約するための共通フォーマット
リアルタイムにログを転送
FLUENTD
様々なログを収集するためのプラグイン
apache
syslog
...
様々なストレージに保存するためのプラグイン
elasticsearch
...
FLUENTD
標準出力としてのfluentd
UNIX的に解析ツールを組み合わせる事が可能
BOOST.LOGの使い方
BOOST.LOG
フル機能のロギングライブラリ
custom logger
log filtering
custom sink
Boost.Logとfluentdで始めるログ活用術
Boost.Logとfluentdで始めるログ活用術
ログの収集
名前空間/クラスにロガーを追加
namespace mod {
namespace logging = boost::log;
namespace log {
namespace attrs = logging::attributes;
namespace src = logging::sources;
}
using severity_level = logging::trivial::severity_level;
BOOST_LOG_INLINE_GLOBAL_LOGGER_DEFAULT(
logger, src::severity_logger_mt<severity_level>);
void init();
} // namespace mod
ログの収集
ロガー毎に属性を付与
namespace mod {
void init() {
auto &lg = logger::get();
lg.add_attribute("Tag", log::attrs::make_constant("mod"));
// lg.add_attribute("Tag", attrs::constant<std::string>("mod1"));
lg.add_attribute("Scope", log::attrs::named_scope());
}
} // namespace mod
ログの収集
属性のキーワードを登録
キーワードを用いて出力・フィルターを制御する
BOOST_LOG_ATTRIBUTE_KEYWORD(line_id, "LineID", unsigned int)
BOOST_LOG_ATTRIBUTE_KEYWORD(severity, "Severity", severity_level)
BOOST_LOG_ATTRIBUTE_KEYWORD(tag_attr, "Tag", std::string)
BOOST_LOG_ATTRIBUTE_KEYWORD(scope, "Scope", log::attrs::named_scope::value
ログの収集
出力時に情報を追加
namespace mod {
void func() {
BOOST_LOG_FUNCTION() // Scopeの値を設定(mod->func)
auto &lg = logger::get();
if (flag) {
BOOST_LOG_NAMED_SCOPE("true case"); // Scopeに入った事を記録する
BOOST_LOG_SEV(lg, severity_level::info) << "flag is true";
} else {
BOOST_LOG_NAMED_SCOPE("false case"); // Scopeに入った事を記録する
BOOST_LOG_SEV(lg, severity_level::info) << "flag is false";
}
BOOST_LOG_SEV(lg, severity_level::error) << "Some error occurs!!"
}
} // namespace mod
ログのフィルタリング
placeholderを使用する
logging::core::get()->set_filter(
logging::trivial::severity >= logging::trivial::info // lambda-exp.
);
ログのフィルタリング
fluentd以降で解析する以上、C++側でフィルターする
意義はあまりない
ログの出力
様々な出力形式に対応
/* 文字列フォーマット */
logging::add_file_log(
keywords::file_name = "client.log",
keywords::format =
"%Tag%: [%TimeStamp%] [%Scope%] %Message%"
);
/* lambda-style */
logging::add_file_log(
keywords::file_name = "stream_format.log",
keywords::format = (
expr::stream << mod::tag_attr << mod::line_id
<< ": <" << mod::severity << "> ["
<< mod::scope << "] "
<< expr::smessage
)
);
ログの出力
int main() {
init(); // いろいろ初期化
mod1::func1(true);
mod1::func1(false);
return 0;
}
mod: [2015-Mar-04 01:38:57.711251] [void mod::func(bool)->true case
mod: [2015-Mar-04 01:38:57.711620] [void mod::func(bool)] Some error occur
mod: [2015-Mar-04 01:38:57.711667] [void mod::func(bool)->false case
mod: [2015-Mar-04 01:38:57.711698] [void mod::func(bool)] Some error occur
ログの出力
どのようなフォーマットを使用するか?
LTSV (Labeled Tab-Separated Values)
damp/parseが簡単
属性を追加するのが簡単
型は無く、全て文字列
解析側で型を戻す必要がある
JSON
formatが少し面倒
ログの出力
typedef std::vector<std::pair<std::string, std::string> > Attrs;
void add_file_log(std::string filename, const Attrs &attr, bool auto_flush
std::stringstream ss;
for (auto &&pair : attr) {
const std::string &key = pair.first;
const std::string &val = pair.second;
if (!ss.str().empty())
ss << "t";
ss << key << ":%" << val << "%";
}
logging::add_file_log(
keywords::file_name = filename,
keywords::format = ss.str(),
keywords::auto_flush = auto_flush
);
}
ログの出力
デバッグ時に属性を追加するのが簡単
BOOST_LOG_SEV(lg, KSE::info)
<< "update infost"
<< "new_max_index:" << max_index << "t"
<< "step:" << (t / interval) << "t"
<< "count:" << count;
COMPILE WITH CMAKE
find_package(Boost COMPONENTS thread system log log_setup REQUIRED)
find_package(Threads)
add_definitions("-DBOOST_LOG_DYN_LINK")
macro(logged_executable name)
add_executable(${name} ${name}.cpp)
target_link_libraries(
${name}
${Boost_LIBRARIES}
${CMAKE_THREAD_LIBS_INIT}
${ARGN}
)
endmacro(logged_executable)
説明できなかった事
LTSVへの自動的なフォーマット
channel
fluentd側での解析例
BOOST.LOGを使いたい理由
Boostに入ってる
高機能
実行時のオーバーヘッドが小さい(未確認)
BOOST.LOGを使いたくない理由
placeholder難しい
コンパイル遅い
THE END
- Source codes (GitHub)
Boost.Logとfluentdで始めるログ活用術

More Related Content

PDF
開発速度が速い #とは(LayerX社内資料)
PPTX
本当は恐ろしい分散システムの話
PDF
明日使えないすごいビット演算
PDF
何となく勉強した気分になれるパーサ入門
PDF
.NET Core 3.0時代のメモリ管理
PDF
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
PDF
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
PDF
Dockerfileを改善するためのBest Practice 2019年版
開発速度が速い #とは(LayerX社内資料)
本当は恐ろしい分散システムの話
明日使えないすごいビット演算
何となく勉強した気分になれるパーサ入門
.NET Core 3.0時代のメモリ管理
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Dockerfileを改善するためのBest Practice 2019年版

What's hot (20)

PDF
例外設計における大罪
PDF
インフラエンジニアの綺麗で優しい手順書の書き方
PDF
Pythonによる黒魔術入門
PDF
組み込み関数(intrinsic)によるSIMD入門
PDF
今日からできる!簡単 .NET 高速化 Tips
PPTX
Docker Tokyo
PDF
ドメイン駆動設計 本格入門
PDF
組織にテストを書く文化を根付かせる戦略と戦術
PDF
15分でわかるGit入門
PPTX
競技プログラミングのためのC++入門
PDF
分散型IDと検証可能なアイデンティティ技術概要
PDF
TLS, HTTP/2演習
PDF
Marp Tutorial
PDF
簡易版AutoML+OptunaによるHyperparams Tuning
PDF
5分で分かるgitのrefspec
PDF
心理的安全性を 0から80ぐらいに上げた話
PDF
なかったらINSERTしたいし、あるならロック取りたいやん?
PDF
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
PDF
ドメインオブジェクトの見つけ方・作り方・育て方
PDF
みんなのPython勉強会#77 パッケージングしよう
例外設計における大罪
インフラエンジニアの綺麗で優しい手順書の書き方
Pythonによる黒魔術入門
組み込み関数(intrinsic)によるSIMD入門
今日からできる!簡単 .NET 高速化 Tips
Docker Tokyo
ドメイン駆動設計 本格入門
組織にテストを書く文化を根付かせる戦略と戦術
15分でわかるGit入門
競技プログラミングのためのC++入門
分散型IDと検証可能なアイデンティティ技術概要
TLS, HTTP/2演習
Marp Tutorial
簡易版AutoML+OptunaによるHyperparams Tuning
5分で分かるgitのrefspec
心理的安全性を 0から80ぐらいに上げた話
なかったらINSERTしたいし、あるならロック取りたいやん?
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
ドメインオブジェクトの見つけ方・作り方・育て方
みんなのPython勉強会#77 パッケージングしよう
Ad

Viewers also liked (8)

PDF
Boost Tour 1.53.0 merge
PDF
Boost study#4
PPTX
Pub/Sub model, msm, and asio
PDF
C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。
PDF
C++11やemscriptenと付き合って1年間の振り返り
PDF
Boost Tour 1.53.0
PDF
カスタムメモリマネージャと高速なメモリアロケータについて
PDF
Boost sg msgpack
Boost Tour 1.53.0 merge
Boost study#4
Pub/Sub model, msm, and asio
C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。
C++11やemscriptenと付き合って1年間の振り返り
Boost Tour 1.53.0
カスタムメモリマネージャと高速なメモリアロケータについて
Boost sg msgpack
Ad

Similar to Boost.Logとfluentdで始めるログ活用術 (14)

PDF
Big Data入門に見せかけたFluentd入門
PDF
fluentd を利用した大規模ウェブサービスのロギング
PDF
Fluentdのお勧めシステム構成パターン
PPTX
Fluentd+elasticsearch+kibana(fluentd編)
PPTX
それFluentdで! #fluentd
PPTX
PPTX
[デブサミ秋2015] 新卒入社エンジニアが 2年間fluentdを運用して学んだ事いろいろ
PPTX
Log collect with google fluentd
PDF
社内向けTech Talk資料~Fluentdの基本紹介~
PDF
Fluentdへようこそ
PDF
第二回IoT関連技術勉強会 ログ収集編
PDF
FluentdとGrothForecastをインストールする
PDF
Boost.PropertyMap (.pdf)
PPTX
Boost.PropertyMap (.pptx)
Big Data入門に見せかけたFluentd入門
fluentd を利用した大規模ウェブサービスのロギング
Fluentdのお勧めシステム構成パターン
Fluentd+elasticsearch+kibana(fluentd編)
それFluentdで! #fluentd
[デブサミ秋2015] 新卒入社エンジニアが 2年間fluentdを運用して学んだ事いろいろ
Log collect with google fluentd
社内向けTech Talk資料~Fluentdの基本紹介~
Fluentdへようこそ
第二回IoT関連技術勉強会 ログ収集編
FluentdとGrothForecastをインストールする
Boost.PropertyMap (.pdf)
Boost.PropertyMap (.pptx)

Boost.Logとfluentdで始めるログ活用術