    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}