Movatterモバイル変換


[0]ホーム

URL:


TM
Uploaded byTaku Miyakawa
PDF, PPTX78,740 views

Javaのログ出力: 道具と考え方

Concepts and tools of logging in Java.Javaにおけるログ出力の考え方と道具について説明.CC Attribution Licenseの元に公開します.

Embed presentation

Download as PDF, PPTX
Javaのログ出力: 道具と考え方2015-10-14 JJUGナイトセミナーハッシュタグ: #jjug宮川 拓
 @miyakawa_taku JJUG幹事 SI屋で賃労働 尾上部屋の里山関のファンです オレオレJVM言語Kinkを作っていますhttps://bitbucket.org/kink/kink自己紹介 #jjug2/67
#jjugログとは!例:$ kink -Vdebug -e ''2015-10-04 15:58:29 [main] DEBUG BoxingValues - use box proto listenerorg.kink_lang.kink.internal.eval.VarAssignEvaluator$VarAssignListener@3af49f1c2015-10-04 15:58:29 [main] DEBUG BoxingValues - use box proto listenerorg.kink_lang.kink.internal.eval.ArgsPassingEvaluator$ListAssignListener@1c20c6842015-10-04 15:58:29 [main] DEBUG BoxingValues - use box proto listenerorg.kink_lang.kink.internal.eval.ThenUtils$BoolThenListener@1218025c2015-10-04 15:58:29 [main] DEBUG BoxingValues - Setup prototype for java.lang.String2015-10-04 15:58:29 [main] DEBUG Modules - Load module _enhance/java/lang/Objectfrom org.kink_lang.kink.internal.box.ObjectEnhancer@5e8c92f42015-10-04 15:58:29 [main] INFO Definer -org.kink_lang.kink.internal.define.frequency_threshold=128...システムの状態を後から見られるように出力したテキスト3/67
なんで「ログ」って言うの?#jjug4/67
なんで「ログ」って言うの? #jjuglog = 丸太5/67
なんで「ログ」って言うの? #jjuglog = 船の速度標丸太 (log) を引っ張る綱の張りで船の速度を測った6/67
なんで「ログ」って言うの? #jjuglogbook = 航海日誌Photo by vxla, Licensed as CC BY 2.0, https://www.flickr.com/photos/vxla/5779530912/logで測った速度や方向などを帳面 (logbook) につける7/67
ログファイル= システムの航海日誌!#jjug8/67
セッション内容 #jjugなぜログ?ログの道具Javaのログ9/67
そもそも何のためにログを出すの?#jjug10/67
ログの主な目的 #jjug不具合解析のため来るべき故障の際に、原因となった不具合が突き止められるようにするため、システム稼働時の内部状態を記録する※本セッションで主に扱う監査のため認証・入出金・個人情報の利用など、残しておく必要のあるイベントの発生を記録する11/67
テストが完璧なら/デバッガがあればログがなくても不具合解析できる?#jjug12/67
#jjugvs テストテストとログは相補的な関係テストの領分 個別具体的な要件について不具合がないことを、ある程度保証する 個別を積み重ねて全体に近づくログの領分 しかし完璧なテストはなく、たぶん故障は起きる。起きた故障を解析するためにはログが必要 ログは、開発・テスト時にシステムの動きを把握するのにも有用13/67
#jjugvs デバッガデバッガとログも相補的な関係デバッガの領分 動作中のシステムの状態が閲覧・変更できるログの領分 過去のシステムの状態が閲覧できる 本番システムで利用できる 再現させるための条件が厳しかったり、不明だったりする故障について、故障発生前後の状況が追跡できる14/67
ログの目的まとめ#jjug15/67
#jjugログの目的 まとめログの目的は不具合解析/監査システムの過去の状態が分かるのが素敵不具合解析の手段として、テストやデバッガとは相補的な関係16/67
セッション内容 #jjugなぜログ?ログの道具Javaのログ17/67
#jjug問題設定ログを出すためにはどんな道具を使えばよいのでしょうか?18/67
#jjug標準エラーにログを出す?Unix由来の慣習では、ログは一般に標準エラー出力に書き出されます例:System.err.println("ひらく夢などあるじゃなし");しかし本格的なプログラムでは、標準エラーへの直接出力は力不足です19/67
ログの道具に必要な特性#jjug20/67
#jjugログの道具に必要な特性ログの各行がいつ、どこで出力されたか、文脈が分かるようにできる必要があるいつどこで日付時刻ファイル/行/クラス/メソッドスレッドHTTPセッション/リクエストこれら文脈が分かると不具合解析がはかどります21/67
#jjugログの道具に必要な特性一部のログ出力が抑止できる必要がある開発環境DEBUG doGet開始INFO 注文#42を閲覧DEBUG SELECT xxx FROM ...WARN Bobは注文#42を閲覧不可DEBUG doGet終了本番環境INFO 注文#42を閲覧WARN Bobは注文#42を閲覧不可ディスク領域節約・性能確保のため、重要でないログの出力を抑止することがあります22/67
#jjugログの道具に必要な特性その他 ログ出力先が簡単に切り替えられること ログローテーションできること 複数スレッドからログが出力できること ディスクまで確実に書き込むこと 速いこと 例外を投げないこと ……23/67
#jjugログの道具ログの道具の諸特性を提供するため、多くの言語は専用ライブラリを用意していますRuby logging添付ライブラリPython loggingモジュールJavaLog4j, java.util.logging,Commons Logging, SLF4J,Logback, JBoss Logging, Log4j2,....24/67
セッション内容 #jjugなぜログ?ログの道具Javaのログ25/67
#jjug問題次の中で役割が異るライブラリはどれでしょう?A) java.util.loggingB) Log4jC) LogbackD) SLF4J26/67
ログファサードライブラリログ出力ライブラリ#jjug解答SLF4Jは他のライブラリにログ出力を委譲するログファサードライブラリですA) java.util.loggingB) Log4jC) LogbackD) SLF4J27/67
ログ関連ライブラリの分類 #jjugログファサードライブラリログ出力ライブラリLog4jjava.util.loggingLogbackLog4j2Commons LoggingSLF4JJBoss Logging28/67
ログ出力の階層 #jjugアプリケーションログファサードライブラリログ出力ライブラリファイル/コンソール/...ど う 考 え て も本 質 的 に は 要 ら な い も のなぜこんなことになったのかそれを知るには歴史を紐解く必要があります29/67
Javaのログライブラリの歴史#jjug30/67
Javaのログライブラリの歴史 #jjug~1999 前史時代31/67
前史時代 #jjugApache Tomcat 3.0(最初期リリース)// org.apache.tomcat.core.ServletContextFacadepublic void log(String msg) {System.err.println(msg);}32/67
Javaのログライブラリの歴史 #jjug~19991999前史時代Log4jの登場33/67
Log4jの登場 #jjugimport org.apache.log4j.Logger;public class EchoServlet extends HttpServlet {private Logger logger = Logger.getLogger(getClass());protected void doGet(HttpServletRequest req, HttpServletResponse resp) {String text = req.getParameter("text");this.logger.info("テキスト: " + text);...}}Log4jを使うサーブレットの例:34/67
#jjugLog4jはすごい!ログライブラリの事実上の標準に しばらくはAvalon Logkitも有力だった後続のログ関連ライブラリはだいたいLog4jの機能を踏襲 階層化されたロガー ログ書き込みを行うアペンダ MDCによる文脈情報の保持35/67
#jjug階層化されたロガーロガーはドット区切りのロガー名で階層化されています ふつうはログ書き出し元のクラス名をそのままロガー名にします基本的に親の設定を継承します36/67
階層化されたロガー #jjugロ ガ ー org.kink_langレ ベ ル = WARNア ペ ン ダ =ConsoleAppenderorg.kink_lang.kinkレ ベ ル = DEBUGア ペ ン ダ =ConsoleAppender( 継 承 )org.kink_lang.kink.Valueレ ベ ル = DEBUG( 継 承 )ア ペ ン ダ =ConsoleAppender( 継 承 )+ RollingFileAppenderWARN, ERROR, FATAL のロ グ を コ ン ソ ー ル に 出 す加 え て DEBUG, INFO のロ グ も コ ン ソ ー ル に 出 すコ ン ソ ー ル に 加 え てフ ァ イ ル に も ロ グ を 出 す37/67
#jjugMDC実行時文脈の値を入れておくスレッドローカルなHashMapログ行の一部として出力できます有用な実行時文脈: セッションID, リクエストID テスト名38/67
#jjugMDC例: リクエストIDを設定するフィルタimport org.apache.log4j.MDC;public class PutRequestIdFilter implements Filter {public void doFilter (ServletRequest req, ServletResponse resp, FilterChain chain)throws IOException, ServletException {String reqId = UUID.randomUUID().toString();MDC.put("request", reqId);try {chain.doFilter(req, resp);} finally {MDC.remove("request");}}...}39/67
Javaのログライブラリの歴史 #jjug~199919992000前史時代Log4jの登場java.util.logging規格化開始40/67
#jjugjava.util.loggingLog4jを参考にJSR47として規格化→ 2002年のJ2SE 1.4に採用41/67
java.util.logging #jjugLog4jとだいたいおなじ!import java.util.logging.Logger;public class EchoServlet extends HttpServlet {private Logger logger= Logger.getLogger(getClass().getName());protected void doGet(HttpServletRequest req, HttpServletResponse resp) {String text = req.getParameter("text");this.logger.info("テキスト: " + text);...}} Log4j と の 差 分42/67
#jjugjava.util.loggingLog4jの牙城を崩すには至らず ログレベルが謎 SEVERE,WARNING,INFO,CONFIG,FINE,FINER,FINEST デフォルトの書式が扱いづらい ハンドラ(=アペンダ)の実装が不足 Java 1.3以前で使えない JVM全体で1つの設定しか持てない サーブレットコンテナ下で、各アプリケーションが個別のログ設定を持つための組み込みの方法がない43/67
Javaのログライブラリの歴史 #jjug~1999199920002001前史時代Log4jの登場java.util.logging規格化開始Commons Loggingの登場44/67
#jjugCommons Loggingの登場Commons HttpClientから派生したログファサードライブラリ HttpClientのような便利ライブラリが、特定のログ実装に依存するのはちょっと、という理由ではじまったLog4jやjava.util.loggingを切り替えて使えるようになる(はずだった)45/67
Commons Logging #jjugimport org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;public class EchoServlet extends HttpServlet {private Log logger = LogFactory.getLog(getClass());protected void doGet(HttpServletRequest req, HttpServletResponse resp) {String text = req.getParameter("text");this.logger.info("テキスト: " + text);...}}Log4jとだいたいおなじ!Log4j と の 差 分46/67
#jjugCommons Logging多くのライブラリ・フレームワークが採用していますでも正直イケていませんログ実装の選択方法がぶっ壊れているためです47/67
#jjugCommons Logging実現したかったこと(のひとつ)A P サ ー バ共 有 ラ イ ブ ラ リア プ リ Aア プ リ BCommons Loggingロ グ via Log4jロ グ via java.util.loggingログ実装の決定方法 Context Classloaderから始まって、親・祖先のクラスローダ内でアダプタクラスを探索 最初にみつかったアダプタを使う48/67
#jjugCommons Logging実際にはうまく行っていませんJava EEコンテナOSGiコンテナクラスローダ不一致によるNoClassDefFoundErrorの頻発→ アドホックな try-catchで対処動かすための設定が非直感的かつAPサーバごとに 異なるContext Classloaderを 使 っ て お ら ず 親 クラスローダへの委譲もない→ そもそも動かない動的探索という構想に無理がありました49/67
Javaのログライブラリの歴史 #jjug~19991999200020012005前史時代Log4jの登場java.util.logging規格化開始Commons Loggingの登場SLF4J / Logback50/67
#jjugSLF4J / LogbackLog4jの開発者Ceki Gülcüが、開発の遅延に愛想を尽かして立ち上げたプロジェクトSLF4JLogbackログファサードライブラリログ出力ライブラリSLF4Jと組み合わせて使う前提2015年現在のデファクトスタンダード51/67
SLF4J / Logback #jjugimport org.slf4j.Logger;import org.slf4j.LoggerFactory;public class EchoServlet extends HttpServlet {private Logger logger = LoggerFactory.getLogger(getClass());protected void doGet(HttpServletRequest req, HttpServletResponse resp) {String text = req.getParameter("text");this.logger.info("テキスト: {}", text);...}}やっぱりLog4jとだいたいおなじLog4j と の 差 分52/67
#jjugSLF4J特徴 クラス実体の差し替えによるアダプタの静的なバインディング 他のログファサード/ログ実装に流し込まれるログを乗っ取る仕組み53/67
#jjugSLF4J必要なJARslf4j-api-*.jarAPI(必須)ログ実装へのバインディング(どれか一個) logback-classic-*.jar (Logback)slf4j-log4j12-*.jar (Log4j)slf4j-jdk14-*.jar (java.util.logging)log4j-slf4j-impl-*.jar (Log4j2)両方のJARを同一のクラスローダが参照する場所に配置します54/67
#jjugSLF4J静的バインディングの中身LoggerFactoryアプリStaticLoggerBindergetLogger()getSingleton()バ イ ン デ ィ ン グ の J A R 内 に同 名 の ク ラ ス が そ れ ぞ れ 存 在slf4j-api-*.jarに存在55/67
#jjugSLF4J多くのライブラリはSLF4JではなくLog4jやCommons Loggingなどを叩いていますログ設定を統合するためには、これらをSLF4Jに横取りする必要があります56/67
#jjugSLF4Jログの横取りLog4jjava.util.loggingCommonsLogginglog4j-over-slf4j-*.jarLog4j と同名のクラスを提供実際には SLF4Jに流し込むjcl-over-slf4j-*.jarCommons Loggingと同名のクラスを提供実際には SLF4Jに流し込むjul-to-slf4j-*.jarSLF4Jに流し込むハンドラを提供slf4j-api-*.jarと同じ場所に配置します57/67
#jjugLogback独自のロガーインタフェースを持たず、SLF4J経由で呼び出します提供する機能 マーカー ログ行のラベル的なもの マーカー「 auth」がついてるログは auth.logに出す、みたいなことができます 設定のリロード アプリごとにログ出力先を分ける機能58/67
Javaのログライブラリの歴史 #jjug~19991999200020012005前史時代Log4jの登場java.util.logging規格化開始Commons Loggingの登場SLF4J / Logback2014 Log4j259/67
#jjugLog4j2Log4j 1.2系と互換性のない新しい実装機能・構成はLogbackに似ています60/67
Log4j2 #jjugimport org.apache.logging.log4j.Logger;import org.apache.logging.log4j.LogManager;public class EchoServlet extends HttpServlet {private Logger logger = LogManager.getLogger(getClass());protected void doGet(HttpServletRequest req, HttpServletResponse resp) {String text = req.getParameter("text");this.logger.info("テキスト: {}", text);...}}早い話がLog4jですLog4j と の 差 分61/67
結局なにを使えばいいの?#jjug62/67
#jjug使うべきログ関連ライブラリ共有ライブラリ SLF4Jにログを出す compileスコープではログ実装ライブラリに依存しない テストでは好みのログ実装を使うGradle dependencies:compile 'org.slf4j:slf4j-api:1.7.12'testCompile 'ch.qos.logback:logback-core:1.1.3'testCompile 'ch.qos.logback:logback-classic:1.1.3'63/67
#jjug使うべきログ関連ライブラリアプリケーション 基盤・ミドルウェアの制約しだい 制約がなければSLF4J+Logbackが無難 Log4j(1/2)やjava.util.loggingを直接叩くのも可ですが、あえてSLF4Jを避ける理由はなさそう64/67
Javaのログまとめ#jjug65/67
#jjugJavaのログ まとめ Log4jがJavaのログの道具立てを作った ロガー/アペンダ/MDC... ライブラリの依存性の都合からログファサードが生まれた SLF4Jを使っておけばとりあえずOK66/67
セッション内容 #jjugなぜログ?ログの道具Javaのログ67/67

