/** * personium.io * Copyright 2014 FUJITSU LIMITED * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.fujitsu.dc.core; import java.text.MessageFormat; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.fujitsu.dc.core.DcCoreMessageUtils.Severity; /** * ログメッセージ作成クラス. */ public final class DcCoreLog { static Logger log = LoggerFactory.getLogger(DcCoreLog.class); /** * OData関連. */ public static class OData { /** * 主キーでの検索で1件のみ取得できるはずの場所で2件以上のデータが返ってきた. * {0}:ヒット件数 */ public static final DcCoreLog FOUND_MULTIPLE_RECORDS = create("PL-OD-0001"); /** * バルクデータ登録で異常. */ public static final DcCoreLog BULK_INSERT_FAIL = create("PL-OD-0002"); /** * プロパティ名の重複を検出した. */ public static final DcCoreLog DUPLICATED_PROPERTY_NAME = create("PL-OD-0003"); } /** * WebDAV関連. */ public static class Dav { /** * Roleが見つからなかったとき. * {0}:詳細メッセージ */ public static final DcCoreLog ROLE_NOT_FOUND = create("PL-DV-0001"); /** * Rangeヘッダ指定誤り. * {0}:詳細メッセージ */ public static final DcCoreLog REQUESTED_RANGE_NOT_SATISFIABLE = create("PL-DV-0002"); /** * Rangeヘッダ指定のファイル読み飛ばし失敗. */ public static final DcCoreLog FILE_TOO_SHORT = create("PL-DV-0003"); /** * バイナリデータの削除に失敗. * {0}:バイナリデータのUUID */ public static final DcCoreLog FILE_DELETE_FAIL = create("PL-DV-0004"); } /** * 認証関連. */ public static class Auth { /** * トークンのパースに失敗した時. * {0}:詳細メッセージ */ public static final DcCoreLog TOKEN_PARSE_ERROR = create("PL-AU-0001"); /** * トークンの署名検証エラー. * {0}:詳細メッセージ */ public static final DcCoreLog TOKEN_DISG_ERROR = create("PL-AU-0002"); /** * ルートCA証明書設定エラー. * {0}:詳細メッセージ */ public static final DcCoreLog ROOT_CA_CRT_SETTING_ERROR = create("PL-AU-0003"); /** * 最終ログイン時刻の更新時にAccountが存在しない場合. * {0}:詳細メッセージ */ public static final DcCoreLog ACCOUNT_ALREADY_DELETED = create("PL-AU-0004"); /** * 対応するアカウントが存在したが、指定されたGrantTypeに対応していない. * {0}:詳細メッセージ */ public static final DcCoreLog UNSUPPORTED_ACCOUNT_GRANT_TYPE = create("PL-AU-0005"); } /** * OIDC認証関連. */ public static class OIDC { /** * 対応するアカウントが存在しない. * {0}:詳細メッセージ */ public static final DcCoreLog NO_SUCH_ACCOUNT = create("PL-OI-0001"); /** * 対応するアカウントが存在したが、指定されたGrantTypeに対応していない. * {0}:詳細メッセージ */ public static final DcCoreLog UNSUPPORTED_ACCOUNT_GRANT_TYPE = create("PL-OI-0002"); /** * リクエストユーザーとIDTokenのユーザーが一致しない. * {0}:詳細メッセージ */ public static final DcCoreLog INVALID_ACCOUNT = create("PL-OI-0003"); /** . * IssuerがGoogleではない * {0}:詳細メッセージ */ public static final DcCoreLog INVALID_ISSUER = create("PL-OI-0004"); } /** * サーバ内部エラー. * サーバ側の障害やバグにより処理を続行できないときに投げる. 問題の原因を表すようなものとする。 基本的にののカテゴリの例外発生時にはWARN以上のログ出力となる */ public static class Server { /** * Adsへマスタデータ作成に失敗. * {0}:詳細メッセージ */ public static final DcCoreLog DATA_STORE_ENTITY_CREATE_FAIL = create("PL-SV-0001"); /** * Adsへマスタデータ更新に失敗. * {0}:詳細メッセージ */ public static final DcCoreLog DATA_STORE_ENTITY_UPDATE_FAIL = create("PL-SV-0002"); /** * Adsへマスタデータ削除に失敗. * {0}:詳細メッセージ */ public static final DcCoreLog DATA_STORE_ENTITY_DELETE_FAIL = create("PL-SV-0003"); /** * memcachedのポート番号フォーマットエラー. * {0}:詳細メッセージ */ public static final DcCoreLog MEMCACHED_PORT_FORMAT_ERROR = create("PL-SV-0004"); /** * memcachedへの接続に失敗. * {0}:ホスト名 * {1}:ポート名 * {2}:詳細メッセージ */ public static final DcCoreLog MEMCACHED_CONNECTO_FAIL = create("PL-SV-0005"); /** * memcachedへのcache設定失敗. * {0}:詳細メッセージ */ public static final DcCoreLog MEMCACHED_SET_FAIL = create("PL-SV-0006"); /** * memcachedへのcacheクリアー失敗. * {0}:詳細メッセージ */ public static final DcCoreLog MEMCACHED_CLEAR_FAIL = create("PL-SV-0007"); /** * memcachedへのcache削除失敗. * {0}:詳細メッセージ */ public static final DcCoreLog MEMCACHED_DELETE_FAIL = create("PL-SV-0008"); /** * AdsへBulkでのマスタデータ作成に失敗. * {0}:詳細メッセージ */ public static final DcCoreLog DATA_STORE_ENTITY_BULK_CREATE_FAIL = create("PL-SV-0009"); /** * RDBへの接続失敗. * {0}:詳細メッセージ */ public static final DcCoreLog RDB_CONNECT_FAIL = create("PL-SV-0010"); /** * SQL実行エラー. * {0}:詳細メッセージ */ public static final DcCoreLog EXECUTE_QUERY_SQL_FAIL = create("PL-SV-0011"); /** * RDBとの切断失敗. * {0}:詳細メッセージ */ public static final DcCoreLog RDB_DISCONNECT_FAIL = create("PL-SV-0012"); /** * ADSへの接続失敗. * {0}:詳細メッセージ */ public static final DcCoreLog ADS_CONNECTION_ERROR = create("PL-SV-0013"); /** * ElasticSearchのインデックスが存在しない. * {0}:インデックス名 */ public static final DcCoreLog ES_INDEX_NOT_EXIST = create("PL-SV-0014"); /** * Adsの作成に失敗. * {0}:インデックス名 */ public static final DcCoreLog FAILED_TO_CREATE_ADS = create("PL-SV-0015"); /** * JDBCに対して実行するSQL文をログに出力. * {0}:実行したSQL文 */ public static final DcCoreLog JDBC_EXEC_SQL = create("PL-SV-0016"); /** * サーバ起動失敗. */ public static final DcCoreLog FAILED_TO_START_SERVER = create("PL-SV-0017"); /** * JDBCに対して実行するユーザODataのSQL実行をログに出力. * {0}:DB名 * {1}:テーブル名 * {2}:id * {3}:タイプ * {4}:Cellのid * {5}:Boxのid * {6}:Nodeのid * {7}:EntityTypeのid */ public static final DcCoreLog JDBC_USER_ODATA_SQL = create("PL-SV-0018"); /** * ReferenceOnlyロックを設定した. * {0}:キー名 */ public static final DcCoreLog SET_REFERENCE_ONLY_LOCK = create("PL-SV-0019"); /** * Adsエラー時のリペア用ログの書込みに失敗. */ public static final DcCoreLog WRITE_ADS_FAILURE_LOG_ERROR = create("PL-SV-0020"); /** * Adsエラー時のリペア用ログに書込む情報. * {0}:ログ情報 */ public static final DcCoreLog WRITE_ADS_FAILURE_LOG_INFO = create("PL-SV-0021"); } /** * ElasticSearch. */ public static class Es { /** * ESへの接続が完了した. * {0}:接続ノードアドレス */ public static final DcCoreLog CONNECTED = create("PL-ES-0001"); /** * ESへのリクエストが完了した. * {0}:インデックス名 * {1}:タイプ名 * {2}:ノード名 * {3}:リクエストクエリ * {4}:ESへのリクエストタイプ * {3}と{4}の出力順は逆になる */ public static final DcCoreLog AFTER_REQUEST = create("PL-ES-0002"); /** * インデックスを作成. * {0}:インデックス名 */ public static final DcCoreLog CREATING_INDEX = create("PL-ES-0003"); /** * ESへの登録リクエストが完了した. * {0}:インデックス名 * {1}:タイプ名 * {2}:ノード名 * {3}:ESへのリクエストタイプ * {4}:リクエストクエリ */ public static final DcCoreLog AFTER_CREATE = create("PL-ES-0004"); /** * ESへの登録リクエストが完了した. * {0}:リクエストクエリ */ public static final DcCoreLog AFTER_CREATE_BODY = create("PL-ES-0005"); } /** * その他エラー. */ public static class Misc { /** * 到達し得ないソース等の原因不明のエラー. */ public static final DcCoreLog UNREACHABLE_CODE_ERROR = create("PL-MC-0001"); } String message; String code; Severity severity; Throwable reason; /** * インナークラスを強制的にロードする. * エラー分類のインナークラスが追加になったらここに追加すること. */ public static void loadConfig() { new OData(); new Server(); new Dav(); new Misc(); } /** * コンストラクタ. * @param severityエラーレベル * @param message エラーメッセージ */ DcCoreLog(final String code, final Severity severity, final String message) { this.code = code; this.severity = severity; this.message = message; } /** * ファクトリーメソッド. * @param code エラーコード * @return DcCoreLog */ public static DcCoreLog create(String code) { // ログレベルの取得 Severity severity = DcCoreMessageUtils.getSeverity(code); if (severity == null) { // 設定ファイルで省略されていたらウォーニング扱いとする。 severity = Severity.WARN; } // ログメッセージの取得 String message = DcCoreMessageUtils.getMessage(code); return new DcCoreLog(code, severity, message); } /** * エラーコードを返却する. * @return エラーコード */ public String getCode() { return this.code; } /** * メッセージをパラメタ置換したものを作成して返します. エラーメッセージ上の {1} {2} 等の表現がパラメタ置換用キーワードです。 * @param params 付加メッセージ * @return DcCoreLog */ public DcCoreLog params(final Object... params) { // 置換メッセージ作成 String ms = MessageFormat.format(this.message, params); // メッセージ置換クローンを作成 DcCoreLog ret = new DcCoreLog(this.code, this.severity, ms); return ret; } /** * 原因例外を追加したものを作成して返します. * @param t 原因例外 * @return DcCoreException */ public DcCoreLog reason(final Throwable t) { // クローンを作成して DcCoreLog ret = new DcCoreLog(this.code, this.severity, this.message); // 原因のExceptionをセット ret.reason = t; return ret; } /** * ログの出力. * ログの出力時にログ出力元のクラス名、メソッド名、行数を表示する。 * 出力例) * 2012-09-09 11:23:47.029 [main] [INFO ] DcCoreLog [com.fujitsu.dc.core.DcCoreLogTest#test:22] - JSON Parse Error. */ public void writeLog() { StackTraceElement[] ste = (new Throwable()).getStackTrace(); String logInfo = String.format("[%s] - [%s#%s:%s] - %s", this.code, ste[1].getClassName(), ste[1].getMethodName(), ste[1].getLineNumber(), this.message); switch (this.severity) { case INFO: log.info(logInfo, this.reason); break; case WARN: log.warn(logInfo, this.reason); break; case ERROR: log.error(logInfo, this.reason); break; case DEBUG: log.debug(logInfo, this.reason); break; default: log.error("Message Severity Not Defined"); } } }