001/* 002 * Copyright (c) 2017 The openGion Project. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 013 * either express or implied. See the License for the specific language 014 * governing permissions and limitations under the License. 015 */ 016package org.opengion.fukurou.fileexec; 017 018// import java.nio.file.Paths; // 6.8.1.5 (2017/09/08) 019 020import java.util.logging.Logger; 021import java.util.logging.Level; 022import java.util.function.Supplier; // 6.8.1.0 (2017/07/14) 023import java.util.function.Function; // 7.2.5.0 (2020/06/01) 024 025/** 026 * XLoggerは、Throwable を引数に取るwarningと、Level 600 の debug メソッドを 027 * 持つ、Logger の拡張クラスです。 028 * ここでは、継承するのではなく、委譲で、最低限のメソッドだけに対応しています。 029 * (LogManager とか、色々とややこしそうなので、調査する暇が無い) 030 * 031 * WARNING(900) → INFO(800) → CONFIG(700) → XXXX(600) → FINE(500) → ALL(Integer.MIN_VALUE) 032 * となっていますが、FINE では、多すぎ、INFO は、通常使用、間に、DEBUG的な、 033 * ロギングが欲しい場合に使用します。 034 * CONFIG を使いたいところですが、「CONFIGは静的な構成メッセージのメッセージ・レベルです。」と 035 * JavaDocにわざわざ、書かれていることから、使用を避けます。 036 * 037 * @og.rev 7.0.0.0 (2017/07/07) 新規作成 038 * 039 * @version 7.0 040 * @author Kazuhiko Hasegawa 041 * @since JDK1.8, 042 */ 043public class XLogger { 044 // 7.2.5.0 (2020/06/01) 各クラスで、class.getSimpleName() を渡すようにしたので短縮不要。 045// /** 初期設定されているリソースバンドルのbaseName {@value} */ 046// public static final String OMIT_NAME = "org.opengion.fukurou." ; // fileexec は残す 047 048 /** 049 * デバッグレベルを新規に定義します。 050 * 051 * OFF:Integer.MAX_VALUE , SEVERE:1000 , WARNING:900 , INFO:800 , CONFIG:700 , FINE:500 , FINER:400 , FINEST:300 , ALL:Integer.MIN_VALUE 052 * LEVEL_DEBUG:600 で定義することで、INFO より細かいが、FINE より荒いログ出力が可能です。 053 * 他のアプリケーションで、INFO は許せても、FINE は許せない場合があるので、独自のログ出力が、可能です。 054 */ 055 private static final class LEVEL_DEBUG extends Level { 056 private static final long serialVersionUID = 681020170714L ; // 6.8.1.0 (2017/07/14) 057 /** 058 * デバッグレベルのコンストラクター 059 */ 060 public LEVEL_DEBUG() { super( "DEBUG",600 ); } 061 }; 062 063// private static final Level DEBUG = new LEVEL_DEBUG(); 064 private static final Level L_DEBUG = new LEVEL_DEBUG(); // 6.9.7.0 (2018/05/14) PMD Field DEBUG has the same name as a method 065 066 private final Logger LOGGER; 067 068 /** 069 * 名前を指定して、XLoggerオブジェクトを作成します。 070 * 071 * @og.rev 6.8.1.5 (2017/09/08) logフォルダの存在チェックと作成 072 * 073 * @param name ロガーの名前。通常は、クラス.class.getName() を渡せばよいです。 074 */ 075 private XLogger( final String name ) { 076// FileUtil.mkdirs( Paths.get( "log" ) ); // Logger の log フォルダが無ければ作成します。 077 078 LOGGER = Logger.getLogger( name ); 079 } 080 081 /** 082 * 名前を指定して、XLoggerオブジェクトを作成します。 083 * 084 * @og.rev 7.2.1.0 (2020/03/13) ロガーの名前から、共通部分を削除します。 085 * @og.rev 7.2.5.0 (2020/06/01) 各クラスで、class.getSimpleName() を渡すようにした。 086 * 087 * @param name ロガーの名前。通常は、クラス.class.getName() を渡せばよいです。 088 * @return XLoggerオブジェクト 089 */ 090 public static XLogger getLogger( final String name ) { 091// String key = name ; 092// if( key.startsWith( OMIT_NAME ) ) { 093// key = name.substring( OMIT_NAME.length() ); 094// } 095 096// return new XLogger( name ); // 今は、個別に作成していますが、本来は、同じオブジェクトを返すようにすべき。 097 return new XLogger( name ); // 各クラスで static で持つのでキャッシュしません。 098 } 099 100 /** 101 * INFO レベルのログをとります。 102 * 103 * @param msgSupplier 呼び出されると、目的のログ・メッセージを生成する関数 104 * @see Logger#info( Supplier ) 105 */ 106 public void info( final Supplier<String> msgSupplier ) { 107 LOGGER.info( msgSupplier ); 108 } 109 110 /** 111 * WARNING レベルのログをとります。 112 * 113 * @param msgSupplier 呼び出されると、目的のログ・メッセージを生成する関数 114 * @see Logger#warning( Supplier ) 115 */ 116 public void warning( final Supplier<String> msgSupplier ) { 117 LOGGER.warning( msgSupplier ); 118 } 119 120 /** 121 * WARNING レベルのログをとります。 122 * 123 * @og.rev 7.2.5.0 (2020/06/01) メソッド追加。 124 * 125 * @param id リソースのキーとなるID。 126 * @param args リソースを、MessageFormat.format で加工する場合の引数。 127 * @see Logger#warning( Supplier ) 128 */ 129 public void warning( final String id , final Object... args ) { 130 LOGGER.warning( MsgUtil.errPrintln( id,args ) ); 131 } 132 133 /** 134 * WARNING レベルのログをとります。 135 * 136 * これは、Throwable を引数に取る拡張されたメソッドです。 137 * 138 * @param th ログ・メッセージに関連したThrowable。 139 * @param msgSupplier 呼び出されると、目的のログ・メッセージを生成する関数 140 * @see Logger#log( Level,Throwable,Supplier ) 141 */ 142 public void warning( final Throwable th , final Supplier<String> msgSupplier ) { 143 LOGGER.log( Level.WARNING , th , msgSupplier ); 144 } 145 146 /** 147 * WARNING レベルのログをとります。 148 * 149 * これは、Throwable を引数に取る拡張されたメソッドです。 150 * 151 * @og.rev 7.2.5.0 (2020/06/01) メソッド追加。 152 * 153 * @param th 発生元のThrowable( null値は許容されます ) 154 * @param id リソースのキーとなるID。 155 * @param args リソースを、MessageFormat.format で加工する場合の引数。 156 * @see Logger#log( Level,Throwable,Supplier ) 157 */ 158 public void warning( final Throwable th , final String id , final Object... args ) { 159 LOGGER.log( Level.WARNING , MsgUtil.errPrintln( id,args ) , th ); // 1.4.0 (2019/10/01) StackTraceの重複を避けるため 160 } 161 162 /** 163 * 600 レベルのログをとります。 164 * 165 * Supplierを引数に、Level = 600 のログをとります。 166 * 167 * @param msgSupplier 呼び出されると、目的のログ・メッセージを生成する関数 168 * @see Logger#log( Level,Supplier ) 169 */ 170 public void debug( final Supplier<String> msgSupplier ) { 171// LOGGER.log( DEBUG , msgSupplier ); 172 LOGGER.log( L_DEBUG , msgSupplier ); 173 } 174 175 /** 176 * 数値の変数を受け取って表示する、600 レベルのログをとります。 177 * 178 * Supplierを引数に、Level = 600 のログをとります。 179 * 関数型インタフェースは引数にfinal変数しか使えませんが、数値は大抵可変なので 180 * final化せずに、引数として渡すことが出来るようにします。 181 * 182 * @og.rev 7.2.5.0 (2020/06/01) メソッド追加。 183 * 184 * @param num 数値引数 185 * @param msgFunction 呼び出されると、目的のログ・メッセージを生成する関数 186 * @see Logger#log( Level,Supplier ) 187 */ 188 public void debug( final int num , final Function<Integer,String> msgFunction ) { 189 LOGGER.log( L_DEBUG , () -> msgFunction.apply( num ) ); 190 } 191}