Apexログ出力制御について

#1.ログ出力イメージ（debug）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/332907/49112961-d73f-20fe-5ba7-41e689cdf2f4.png)
#2.ログ出力イメージ（info）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/332907/41f8413f-1c7c-b63e-b7d8-1aab177fff82.png)
#3.ログ出力イメージ（warn）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/332907/f11c3fb2-f52b-7f59-66ac-9cb701db4985.png)
#4.ログ出力イメージ（error）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/332907/bf961f57-9bfc-3a03-fb7c-d6ba2434cab2.png)
#5.カスタムメタデータ型（定義）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/332907/7257c67a-d360-55d7-550f-69f304c6590c.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/332907/c5a3aaea-ab9b-8b1c-335b-13dc9abe91f2.png)
#6.Logger
```java

/**
 * ログレベルに従ってログ出力をするクラスです。
 * System.LoggingLevel：name,ordinal
 *   NONE:NONE,0
 *   ERROR:ERROR,8
 *   WARN:WARN,7
 *   INFO:INFO,6
 *   DEBUG:DEBUG,5
 *   FINE:FINE,4
 *   FINER:FINER,3
 *   FINEST:FINEST,2
 */
public class Logger {
    // ログレベルの設定値
    private static String logLevelSettingName = '';
    
    // 列挙値のリスト内の項目の位置
    private static Integer logLevelSettingOrdinal = 0;
    
    // 静的初期化コード（静的な変数初期化処理）
	static {
		// ログレベルの名前と値（数値）のマップ
        Map<String, Integer> logginglevelMap = new Map<String, Integer>();
		logginglevelMap.put(Logginglevel.NONE.name().toUpperCase(), Logginglevel.NONE.ordinal());
		logginglevelMap.put(Logginglevel.ERROR.name().toUpperCase(), Logginglevel.ERROR.ordinal());
		logginglevelMap.put(Logginglevel.WARN.name().toUpperCase(), Logginglevel.WARN.ordinal());
		logginglevelMap.put(Logginglevel.INFO.name().toUpperCase(), Logginglevel.INFO.ordinal());
		logginglevelMap.put(Logginglevel.DEBUG.name().toUpperCase(), Logginglevel.DEBUG.ordinal());
		logginglevelMap.put(Logginglevel.FINE.name().toUpperCase(), Logginglevel.FINE.ordinal());
		logginglevelMap.put(Logginglevel.FINER.name().toUpperCase(), Logginglevel.FINER.ordinal());
		logginglevelMap.put(Logginglevel.FINEST.name().toUpperCase(), Logginglevel.FINEST.ordinal());

		List<EnvironmentSetting__mdt> environmentSettingList = [select Value__c from EnvironmentSetting__mdt where DeveloperName = 'Logginglevel'];
		if (environmentSettingList.size() > 0) {
			// ログレベルの設定値を取得する
			logLevelSettingName = environmentSettingList.get(0).Value__c;
            if (!String.isBlank(logLevelSettingName)) {
                logLevelSettingName = logLevelSettingName.toUpperCase();
            }
            
			// ログレベルの設定値に従って列挙値のリスト内の項目の位置を取得する
            if (logginglevelMap.containsKey(logLevelSettingName)) {
                logLevelSettingOrdinal = logginglevelMap.get(logLevelSettingName);
            }
		}
	}

	/**
	 * エラーログを出力します。<br />
	 * 設定ログレベルが ERROR／WARN／INFO／DEBUG の場合に出力されます。
	 * 
	 * @param message メッセージ
	 */
	public static void error(String message) {
		error(message, null);
	}
	
	/**
	 * エラーログを出力します。<br />
	 * ログレベルが ERROR／WARN／INFO／DEBUG の場合に出力されます。
	 * 
	 * @param message メッセージ（パラメータを含む場合は順番に {0} {1}... で指定）
	 * @param params メッセージ内のパラメータの値
	 */
	public static void error(String message, List<String> params) {
		outputLog(Logginglevel.ERROR, message, params );
	}
	
	/**
	 * 警告ログを出力します。<br />
	 * 設定ログレベルが WARN／INFO／DEBUG の場合に出力されます。
	 * 
	 * @param message メッセージ
	 */
	public static void warn(String message) {
		warn(message, null);
	}
	
	/**
	 * 警告ログを出力します。<br />
	 * 設定ログレベルが WARN／INFO／DEBUG の場合に出力されます。
	 * 
	 * @param message メッセージ（パラメータを含む場合は順番に {0} {1}... で指定）
	 */
	public static void warn(String message, List<String> params) {
		outputLog(Logginglevel.WARN, message, params);
	}
	
	/**
	 * 情報ログを出力します。<br />
	 * ログレベルが INFO／DEBUG の場合に出力されます。
	 * 
	 * @param message メッセージ
	 */
	public static void info(String message) {
		info(message, null);
	}
	
	/**
	 * 情報ログを出力します。<br />
	 * ログレベルが INFO／DEBUG の場合に出力されます。
	 * 
	 * @param message メッセージ（パラメータを含む場合は順番に {0} {1}... で指定）
	 * @param params メッセージ内のパラメータの値
	 */
	public static void info(String message, List<String> params) {
		outputLog(Logginglevel.INFO, message, params);
	}
	
	/**
	 * デバッグログを出力します。<br />
	 * ログレベルが DEBUG の場合に出力されます。
	 * 
	 * @param message メッセージ
	 */
	public static void debug(String message) {
		debug(message, null);
	}
	
	/**
	 * デバッグログを出力します。<br />
	 * ログレベルが DEBUG の場合に出力されます。
	 * 
	 * @param message メッセージ（パラメータを含む場合は順番に {0} {1}... で指定）
	 * @param params メッセージ内のパラメータの値
	 */
	public static void debug(String message, List<String> params) {
		outputLog(Logginglevel.DEBUG, message, params);
	}

	/**
	 * 指定のログレベルのログを出力します。<br />
	 * 
	 * @param outputLogLevel 出力ログラベル
	 * @param message メッセージ（パラメータを含む場合は順番に {0} {1}... で指定）
	 * @param params メッセージ内のパラメータの値
	 */
	private static void outputLog(Logginglevel outputLogLevel, String message, List<String> params) {
		if (logLevelSettingOrdinal == 0 || logLevelSettingOrdinal > outputLogLevel.ordinal()) {
			return;
		}
		
		if (params != null) {
			message = String.format(message, params);
		}
		
		System.debug(outputLogLevel, message);
	}
}
```