001/*
002 * Copyright (c) 2009 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.util;
017
018// import java.text.DateFormat;
019// import java.text.SimpleDateFormat;
020// import java.util.Date;
021// import java.util.Locale;
022
023/**
024 * Logを書き込む為の LogWriter を呼び出す 簡易クラスです。
025 *
026 * Log の書き込み日時や,キー(識別ID)などを出力します。
027 *
028 * @og.group エラー処理
029 *
030 * @version  4.0
031 * @author   Kazuhiko Hasegawa
032 * @since    JDK5.0,
033 */
034public final class LogSender {
035
036        /** Log出力レベル FATAL  {@value} */
037        public static final int FATAL        = 4;
038        /** Log出力レベル ERROR  {@value} */
039        public static final int ERROR        = 3;
040        /** Log出力レベル WARNING  {@value} */
041        public static final int WARNING      = 2;
042        /** Log出力レベル INFORMATION  {@value} */
043        public static final int INFORMATION  = 1;
044        /** Log出力レベル DEBUG  {@value} */
045        public static final int DEBUG        = 0;
046
047        private static final int LOG_LEVEL              = ERROR;                // 初期値
048
049        private final String userId;
050        private final int    logLevel;
051        private String guiId = null;
052        private String msgId = null;
053        private StringBuilder buf = null;
054
055        /** システム依存の改行記号をセットします。 */
056        private static final String CR = System.getProperty("line.separator");
057
058        /**
059         * デフォルトコンストラクター
060         *
061         */
062        public LogSender() {
063                this( null,LOG_LEVEL );
064        }
065
066        /**
067         * ユーザーIDを与えてのコンストラクター
068         * ユーザーIDは,Logの識別IDとして使用します。
069         *
070         * @param   userId  ユーザーID
071         */
072        public LogSender( final String userId ) {
073                this( userId,LOG_LEVEL );
074        }
075
076        /**
077         * ユーザーIDと、ログレベルを与えてのコンストラクター
078         * ユーザーIDは,Logの識別IDとして使用します。
079         * ログレベルは,0 〜 4 の数字で、大きくなるほど、出力条件はきつくなります。
080         * 0:DEBUG, 1:INFORMATION, 2:WARNING, 3:ERROR, 4:FATAL
081         * 初期値は、3:ERROR です。
082         *
083         * @param   userId  ユーザーID
084         * @param   logLbl  ログレベル(0 〜 4 の数字)
085         */
086        public LogSender( final String userId,final int logLbl ) {
087                this.userId = userId;
088                logLevel = logLbl;
089//              buf              = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
090                buf              = new StringBuilder( 200 ); // 4.1.0.1 (2008/01/23)
091
092                if( logLevel < DEBUG || logLevel > FATAL ) {
093                        String errMsg = "ログレベルの指定レベルが、間違っています。"
094                                                + "指定レベル=[" + logLbl + "]"
095                                                + "  指定可能レベル="
096                                                + DEBUG + " 〜 " + FATAL ;
097//                      throw new HybsSystemException( errMsg );
098                        throw new RuntimeException( errMsg );
099                }
100        }
101
102        /**
103         * 画面IDを設定します。
104         * ログ集計時の参考情報に使います。
105         *
106         * @param       guiId   画面ID
107         */
108        public void setGuiId( final String guiId ) {
109                this.guiId = guiId;
110        }
111
112        /**
113         * メッセージIDを設定します。
114         * ログ集計時の参考情報に使います。
115         *
116         * @param       msgId   メッセージID
117         */
118        public void setMsgId( final String msgId ) {
119                this.msgId = msgId;
120        }
121
122        /**
123         * Logレベルを取得します。
124         * ログレベルは, FATAL,ERROR,WARNING,INFORMATION,DEBUG から選べます。
125         *
126         * @return   Logレベル
127         */
128        public int getLogLevel() {
129                return logLevel;
130        }
131
132        /**
133         * LogをLogWriter に渡します。
134         * DEBUG ログレベルと,あらかじめ設定されているLogレベルを
135         * 比較して, ログレベルが小さい場合は,出力しません。
136         *
137         * @param   message メッセージ
138         */
139        public void debug( final String message ) {
140                if( DEBUG < logLevel ) { return; }
141                log( "DEBUG",message ) ;
142        }
143
144        /**
145         * LogをLogWriter に渡します。
146         * INFORMATION ログレベルと,あらかじめ設定されているLogレベルを
147         * 比較して, ログレベルが小さい場合は,出力しません。
148         *
149         * @param   message メッセージ
150         */
151        public void info( final String message ) {
152                if( INFORMATION < logLevel ) { return; }
153                log( "INFO",message ) ;
154        }
155
156        /**
157         * LogをLogWriter に渡します。
158         * WARNING ログレベルと,あらかじめ設定されているLogレベルを
159         * 比較して, ログレベルが小さい場合は,出力しません。
160         *
161         * @param   message メッセージ
162         */
163        public void warn( final String message ) {
164                if( WARNING < logLevel ) { return; }
165                log( "WARNING",message ) ;
166        }
167
168        /**
169         * LogをLogWriter に渡します。
170         * ERROR ログレベルと,あらかじめ設定されているLogレベルを
171         * 比較して, ログレベルが小さい場合は,出力しません。
172         *
173         * @param   message メッセージ
174         */
175        public void error( final String message ) {
176                if( ERROR < logLevel ) { return; }
177                log( "ERROR",message ) ;
178        }
179
180        /**
181         * LogをLogWriter に渡します。
182         * FATAL ログレベルと,あらかじめ設定されているLogレベルを
183         * 比較して, ログレベルが小さい場合は,出力しません。
184         *
185         * @param   message メッセージ
186         */
187        public void fatal( final String message ) {
188                if( FATAL < logLevel ) { return; }
189                log( "FATAL",message ) ;
190        }
191
192        /**
193         * LogをLogWriter に渡します。
194         * ただし,引数でセットしたLoglevelと,あらかじめ設定されているLogレベルを
195         * 比較して, 引数のLoglebelの方が小さい場合は,出力しません。
196         * ログレベルは, FATAL,ERROR,WARNING,INFORMATION,DEBUG から選べます。
197         *
198         * @og.rev 3.5.5.4 (2004/04/15) ログにエラーレベルを記述します。
199         * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用するように修正します。
200         *
201         * @param   level   ログレベル(FATAL,ERROR,WARNING,INFORMATION,DEBUG)
202         * @param   message メッセージ
203         */
204        private void log( final String level ,final String message ) {
205                buf.append( "[" );
206                buf.append( level );
207//              buf.append( " : Time=" ).append( HybsSystem.getDate() );
208//              DateFormat formatter = new SimpleDateFormat( "yyyy/MM/dd HH:mm:ss.SSS",Locale.JAPAN );
209//              buf.append( " : Time=" ).append( formatter.format( new Date() ) );  // 4.1.0.1 (2008/01/23)
210                buf.append( " : Time=" ).append( HybsDateUtil.getDate( "yyyy/MM/dd HH:mm:ss.SSS" ) );  // 5.5.7.2 (2012/10/09) HybsDateUtil を利用
211                buf.append( " , User=" ).append( userId );
212                buf.append( " , Gui="  ).append( guiId );
213                buf.append( " , Msg="  ).append( msgId );
214                buf.append( "]");
215                buf.append( CR );
216                buf.append( message );
217        }
218
219        /**
220         * LogWriter を明示的にclose() します。
221         * LogWriter は,内部的に キャッシュを持っており,初めてアクセスされた場合に
222         * すでにオブジェクトが存在していれば,それを使い,無ければ 新たに追加モードで
223         * PrintWriter を作成します。
224         * よって,明示的にclose()する必要性は ほとんど有りません。
225         *
226         */
227        public void flush() {
228                LogWriter.log( buf.toString() );
229        }
230
231        /**
232         * LogWriter を明示的にclose() します。
233         * LogWriter は,内部的に キャッシュを持っており,初めてアクセスされた場合に
234         * すでにオブジェクトが存在していれば,それを使い,無ければ 新たに追加モードで
235         * PrintWriter を作成します。
236         * よって,明示的にclose()する必要性は ほとんど有りません。
237         *
238         */
239        public void close() {
240                LogWriter.close();
241        }
242}