Java アプリケーションのランタイムログを Log4j2 で管理する場合、Log4j2 アペンダーまたは Logtail を使用して、それらのログを Simple Log Service に送信し、分析できます。
Log4j の概要
Log4j は Apache が提供するオープンソースプロジェクトです。Log4j を使用すると、コンソール、ファイル、GUI コンポーネント、Socket サーバー、Windows NT イベントログ、UNIX Syslog デーモンなど、ログの送信先を設定できます。また、各ログメッセージの出力フォーマットも制御可能です。さらに、各ログメッセージにログレベルを定義することで、ログ生成プロセスをより詳細に制御できます。これらの設定は、アプリケーションコードを変更することなく、構成ファイルで柔軟に設定できます。Log4j は以下の 3 つの重要なコンポーネントで構成されます。
-
レイアウト (Layouts)
レイアウトはログメッセージのフォーマットを定義します。以下の表に、一般的なレイアウトを示します。
レイアウト
説明
HTMLLayout
ログ出力を HTML テーブル形式でフォーマットします。
SimpleLayout
INFO レベルのメッセージに対するデフォルトフォーマットなど、シンプルな出力フォーマットを適用します。
PatternLayout
カスタムフォーマットでログを出力します。タイムスタンプ、ログレベル、スレッド名、クラス名、メソッド名、ログメッセージなどの要素の並び順およびフォーマットを指定できます。
-
アペンダー (Appenders)
アペンダーはログメッセージを送信先に送信します。複数のアペンダーを設定して、ログをさまざまな送信先に送信できます。以下の表に、一般的なアペンダーを示します。
アペンダー
説明
ConsoleAppender
ログをコンソールに出力します。
FileAppender
ログをファイルに出力します。
DailyRollingFileAppender
ログをファイルに出力し、毎日新しいファイルにローテーションします。
RollingFileAppender
ファイルサイズが指定値に達すると、Log4j がファイル名を変更して新しいファイルを作成します。
JDBCAppender
ログメッセージをデータベースに保存します。
-
ロガー (Loggers)
ロガーはログ情報を取得します。各ロガーには重要度または重大度に基づいてログレベルが割り当てられます。Log4j では、優先度の高い順に OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、ALL の 8 つのログレベルが定義されています。ログレベルは継承され、子ロガーは親ロガーのすべてのログレベルを継承します。以下の表に、各ログレベルの説明を示します。
ログレベル
説明
OFF
すべてのログ出力を無効化します。
FATAL
アプリケーションの終了を引き起こす重大なエラーを示します。
ERROR
アプリケーションの停止を引き起こさないエラーを示します。
WARN
潜在的なエラーを警告します。
INFO
アプリケーションの進行状況を高レベルで追跡します。
DEBUG
デバッグ用の詳細情報を提供します。
TRACE
変数値や実行フローなど、プログラム実行をトレースするための詳細情報を提供します。
ALL
すべてのログレベルを有効化します。
1 つのロガーに複数のアペンダーを関連付けることができますが、1 つのアペンダーは 1 つのレイアウトのみに関連付けられます。
前提条件
-
プロジェクトおよび Logstore を作成します。詳細については、「プロジェクトの管理」および「Logstore の管理」をご参照ください。
-
Alibaba Cloud アカウントではなく RAM ユーザーを使用する場合は、RAM ユーザーに Logstore への書き込み権限 を付与する必要があります。権限を付与するには、まず カスタムポリシーを作成 し、その後 RAM ユーザーへの権限付与 を実行します。
操作手順
本トピックでは、Java 言語および Log4j2 を例として説明します。C、C++、.NET、PL/SQL などの他の言語でも Log4j インターフェイスを使用できます。構文および使用方法は Java と同様です。
ステップ 1:Log4j2 の構成
-
Maven プロジェクトに必要な依存関係を追加します。
<dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.23.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.23.1</version> </dependency> </dependencies> -
構成ファイルを変更します。
デフォルトでは、Log4j2 はクラスパス内に構成ファイルを検索します。存在しない場合は、手動で作成する必要があります。以下の例は、コンソールおよび
app.logという名前のファイルの 2 つの送信先に出力するよう定義されたlog4j2.xmlファイルです。ルートロガーのログレベルはerrorに設定されており、コンソールに出力されます。また、com.example.demo.logという名前のロガーはtraceログレベルに設定され、ファイルに出力されます。Log4j2 の構成方法の詳細については、公式の Log4j 2 Configuration ドキュメントをご参照ください。<!-- status="WARN" は Log4j 2 自体の内部ステータスを設定します(アプリケーションのログ出力とは無関係)。構成処理中に発生する可能性のある問題をキャプチャおよび報告するために使用されます。 --> <Configuration status="WARN"> <!-- 2 つのログ出力先(Appenders)の定義開始 --> <Appenders> <!-- 標準システム出力(コンソール)にログを出力する "Console" という名前のコンソールアペンダーを定義します。 --> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss:SSS zzz} [%t] %-5level %logger{36} - %msg%n"/> </Console> <!-- "app.log" ファイルにログを出力する "MyFile" という名前のファイルアペンダーを定義します。 --> <File name="MyFile" fileName="app.log"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss:SSS zzz} [%t] %-5level %logger{36} - %msg%n"/> </File> </Appenders> <!-- 2 つのログ出力先(Appenders)の定義終了 --> <!-- ログ出力動作(Loggers)の構成開始 --> <Loggers> <!-- "com.example.demo.log" という名前のロガーを定義し、そのログレベルを "trace" に設定します。このロガーは "MyFile" アペンダーを参照しており、"trace" レベル以上のログをそのアペンダー("MyFile")に出力します。 --> <Logger name="com.example.demo.log" level="trace"> <AppenderRef ref="MyFile" /> </Logger> <!-- ルートロガーを定義し、そのログレベルを "error" に設定します。このロガーは "Console" アペンダーを参照しており、"error" レベル以上のログをコンソールに出力します。 --> <Root level="error"> <AppenderRef ref="Console" /> </Root> </Loggers> <!-- ログ出力動作(Loggers)の構成終了 --> </Configuration> -
基本的な使用方法です。
定義済みのアペンダーを読み込み、ログを出力するサンプルコードを記述します。
public void logExampleDemo() { // "com.example.demo.log" という名前の Logger インスタンスを取得します。 Logger logger = LogManager.getLogger("com.example.demo.log"); // 異なるレベルでログメッセージを記録します。 logger.trace("trace level"); logger.debug("debug level"); logger.info("info level"); logger.warn("warn level"); logger.error("error level"); logger.fatal("fatal level"); } -
以下のサンプルはログ出力結果を示しています。
2024-05-28 13:37:16:295 CST [http-nio-8080-exec-8] TRACE com.example.demo.log - trace level 2024-05-28 13:37:16:296 CST [http-nio-8080-exec-8] DEBUG com.example.demo.log - debug level 2024-05-28 13:37:16:296 CST [http-nio-8080-exec-8] INFO com.example.demo.log - info level 2024-05-28 13:37:16:296 CST [http-nio-8080-exec-8] WARN com.example.demo.log - warn level 2024-05-28 13:37:16:296 CST [http-nio-8080-exec-8] ERROR com.example.demo.log - error level 2024-05-28 13:37:16:296 CST [http-nio-8080-exec-8] FATAL com.example.demo.log - fatal level
ステップ 2:Log4j ログの収集
-
アプリケーションで既に Log4j2 を使用している場合、ログをディスクに書き込まずにリアルタイムで送信するようアペンダーを構成できます。
-
Logtail は、サーバーにインストールしてファイルからログを収集するエージェントです。また、さまざまな処理プラグインをサポートします。
Log4j2 アペンダー
-
Maven プロジェクトに必要な依存関係を追加します。
<dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>2.5.0</version> </dependency> <dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>aliyun-log-log4j2-appender</artifactId> <version>0.1.12</version> </dependency> -
構成ファイルを変更します。
以下の例では、
log4j2.xmlという名前の XML 構成ファイルを使用します。ファイルが存在しない場合は、プロジェクトのルートディレクトリに作成してください。Loghub アペンダーおよびロガーを構成します。<Appenders> <Loghub name="Loghub" project="your project" logStore="your logStore" endpoint="your project endpoint" accessKeyId="your accessKey id" accessKeySecret="your accessKey secret" totalSizeInBytes="104857600" maxBlockMs="0" ioThreadCount="8" batchSizeThresholdInBytes="524288" batchCountThreshold="4096" lingerMs="2000" retries="10" baseRetryBackoffMs="100" maxRetryBackoffMs="100" topic="your topic" source="your source" timeFormat="yyyy-MM-dd'T'HH:mmZ" timeZone="UTC" ignoreExceptions="true"> <PatternLayout pattern="%d %-5level [%thread] %logger{0}: %msg"/> </Loghub> </Appenders> <Loggers> <Root level="warn"> <AppenderRef ref="Loghub"/> </Root> </Loggers>project、logStore、endpoint、accessKeyId、accessKeySecretの各パラメーターは必須です。オプションのパラメーターは、指定がない場合デフォルト値が使用されます。以下の表に各パラメーターの説明を示します。パラメーター
説明
project
Simple Log Service プロジェクトの名称です。
logStore
Simple Log Service の Logstore の名称です。
endpoint
Simple Log Service のパブリックエンドポイントです。詳細については、「エンドポイント」をご参照ください。
accessKeyId
AccessKey ID です。取得方法については、「AccessKey ペアの作成」をご参照ください。
accessKeySecret
AccessKey シークレットです。取得方法については、「AccessKey ペアの作成」をご参照ください。
-
サンプルコードです。
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class Log4j2AppenderExample { private static final Logger LOGGER = LogManager.getLogger(Log4j2AppenderExample.class); public static void main(String[] args) throws InterruptedException { LOGGER.trace("log4j2 trace log"); LOGGER.debug("log4j2 debug log"); LOGGER.info("log4j2 info log"); LOGGER.warn("log4j2 warn log"); LOGGER.error("log4j2 error log", new RuntimeException("Runtime Exception")); Thread.sleep(1000 * 5); } }
Logtail
Logtail を構成する際には、ファイルパスを指定する必要があります。アプリケーションがログファイルにログを書き込めるようにしてください。
Elastic Compute Service (ECS) インスタンスと Simple Log Service プロジェクトが同一アカウントおよび同一リージョンにある場合は、「サーバーからのテキストログの収集」をご参照ください。その他のシナリオについては、「サーバーからのテキストログ収集のための Logtail の手動インストール」をご参照ください。
ステップ 3:ログの確認
Simple Log Service コンソール にログインします。
Projects セクションで、目的のプロジェクトをクリックします。

タブで、目的の Logstore をクリックします。

-
ログデータが正常にアップロードされていることを確認します。Logstore 内で、「検索および分析のクイックスタート」をご参照のうえ、消費プレビュー をクリックして、ログを素早く表示します。

-
ログのクエリおよび分析を行います。
クエリ文を入力し、時間範囲(例:過去 15 分間)を選択します。 以下のサンプルはログエントリを示しています。
level: ERROR location: com.aliyun.openservices.log.log4j.example.Log4jAppenderExample.main(Log4jAppenderExample.java:16) message: error log throwable: java.lang.RuntimeException: xxx thread: main time: 2018-01-02T03:15+0000 log: 0 [main] ERROR com.aliyun.openservices.log.log4j.example.Log4jAppenderExample - error log __source__: xxx __topic__: yyyLogstore ページでログのクエリおよび分析を行います。

クエリ文を入力して、ログデータの表示、検索、フィルター処理が可能です。詳細については、「ログのクエリおよび分析」をご参照ください。以下に簡単なクエリ文の例を示します。
-
過去 1 時間におけるエラー数が最も多い上位 3 つの場所を検索します。
level: ERROR | select location ,count(*) as count GROUP BY location ORDER BY count DESC LIMIT 3 -
過去 15 分間における各ログレベルのログ数をカウントします。
| select level ,count(*) as count GROUP BY level ORDER BY count DESC
-
関連トピック
-
Logtail を使用してサーバーからログを収集する方法については、「サーバーからのテキストログの収集」をご参照ください。さまざまなプラグインから選択できます。詳細については、「プラグインを使用したデータ処理」をご参照ください。
-
Logtail の構成後にデータが表示されない場合は、「Logtail ログ収集エラーのトラブルシューティング」を参照してトラブルシューティングを行ってください。一般的な問題には、正規表現の失敗、不適切なファイルパス、シャード容量の超過などがあります。具体的な収集エラーは、「Logtail 収集エラーの表示」の手順に従って確認するか、データ収集の一般的なエラー の一覧を参照してください。
-
Log4j2 アペンダーを使用した Log4j ログ収集のユースケースおよびよくある質問 (FAQ) については、「Log4j2 Appender」をご参照ください。以前のバージョンについては、「Log4j Appender」をご参照ください。
-
Log4j2 アペンダーを使用するには、AccessKey ID、AccessKey シークレット、およびエンドポイントが必要です。これらの取得方法については、「AccessKey ペアの作成」および「エンドポイント」をご参照ください。