Recommended

PDF
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
PDF
例外設計における大罪
PDF
Serverless時代のJavaについて
PDF
ヤフー社内でやってるMySQLチューニングセミナー大公開
PDF
入社1年目のプログラミング初心者がSpringを学ぶための手引き
PDF
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
PDF
怖くないSpring Bootのオートコンフィグレーション
PDF
PlaySQLAlchemy: SQLAlchemy入門
PDF
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
PPTX
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
PPTX
Metaspace
PDF
Dockerfile を書くためのベストプラクティス解説編
PDF
AngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
PDF
Spring Bootをはじめる時にやるべき10のこと
PDF
Dockerfileを改善するためのBest Practice 2019年版
PDF
Unified JVM Logging
PDF
マイクロサービス 4つの分割アプローチ
PDF
MySQL 5.7にやられないためにおぼえておいてほしいこと
PDF
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
PDF
Mavenの真実とウソ
PDF
Spring Boot × Vue.jsでSPAを作る
PPTX
さくっと理解するSpring bootの仕組み
PPT
Glibc malloc internal
PDF
そんなトランザクションマネージャで大丈夫か?
PDF
オンラインゲームの仕組みと工夫
PDF
イミュータブルデータモデル(世代編)
PDF
ストリーム処理を支えるキューイングシステムの選び方
PDF
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
PDF
金勘定のためのBigDecimalそしてMoney and Currency API

