Java 9の統合JVMロギング(Unified JVM Logging)とは?-Xlogオプションの使い方を徹底解説
Java 9では、JVM内部の各コンポーネントに対して共通のロギングシステムが提供されるようになりました。新しいコマンドラインオプション-Xlogを使うことで、すべてのロギング設定を一元的に管理でき、統合JVMロギング(Unified JVM Logging)は、複雑なシステムレベルのJVMコンポーネントに対する根本原因分析(RCA:Root Cause Analysis)を容易にする、設定しやすいツールとなっています。
-Xlogオプションの基本的なルール
コマンドラインオプション-Xlogは、JVMのすべてのロギングを制御するために使用できます。-Xlogの引数には、以下のルールが適用されます。
- 複数の引数を指定した場合、コマンドライン上に出現した順序で適用されます。
- 「最後の設定が優先」されるルール:同じ出力先に対して複数の引数を指定した場合、指定された順序で後の引数が前の引数を上書きします。
また、-Xlog:disableを指定すると、すべてのロギングが無効化され、ロギングフレームワークの設定全体(warningやerrorを含む)がクリアされます。
-Xlogの構文
-Xlog:tag[*][=level][:output:decoration:output-option],tag...
-Xlog:helpを実行すると、-Xlogの使用方法(構文)や利用可能なタグ、ログレベル、デコレータの一覧、さらにサンプルのコマンドラインが出力されます。
1) タグ(Tags)
ログメッセージが出力されるとき、JVM内の一連のタグ(例:os、gc、modulesなど)が関連付けられます。タグごとに個別の設定を適用でき、「*」はワイルドカードとして機能し、タグの部分一致を行います。
2) ログレベル(Levels)
ロギングは複数のレベルで実行できます。利用可能なレベルは、error、warning、info、debug、trace、developです。ロギングを無効化したい場合は、代わりにoffを使用します。
3) 出力先(Outputs)
出力先としてサポートされているのは、stdout(標準出力)、stderr(標準エラー出力)、テキストファイルの3種類です。ファイル出力の場合は、書き込みサイズやローテーションするファイル数に基づいたログファイルのローテーション設定も可能です。
4) デコレータ(Decorators)
メッセージに関する詳細情報を出力するための仕組みがデコレータです。主なデコレータは以下の通りです。
- time / timemillis / timenanos:現在の日時(ISO-8601形式)
- uptime / uptimemillis / uptimenanos:JVM起動からの経過時間
- pid:プロセス識別子
- tid:スレッド識別子
- level:ログメッセージに関連付けられたレベル
- tags:ログメッセージに関連付けられたタグ
-Xlog:help の実行例
C:\Program Files\Java\jdk-9.0.4\bin>java -Xlog:help -Xlog Usage: -Xlog[:[what][:[output][:[decorators][:output-options]]]] where 'what' is a combination of tags and levels of the form tag1[+tag2...][*][=level][,...] Unless wildcard (*) is specified, only log messages tagged with exactly the tags specified will be matched. Available log levels: off, trace, debug, info, warning, error Available log decorators: time (t), utctime (utc), uptime (u), timemillis (tm), uptimemillis (um), timenanos (tn), uptimenanos (un), hostname(hn), pid (p), tid (ti), level (l), tags (tg) Decorators can also be specified as 'none' for no decoration. Available log tags: add, age, alloc, aot, annotation, arguments, attach, barrier, biasedlocking, blocks, bot, breakpoint, census, class, classhisto, cleanup, compaction, constraints, constantpool, coops, cpu, cset, data, defaultmethods, dump, ergo, exceptions, exit, fingerprint, freelist, gc, hashtables, heap, humongous, ihop, iklass, init, itables, jni, jvmti, liveness, load, loader, logging, mark, marking, methodcomparator, metadata, metaspace, mmu, module, monitorinflation, monitormismatch, nmethod, normalize, objecttagging, obsolete, oopmap, os, pagesize, patch, path, phases, plab, promotion, preorder, protectiondomain, ref, redefine, refine, region, remset, purge, resolve, safepoint, scavenge, scrub, stacktrace, stackwalk, start, startuptime, state, stats, stringdedup, stringtable, stackmap, subclass, survivor, sweep, task, thread, tlab, time, timer, update, nload, verification, verify, vmoperation, vtables, workgang, jfr, system, parser, bytecode, setting, event Specifying 'all' instead of a tag combination matches all tag combinations. Described tag combinations: logging: Logging for the log framework itself Available log outputs: stdout, stderr, file= Specifying %p and/or %t in the filename will expand to the JVM's PID and startup timestamp, respectively. Some examples: -Xlog Log all messages using 'info' level to stdout with 'uptime', 'levels' and 'tags' decorations. (Equivalent to -Xlog:all=info:stdout:uptime,levels,tags). -Xlog:gc Log messages tagged with 'gc' tag using 'info' level to stdout, with default decorations. -Xlog:gc,safepoint Log messages tagged either with 'gc' or 'safepoint' tags, both using 'info' level, to stdout, with default decorations. (Messages tagged with both 'gc' and 'safepoint' will not be logged.)
まとめ
Java 9の統合JVMロギングは、従来バラバラだったJVM各コンポーネントのログ出力を、-Xlogという単一のオプションで一元管理できる強力な機能です。タグとログレベルを組み合わせることで必要な情報だけを絞り込め、出力先やデコレータも柔軟にカスタマイズできます。トラブルシューティングやパフォーマンス分析の際には、まず-Xlog:helpで利用可能なタグやレベルを確認しながら、目的に合った設定を試してみるとよいでしょう。
-
JavaのStringIndexOutOfBoundsExceptionとは?発生原因と対処法をわかりやすく解説
StringIndexOutOfBoundsExceptionとはJavaにおいて、文字列(String)は一連の文字を格納するために使用され、オブジェクトとして扱われます。文字列は、java.langパッケージに含まれるStringクラスによって表現されます。文字列の作成方法は主に2つあります。1つは他のオブジェクトと同様にnewキーワードを使用する方法、もう1つはプリミティブ型のようにリテラルを直接代入する方法です。String stringObject = new String(Hello how are you); String stringLiteral = Welcome to T
-
JavaのArrayIndexOutOfBoundsExceptionとは?発生原因と対処法を解説
配列とインデックスの基本 配列(Array)とは、同じ型の要素を固定サイズで順番に格納するためのデータ構造(コンテナ/オブジェクト)です。配列のサイズ(長さ)は生成時に決定され、後から変更することはできません。 配列内の各要素の位置は「インデックス(添字)」と呼ばれます。Javaの配列は0始まりのため、最初の要素はインデックス0、2番目の要素はインデックス1、というように順に番号が割り当てられます。 配列の各要素へは、「配列名[インデックス]」という形式の式を使ってアクセスします。 System.out.println(myArray[3]); // 1457 が出力される たとえばサイズ7