
2024.4.11公開のブログ「【SAP BTP】新サービス「SAP Cloud Logging Service」を使ってみた」では、SAP Cloud Logging Service(CLS)の概要とアプリケーションログの収集方法について解説しました。
今回からはCLSで何ができるのかということをより詳しく説明するために、実践編として、①アプリケーションログ収集の応用、②メトリクス収集、③データ活用の方法について3回に分けてご紹介させていただきます。
SAP Cloud Logging Service 関連ブログ
CLS関連のブログを以下の通り掲載しております。目的に応じてご参照ください。
- 【SAP BTP】新サービス「SAP Cloud Logging Service」を使ってみた
- 【SAP BTP】SAP Cloud Logging Service実践編 その1:アプリケーションログ収集の応用(本記事)
- 【SAP BTP】SAP Cloud Logging Service実践編 その2:メトリクス監視してみよう
- 【SAP BTP】SAP Cloud Logging Service実践編 その3:収集したデータを分析・ログを一元管理してみよう
前提条件

全体構成やCLSの構築については「【SAP BTP】新サービス「SAP Cloud Logging Service」を使ってみた」で解説した通りです。実践編では主に以下のポイントで解説します。
・ロギングフレームワークと組み合わせたログ出力とCLSへの送信(本記事で解説 ※上図の赤枠部分)
・OpenTelemetryを使用したメトリクスデータの収集(実践編その2で解説)
・ダッシュボードやアラート機能を使用したデータ活用(実践編その3で解説)
Cloud Logging Serviceのセットアップ
CLSの購入からセットアップについては前回の記事(「【SAP BTP】新サービス「SAP Cloud Logging Service」を使ってみた」)で紹介していますので、そちらの手順に沿って設定を行ってください。
【参照する手順】
・サービス追加
・インスタンス作成
・サービスキー作成
・アプリケーションの紐づけ
ロギングフレームワークの導入とログ出力
今回はJava用のフレームワークとしてLog4Jを導入したため、Log4Jでの導入手順をご紹介します。
Log4Jとは
Log4Jとは、Javaベースのアプリケーションで使用されるログ出力ライブラリです。
アプリケーションのログ出力処理をLog4Jで実装することにより、ログ内容をカスタマイズしてCloud Loggingに出力することができます。
設定手順
プログラム修正
ログの出力をLog4Jに切り替えるために、対象アプリケーションに修正を加えます。
対象のファイルは以下の通りです。
ファイル名 | パス | 役割 | 区分 | 補足 |
---|---|---|---|---|
log4j.xml | srv/src/main/resources | フォーマット・設定情報を定義 | 新規 | |
log4j.properties | srv/src/main/resources(ローカル) /home/vcap/app/BOOT-INF/classes/ (CF) | メッセージを定義 | 新規 | ローカル環境とCF環境ではクラスパスが異なるので注意 |
pom.xml | srv/ | log4j指定バージョンのインストールを定義 | 修正 | |
Logging.java | srv/src/main/ | 設定ファイルの読み込み/ログ出力 | 新規 | |
Application.java | srv/src/main/ | ・System.out.printlnをlog4jのログ出力に差し替え ・loggingメソッドにメッセージIDを引数で設定しログ出力処理を呼び出し | 修正 | |
その他使用中のjavaファイル | srv/src/main/handlers | ・System.out.printlnをlog4jのログ出力に差し替え ・loggingメソッドにメッセージIDを引数で設定しログ出力処理を呼び出し | 修正 |
①srv/src/main/java/jp/co/kyoso/demo/startprjCapに以下のようなLogging.javaファイルを作成します。
※package部分は対象環境に合わせて変更が必要です。
※例ではINFO、WARN、ERRORログの出力を想定して処理を記載しています。
▶Logging.javaのソース例はこちら
package jp.co.kyoso.demo.startprjCap;
import java.io.FileInputStream;
import java.io.InputStream;
import java.text.MessageFormat;
import java.util.Properties;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.RollingFileAppender;
import org.apache.log4j.xml.DOMConfigurator;
import org.apache.log4j.PropertyConfigurator;
public class Logging {
/** ロガー **/
private static Logger logger = Logger.getLogger(Logging.class);
/** プロパティ **/
private Properties p = new Properties();
/**
* コンストラクタ
* @throws Exception
*/
public Logging() throws Exception {
// log4j設定ファイル指定
System.setProperty("log4j.configuratorClass", "org.apache.log4j.xml.DOMConfigurator");
// プロパティ読み込み
final String messageFile = "/home/vcap/app/BOOT-INF/classes/log4j.properties";
InputStream messageInputStream = new FileInputStream(messageFile);
p.load(messageInputStream);
messageInputStream.close();
}
/**
* 通常ログ
* @param msgId メッセージID
* @param params パラメータ
*/
public void outLogInfo(String msgId, Object... params) {
outputLog(msgId, Level.INFO, null, params);
}
/**
* 警告ログ
* @param msgId メッセージID
* @param params パラメータ
*/
public void outLogWarn(String msgId, Object... params) {
outputLog(msgId, Level.WARN, null, params);
}
/**
* エラーログ
* @param msgId メッセージID
* @param cause スローされた例外
* @param params パラメータ
*/
public void outLogError(String msgId, Throwable cause, Object... params) {
outputLog(msgId, Level.ERROR, cause, params);
}
/**
* ログを出力
*/
private void outputLog(String msgId, Level level, Throwable cause, Object... params) {
String fmt = MessageFormat.format("{0} : {1}", msgId, p.getProperty(msgId));
String message = MessageFormat.format(fmt, (Object[]) params);
logger.log(Logging.class.getName(), level, message, cause);
}
}
②pom.xmlにLog4Jの設定を追加します。
※バージョンは対象環境に合わせて変更が必要です。
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
③srv/src/main/resourcesにlog4j.xmlを作成します。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" >
<!-- ログ出力 -->
<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d] [%-5p] [%C] [%t] - %m%n" />
</layout>
</appender>
<!-- ログレベル・出力先 -->
<root>
<level value="debug"/>
<appender-ref ref="stdout"/>
</root>
</log4j:configuration>
6~11行目でログの出力先や形式を設定します。今回は標準出力を使用するためConsoleAppenderを使用します。
7行目ではAppenderオプションのTargetを使用し、ログの出力先をSystem.outにすることで標準出力に設定しています。
9行目のvalue以降では出力パターンを記述しています。
現在記載している出力パターンのイメージと文字列の意味は以下の通りです。
[2024-03-13 10:23:16,640][INFO][jp.co.kyoso.demo.startprjCap.Application][main]-CommonInfo-001:Update dataset completed
パターン文字列 | 意味 | 例 |
[%d] | ログを生成した日付情報 | 2024-03-13 10:23:16,640 |
[%-5p] | ログレベルが左詰めで5文字分出力 | INFO+スペース1文字 |
[%C] | カテゴリ名 | jp.co.kyoso.demo.startprjCap.Application |
[%t] | ログを生成したスレッド名 | main |
– | 文字列‐を挿入 | – |
%m | ログメッセージ | CommonInfo-001:Update dataset completed |
%n | 改行を挿入する | 改行 |
④srv/src/main/resourcesにlog4j.propertiesを作成します。
CommonInfo-001 = Update dataset completed
CommonInfo-002 = Data update process completed
CommonInfo-003 = Data deletion process completed
CommonInfo-004 = API for acquiring all data
CommonInfo-005 = Search API
CommonWarn-001 = caution
CommonWarn-002 = warning
CommonError-001 = An error has occurred
CommonError-002 = failed
⑤Application.javaにログ出力用処理を追加し、System.out.printlnをlog4jでの出力(logging.();)に変更します。
▶追加するログ出力用処理はこちら
// ログ出力用処理
public static void logging(String param) {
try {
// ロガー初期化
Logging logging= new Logging();
// ログ出力
if (param.contains("Info")){
logging.outLogInfo(param);
}
else if(param.contains("Warn")){
logging.outLogWarn(param);
}
} catch (Exception e) {
}
}
// ログ出力用処理(Error)
public static void loggingError(String param,Throwable cause) {
try {
// ロガー初期化
Logging logging= new Logging();
// ログ出力
logging.outLogError(param,cause);
} catch (Exception e) {
}
}
// 全データ取得用API
// @RequestMapping(value = "/all", method = RequestMethod.GET)
@GetMapping("/getAll")
public ResponseEntity<Map<String, Object>> getAllData() {
String DESTINATION_NAME = "btp_to_sf_dev";
logging("CommonInfo-004");
//System.out.println("全データ取得用API");
⑥対象アプリケーションに現存する各Service.javaファイルも⑤のApplication.javaの変更と同様にSystem.out.printlnをlog4jでの出力に変更します。
デプロイ
修正後のアプリケーションプログラムをデプロイするために、ターミナルで以下のコマンドを実行します。
// 1.プログラムを実行可能なアプリケーションにパッケージ化
mbt build
// 2.対象の環境にログイン
cf login -a [APIエンドポイント(例: https://api.example.com)]
// 3.1で生成された.mtarファイルをデプロイする
cf deploy mta_archives/startprjCap_0.0.1.mtar
対象アプリケーション実行
デプロイしたアプリケーションにアクセスし、ログ出力対象の操作を行います。
今回はプログラム修正手順⑤で、Application.javaに全件取得をしたときにログ出力を行う処理を記載したため、アプリを起動して/getAllで初期データの全件取得を行います。
出力確認
OpenSearchにアクセスし、ログの出力を確認します。
※OpenSearchとは、検索および分析のためのオープンソースのソフトウェアスイートで、リアルタイムでのアプリケーションのモニタリングやログ分析が可能なサービスです。
OpenSearchへのアクセス方法については「【SAP BTP】新サービス「SAP Cloud Logging Service」を使ってみた」をご覧ください。
①OpenSearchにログイン後画像赤枠のDashboadsを押下します。

②ダッシュボートの一覧から「CF Requests and Logs」を選択します。
※「CF~」で始まるダッシュボートがCloud Foundry経由で収集されたログ用のダッシュボードです。

③Application Logsにて出力されたログを確認できます。

最後に
いかがでしたでしょうか?
上記の設定をすることでSAP Cloud Logging上で出力されたログデータを確認することができました。
SAP Cloud Loggingサービスは最近リリースしたばかりのサービスで、まだまだ情報が少なく、私自身導入する中でどのようなことができるのか、どのように設定したらいいのかわからない部分がたくさんありました。
本記事で解説した内容が、‟SAP Cloud Loggingで何ができる?”‟導入したいけれど設定方法が分からない!”という方のお役に立てたら嬉しいです。
次回は実践編②としてOpenTelemetryを利用したメトリクスの取得方法について解説します。
投稿者プロフィール

-
2023年にIT未経験で入社。
主にAWS、Vue.js、Javaを使用した開発を行っています。
最近はSAPサービスの調査やアプリ開発にも取り組んでいます。