More Related Content

PDF
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
PDF
例外設計における大罪
PDF
Serverless時代のJavaについて
PDF
ヤフー社内でやってるMySQLチューニングセミナー大公開
PDF
入社1年目のプログラミング初心者がSpringを学ぶための手引き
PDF
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
PDF
怖くないSpring Bootのオートコンフィグレーション
PDF
PlaySQLAlchemy: SQLAlchemy入門
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
例外設計における大罪
Serverless時代のJavaについて
ヤフー社内でやってるMySQLチューニングセミナー大公開
入社1年目のプログラミング初心者がSpringを学ぶための手引き
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
怖くないSpring Bootのオートコンフィグレーション
PlaySQLAlchemy: SQLAlchemy入門

What's hot

PDF
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
PPTX
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
PPTX
Metaspace
PDF
Dockerfile を書くためのベストプラクティス解説編
PDF
AngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
PDF
Spring Bootをはじめる時にやるべき10のこと
PDF
Dockerfileを改善するためのBest Practice 2019年版
PDF
Unified JVM Logging
PDF
マイクロサービス 4つの分割アプローチ
PDF
MySQL 5.7にやられないためにおぼえておいてほしいこと
PDF
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
PDF
Mavenの真実とウソ
PDF
Spring Boot × Vue.jsでSPAを作る
PPTX
さくっと理解するSpring bootの仕組み
PPT
Glibc malloc internal
PDF
そんなトランザクションマネージャで大丈夫か?
PDF
オンラインゲームの仕組みと工夫
PDF
イミュータブルデータモデル(世代編)
PDF
ストリーム処理を支えるキューイングシステムの選び方
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
Metaspace
Dockerfile を書くためのベストプラクティス解説編
AngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
Spring Bootをはじめる時にやるべき10のこと
Dockerfileを改善するためのBest Practice 2019年版
Unified JVM Logging
マイクロサービス 4つの分割アプローチ
MySQL 5.7にやられないためにおぼえておいてほしいこと
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
Mavenの真実とウソ
Spring Boot × Vue.jsでSPAを作る
さくっと理解するSpring bootの仕組み
Glibc malloc internal
そんなトランザクションマネージャで大丈夫か?
オンラインゲームの仕組みと工夫
イミュータブルデータモデル(世代編)
ストリーム処理を支えるキューイングシステムの選び方

