Log4j2 を使用して Java アプリケーションの操作ログを記録および管理した後、Log4j2 アペンダーまたは Logtail を使用してログを Simple Log Service に収集し、後続のクエリと分析を行うことができます。
Log4j の概要
Apache Log4j は、ログ出力先をコンソール、ファイル、GUI コンポーネント、ソケットサーバー、NT イベントレコーダー、または UNIX Syslog デーモンに構成できるオープンソースプロジェクトです。 Apache Log4j では、各ログの出力フォーマットを設定し、各ログのレベルを定義して、ログ生成をより詳細に管理することもできます。前述の機能を構成するには、構成ファイルを使用するだけで済みます。アプリケーションコードを変更する必要はありません。Log4j は、次の主要コンポーネントで構成されています。
レイアウト
レイアウトは、ログを特定のフォーマットにフォーマットするために使用されます。次の表は、一般的なレイアウトについて説明しています。
レイアウト
説明
HTMLLayout
ログを HTML テーブルとしてフォーマットします。
SimpleLayout
ログを INFO レベルログなどのシンプルなフォーマットにフォーマットします。
PatternLayout
ログをカスタムフォーマットで出力します。タイムスタンプ、ログレベル、スレッド名、クラス名、メソッド名、ログデータなどの要素の配置とフォーマットを指定できます。
アペンダー
アペンダーは、ログの出力先を定義するために使用されます。複数のアペンダーを構成して、ログを異なる出力先に送信できます。次の表は、一般的なアペンダーについて説明しています。
アペンダー
説明
ConsoleAppender
ログをコンソールに出力します。
FileAppender
ログをファイルに出力します。
DailyRollingFileAppender
ログを毎日新しいファイルに出力します。
RollingFileAppender
ログを特定のサイズのファイルに出力します。ファイルが指定されたサイズに達すると、システムは自動的にファイルの名前を変更し、新しいファイルを生成します。
JDBCAppender
ログをデータベースに保存します。
ロガー
ロガーは、ログのエントリポイントを定義し、ログ情報をキャプチャするために使用されます。各ロガーには、その重要度または重大度に基づいてログレベルが割り当てられます。 Log4j は、OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、および ALL(優先順位の高い順にリストされています)のログレベルを定義しています。ログレベルは継承できます。子クラスは、親クラスのすべてのログレベルを記録します。次の表は、ログレベルについて説明しています。
ログレベル
説明
OFF
すべてのログを無効にします。
FATAL
アプリケーションの終了を引き起こす可能性のあるエラーイベントを示します。
ERROR
システムの実行に影響を与えないエラーイベントを示します。
WARN
潜在的なエラーを示します。
INFO
アプリケーションの実行に焦点を当てています。ほとんどの場合、このログレベルは、ログが粗粒度で管理されるシナリオで使用されます。
DEBUG
診断を容易にします。ほとんどの場合、このログレベルはアプリケーションのデバッグシナリオで使用されます。
TRACE
プログラムの実行中に変数を出力し、実行プロセスを表示します。このログレベルは、プログラムをトレースするために使用されます。
ALL
すべてのログを出力します。
1 つのロガーは複数のアペンダーに対応できます。1 つのアペンダーは 1 つのレイアウトのみに対応できます。
前提条件
プロジェクトとログストアが作成されていること。詳細については、「プロジェクトを作成する」および「ログストアを作成する」をご参照ください。
Alibaba Cloud アカウントではなく RAM (Resource Access Management) ユーザーを使用する場合、RAM ユーザーには 特定のログストアにデータを書き込む権限が必要です。権限を付与するには、最初に カスタムポリシーを作成し、次に RAM ユーザーに権限を付与します。
手順
このトピックでは、例として Java と Log4j2 を使用しています。 C、C++、.NET、PL/SQL など、他のプログラミング言語のプログラムにも Log4j を使用できます。他のプログラミング言語のプログラムで Log4j を使用する構文と方法は、Java プログラムで Log4j を使用する構文と方法と同じです。
ステップ 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.xml ファイルに 2 つのアペンダーが定義されています。アペンダーは、それぞれログを Simple Log Service コンソールと app.log ファイルに出力するために使用されます。ルートロガーのログレベルは ERROR として定義され、ログは Simple Log Service コンソールに出力されます。 com.example.demo.log という名前のロガーのログレベルは WARN として定義され、ログは app.log ファイルに出力されます。 Log4j2 の構成方法の詳細については、「Log4j - Configuring Log4j 2 (apache.org)」をご参照ください。
!" -- status="WARN". Log4j2 の内部ステータス。このパラメーターは、構成中の潜在的な問題をキャプチャして報告するためには使用されません。 --> <Configuration status="WARN"> <! -- 2 つのアペンダーを定義する 開始 --> <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> <! -- MyFile という名前のアペンダーを定義して、ログを app.log ファイルに出力します。 --> <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 つのアペンダーを定義する 終了 --> <!-- ロガーを構成する 開始 --> <Loggers> <! -- com.example.demo.log という名前のロガーを定義し、ログレベルを TRACE に設定します。 com.example.demo.log ロガーは MyFile アペンダーを参照します。ロガーは、レベルが TRACE 以上のログを MyFile アペンダーに出力します。 --> <Logger name="com.example.demo.log" level="warn"> <AppenderRef ref="MyFile" /> </Logger> <!-- ルートロガーを定義し、ログレベルを ERROR に設定します。ルートロガーは Console アペンダーを参照します。ロガーは、レベルが ERROR 以上のログを Simple Log Service コンソールに出力します。 --> <Root level="error"> <AppenderRef ref="Console" /> </Root> </Loggers> <!-- ロガーを構成する 終了 --> </Configuration>ログの出力を開始します。
定義されたアペンダーを読み取ってログを出力するテストコードを記述します。サンプルコード:
public void logExampleDemo() { // com.example.demo.log という名前のロガーを取得します。 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 ログを Simple Log Service に収集する
Log4j2 アペンダーは、Log4j2 の組み込みログ収集方法です。 Log4j2 と統合されているアプリケーションの場合、簡単な構成を実行するだけで、アペンダーを起動してログをリアルタイムで送信できます。 Log4j2 アペンダーは、大量のログデータをリアルタイムで処理する必要があるシナリオに適しています。
Logtail を使用してログを収集するには、サーバーに Logtail コンポーネントをインストールする必要があります。 Logtail コンポーネントは、複数の処理プラグインをサポートしています。
Log4j2 アペンダーを使用して Log4j ログを収集する
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="ご使用のプロジェクト" logStore="ご使用のログストア" endpoint="ご使用のプロジェクトエンドポイント" accessKeyId="ご使用の AccessKey ID" accessKeySecret="ご使用の AccessKey シークレット" totalSizeInBytes="104857600" maxBlockMs="0" ioThreadCount="8" batchSizeThresholdInBytes="524288" batchCountThreshold="4096" lingerMs="2000" retries="10" baseRetryBackoffMs="100" maxRetryBackoffMs="100" topic="ご使用のトピック" 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 ログストアの名前。
endpoint
Simple Log Service のパブリックエンドポイント。エンドポイントの取得方法については、「エンドポイント」をご参照ください。
accessKeyId
AccessKey ID。 AccessKey ID の取得方法については、「AccessKey ペアを作成する」をご参照ください。
accessKeySecret
AccessKey シークレット。 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 を使用して Log4j ログを収集する
Logtail を構成する際には、ファイルパスを指定する必要があります。アプリケーションログがログファイルに正しく書き込まれることを確認してください。
Simple Log Service は、Logtail の構成に役立つ構成ウィザードを提供しています。Elastic Compute Service (ECS) インスタンスと Simple Log Service プロジェクトが同じアカウントとリージョンにある場合は、「ホストテキストログ収集 (自動インストール)」をご参照ください。そうでない場合は、「ホストテキストログ収集 (手動インストール)」をご参照ください。
ステップ 3: ログを表示する
Simple Log Service コンソール にログオンします。
[プロジェクト] セクションで、管理するプロジェクトをクリックします。

タブで、管理するログストアをクリックします。

ログがログストアにアップロードされているかどうかを確認します。ログストアで ログクエリと分析のガイド。次に、[消費プレビュー] をクリックしてログを表示します。

ログのクエリと分析
重要ログがログストアにアップロードされた後、ログをクエリおよび分析するには、インデックスを作成する必要があります。詳細については、「インデックスを作成する」をご参照ください。インデックスの作成方法については、「インデックスを作成する」をご参照ください。
検索ボックスにクエリ文を入力し、[過去 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__: yyyログストアページでログのクエリと分析を行います。

クエリ文を入力して、ログデータの表示、検索、フィルタリングを行うことができます。詳細については、「ログのクエリと分析」をご参照ください。次の文は例として提供されています。
過去 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 を使用してログを収集すると、エラーが発生する場合があります。たとえば、正規表現が解析に失敗したり、無効なファイルパスが存在したり、トラフィックがシャードの処理能力を超えたりする場合があります。 Logtail 収集エラーは、「Logtail 収集エラーを表示するにはどうすればよいですか?」の指示に従って表示できます。データ収集における一般的なエラーについては、「Simple Log Service がログを収集するときに発生する可能性のある一般的なエラーをトラブルシューティングするにはどうすればよいですか?」をご参照ください。
Log4j2 アペンダーを使用して Log4j ログを収集する場合のユースケースとよくある質問 (FAQ) については、「Log4j2 Appender」をご参照ください。 Log4j2 より前の Log4j バージョンを使用して Log4j ログを収集する場合のユースケースと FAQ については、「Log4j Appender」をご参照ください。
Log4j2 アペンダーを使用して Log4j ログを収集する場合は、AccessKey ペアを構成する必要があります。 AccessKey ペアの取得方法については、「AccessKey ペアを作成する」をご参照ください。 Simple Log Service によって提供されるエンドポイントの構成方法については、「エンドポイント」をご参照ください。