Viewers also liked

PDF
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
PDF
金勘定のためのBigDecimalそしてMoney and Currency API
PDF
Java SE 9の紹介: モジュール・システムを中心に
PPTX
ヒューレットパッカード社の 社員の離職リスク予測 第一回機械学習ビジネス研究会 #ml_business
PDF
擬似乱数生成器の評価
PPTX
失敗から学ぶ データ分析グループの チームマネジメント変遷
PDF
Kink: プロトタイプベースの俺々 JVM 言語
PDF
コルーチンの実装について
PDF
Java オブジェクトの内部構造
PDF
Prepare for Java 9 #jjug
PDF
Matrix Multiplication in Strassen Algorithm
PDF
Summary of "Hacking", 0x351-0x354
PDF
Kink: invokedynamic on a prototype-based language
PDF
#jjug_ccc #ccc_gh5 What's new in Spring Framework 4.3 / Boot 1.4 + Pivotal's ...
PDF
2015/10/14 JJUGナイトセミナー「テスト駆動開発ここが聞きたい」
PDF
Kink の宣伝
PDF
Hadoop jobbuilder
PDF
Quasar: Actor Model and Light Weight Threads on Java
PDF
深層学習フレームワーク Chainer の開発と今後の展開
PDF
Graph Algorithms Part 1
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
金勘定のためのBigDecimalそしてMoney and Currency API
Java SE 9の紹介: モジュール・システムを中心に
ヒューレットパッカード社の 社員の離職リスク予測 第一回機械学習ビジネス研究会 #ml_business
擬似乱数生成器の評価
失敗から学ぶ データ分析グループの チームマネジメント変遷
Kink: プロトタイプベースの俺々 JVM 言語
コルーチンの実装について
Java オブジェクトの内部構造
Prepare for Java 9 #jjug
Matrix Multiplication in Strassen Algorithm
Summary of "Hacking", 0x351-0x354
Kink: invokedynamic on a prototype-based language
#jjug_ccc #ccc_gh5 What's new in Spring Framework 4.3 / Boot 1.4 + Pivotal's ...
2015/10/14 JJUGナイトセミナー「テスト駆動開発ここが聞きたい」
Kink の宣伝
Hadoop jobbuilder
Quasar: Actor Model and Light Weight Threads on Java
深層学習フレームワーク Chainer の開発と今後の展開
Graph Algorithms Part 1

More from Taku Miyakawa

PDF
ラムダと invokedynamic の蜜月
PDF
言語設計者が意味論を書くときに考えていたこと
PDF
Kink: developing a programming language on the JVM
PDF
Java 7 invokedynamic の概要
PDF
Processing LTSV by Apache Pig
PDF
Java Quine Golf
ラムダと invokedynamic の蜜月
言語設計者が意味論を書くときに考えていたこと
Kink: developing a programming language on the JVM
Java 7 invokedynamic の概要
Processing LTSV by Apache Pig
Java Quine Golf

Javaのログ出力: 道具と考え方


[8]ページ先頭

©2009-2025 Movatter.jp