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 */ 016 package org.opengion.fukurou.process; 017 018 import org.opengion.fukurou.util.Argument; 019 import org.opengion.fukurou.util.Closer ; 020 import org.opengion.fukurou.util.FileUtil ; 021 import org.opengion.fukurou.util.StringUtil ; 022 import org.opengion.fukurou.util.LogWriter; 023 import org.opengion.fukurou.mail.MailTX ; 024 025 import java.util.Map ; 026 import java.util.LinkedHashMap ; 027 import java.io.PrintWriter ; 028 import java.io.StringWriter ; 029 030 /** 031 * Process_Logger は、画面出力?ファイルログ、エラーメールを管?る? 032 * ロギング関係? LoggerProcess インターフェースの実?ラスです? 033 * 034 * MainProcess で使用されるログと、各種 Process で使用されるディスプレイ? 035 * 管?ます?また?エラー発生時の、メール送信機?も?ここで用意します? 036 * 037 * 引数??中にスペ?スを含??合?、ダブルコー??ション("") で括って下さ?? 038 * 引数??の ?』?前後には、スペ?スは挟めません。??key=value の様に 039 * 繋げてください? 040 * 041 * @og.formSample 042 * Process_Logger -logFile=ABC.txt -dispFile=System.out 043 * 044 * [ -logFile=ログ出力??? ] ??-logFile=[ファイル?System.out/System.err] (初期値:null) 045 * [ -dispFile=画面出力???] ??-dispFile=[ファイル?System.out/System.err](初期値:null) 046 * [ -host=メールサー? ] ??-host=メールサーバ? 047 * [ -from=送信From ] ??-from=送信?ドレス 048 * [ -to=受信To ] ??-to=送信先アドレスをカンマ区?で並べ? 049 * [ -charset=???ク????? ] ??-charset=メール送信時?キャラクタセ? [ISO-2022-JP / Windows-31J] 050 * [ -subject=タイトル ] ??-subject=タイトル 051 * [ -message=本?形 ] ??-message=本?形?? 052 * [ -msgFile=本?形?ァ??? ] ??-msgFile=本?格納して?ファイルのアドレス 053 * [ -{@XXXX}=YYYY ] ??メ?ージ本?? {@XXXX} ??を?YYYY ??に変換します? 054 * 055 * @version 4.0 056 * @author Kazuhiko Hasegawa 057 * @since JDK5.0, 058 */ 059 public class Process_Logger extends AbstractProcess implements LoggerProcess { 060 061 private String logFile = null; // ログ出力? 062 private String dispFile = null; // 画面出力? 063 064 private PrintWriter logWriter = null; 065 private PrintWriter dispWriter = null; 066 067 /** メール送信時??ォルトキャラクタセ? {@value} */ 068 public static final String DEFAULT_CHARSET = "ISO-2022-JP" ; 069 private String host = "mail.opengion.org"; 070 private String from = "DUMMY@DUMMY"; 071 private String to = null; 072 private String subject = null; // 5.3.1.0 (2011/03/10) 073 private boolean useErrMail = false; 074 075 private static final Map<String,String> mustProparty ; // ?プロパティ???チェ?用 Map 076 private static final Map<String,String> usableProparty ; // ?プロパティ?整合?チェ? Map 077 078 static { 079 mustProparty = new LinkedHashMap<String,String>(); 080 081 usableProparty = new LinkedHashMap<String,String>(); 082 usableProparty.put( "logFile", "ログ出力???ファイル名を?しま?初期値:null)" + 083 CR + "『System.out?『System.err』?特殊な名称です?" ); 084 usableProparty.put( "dispFile", "画面出力???ファイル名を?しま?初期値:null)" + 085 CR + "『System.out?『System.err』?特殊な名称です?" ); 086 usableProparty.put( "host", "メールサーバ?" ); 087 usableProparty.put( "from", "送信?ドレス" ); 088 usableProparty.put( "to", "送信先アドレスをカンマ区?で並べ? ); 089 usableProparty.put( "charset", "メール送信時?キャラクタセ? [ISO-2022-JP / Windows-31J]" ); 090 usableProparty.put( "subject", "タイトル" ); 091 usableProparty.put( "message", "本?形?? ); 092 usableProparty.put( "msgFile", "本?形を?納して?ファイルのアドレス" ); 093 usableProparty.put( "{@", "{@XXXX}=YYYY 汎用?変換" + 094 CR + "メ?ージ本?? {@XXXX} ??を?YYYY ??に変換します?" ); 095 usableProparty.put( "{@ARG.", "{@ARG.XXX} 予?字変換 上記引数を割り当てます?" ); 096 usableProparty.put( "{@DATE.", "{@DATE.XXX} 予?字変換 の?を変換します?" + 097 CR + "(SimpleDateFormat 形式?日付?時刻?" ); 098 usableProparty.put( "{@ENV.", "{@ENV.XXX} 予?字変換 ????プロパ??の?を変換します?" + 099 CR + "(java -Dkey=value オプションで引き渡します?)" ); 100 } 101 102 /** 103 * ?ォルトコンストラクター? 104 * こ?クラスは、動??されます??ォルトコンストラクターで? 105 * super クラスに対して、?な初期化を行っておきます? 106 * 107 */ 108 public Process_Logger() { 109 super( "org.opengion.fukurou.process.Process_Logger",mustProparty,usableProparty ); 110 } 111 112 /** 113 * プロセスの初期化を行います?初めに??、呼び出されます? 114 * 初期処?ファイルオープン??オープン?に使用します? 115 * 116 * @og.rev 5.3.4.0 (2011/04/01) タイトル追? 117 * 118 * @param paramProcess ??タベ?スの接続???などを持って?オブジェク? 119 */ 120 public void init( final ParamProcess paramProcess ) { 121 Argument arg = getArgument(); 122 123 logFile = arg.getProparty( "logFile" ); // ログ出力? 124 dispFile = arg.getProparty( "dispFile" ); // 画面出力? 125 126 if( logWriter == null && logFile != null ) { 127 logWriter = FileUtil.getLogWriter( logFile ); 128 } 129 130 if( dispWriter == null && dispFile != null ) { 131 dispWriter = FileUtil.getLogWriter( dispFile ); 132 } 133 134 host = arg.getProparty( "host",host ); // メールサーバ? 135 from = arg.getProparty( "from",from ); // 送信?ドレス 136 to = arg.getProparty( "to" ,to ); // 送信先アドレス 137 subject = arg.getProparty( "subject" ); // 5.3.4.0 (2011/04/01) タイトル 138 useErrMail = ( host != null ) && ( from != null ) && ( to != null ) ; 139 } 140 141 /** 142 * プロセスの終?行います??に??、呼び出されます? 143 * 終???ファイルクローズ??クローズ?に使用します? 144 * 145 * @param isOK ト?タルで、OK?たかど?[true:成功/false:失敗] 146 */ 147 public void end( final boolean isOK ) { 148 if( logWriter != null ) { 149 logWriter.flush(); 150 Closer.ioClose( logWriter ); 151 } 152 153 if( dispWriter != null ) { 154 dispWriter.flush(); 155 Closer.ioClose( dispWriter ); 156 } 157 } 158 159 /** 160 * ログファイルにメ?ージを表示します? 161 * 162 * @param msg 表示するメ?ージ 163 */ 164 @Override 165 public void logging( final String msg ) { 166 if( logWriter != null ) { 167 logWriter.println( msg ) ; 168 } 169 } 170 171 /** 172 * ?スプレイにメ?ージを表示します? 173 * 174 * @param msg 表示するメ?ージ 175 */ 176 @Override 177 public void println( final String msg ) { 178 if( dispWriter != null ) { 179 dispWriter.println( msg ) ; 180 } 181 } 182 183 /** 184 * エラーログにメ?ージを表示します? 185 * ここに書き込まれたメ?ージは??常ログと、特殊ログの 186 * 両方に書き込まれます? 187 * 特殊ログとは、メール連絡等?ことです? 188 * 189 * @param msg 表示するメ?ージ 190 * @param th Throwable例外オブジェク? 191 */ 192 public void errLog( final String msg,final Throwable th ) { 193 String sendMsg = msg; 194 if( logWriter != null ) { 195 if( th != null ) { 196 StringWriter errMsg = new StringWriter(); 197 errMsg.append( msg ).append( CR ); 198 th.printStackTrace( new PrintWriter( errMsg ) ); 199 sendMsg = errMsg.toString(); 200 } 201 logWriter.println( sendMsg ) ; 202 } 203 println( sendMsg ) ; 204 if( useErrMail ) { sendmail( sendMsg ) ; } 205 } 206 207 /** 208 * メール送信を行います? 209 * 210 * @og.rev 5.3.4.0 (2011/04/01) タイトル追? 211 * 212 * @param msg 送信するメ?ージ 213 */ 214 private void sendmail( final String msg ) { 215 216 Argument arg = getArgument(); 217 218 String charset = arg.getProparty( "charset", DEFAULT_CHARSET ); 219 MailTX mail = new MailTX( host,charset ); 220 mail.setFrom( from ); 221 mail.setTo( StringUtil.csv2Array( to ) ); 222 // mail.setSubject( arg.getProparty( "subject" ) ); 223 mail.setSubject( subject ); // 5.3.4.0 (2011/04/01) 224 225 String message = arg.getFileProparty("message","msgFile",false); 226 227 // {@XXX} 変換は、Argument クラスの機?を使?? 228 message = arg.changeParam( message ); 229 message = message + CR + msg ; 230 mail.setMessage( message ); 231 mail.sendmail(); 232 } 233 234 /** 235 * ログ出力用のPrintWriterを設定します? 236 * 通常は、引数の -logFile=XXXX で?しますが、直接 PrintWriter ? 237 * 渡す?があるケース(JSPなどで使用するケース)で使用します? 238 * 引数より、こちら?設定?ほ?、優先されます? 239 * ※ JspWriter を渡す?合? PrintWriter は、flushing および、close 処? 240 * 行わな?NonFlushPrintWriter を設定してください? 241 * 242 * @param logWriter ログ出力用のPrintWriter 243 */ 244 public void setLoggingWriter( final PrintWriter logWriter ) { 245 this.logWriter = logWriter; 246 } 247 248 /** 249 * 画面表示用のPrintWriterを設定します? 250 * 通常は、引数の -dispFile=XXXX で?しますが、直接 PrintWriter ? 251 * 渡す?があるケース(JSPなどで使用するケース)で使用します? 252 * 引数より、こちら?設定?ほ?、優先されます? 253 * ※ JspWriter を渡す?合? PrintWriter は、flushing および、close 処? 254 * 行わな?NonFlushPrintWriter を設定してください? 255 * 256 * @param dispWriter 画面表示用のPrintWriter 257 */ 258 public void setDisplayWriter( final PrintWriter dispWriter ) { 259 this.dispWriter = dispWriter; 260 } 261 262 /** 263 * プロセスの処?果のレポ?ト表現を返します? 264 * 処??ログラ?、?力件数、?力件数などの??です? 265 * こ???をそのまま、標準?力に出すことで、結果レポ?トと出来るよ? 266 * 形式で出してください? 267 * 268 * @og.rev 5.3.4.0 (2011/04/01) タイトル追? 269 * 270 * @return 処?果のレポ?? 271 */ 272 public String report() { 273 return "[" + getClass().getName() + "]" + CR 274 + TAB + "Subject : " + subject + CR 275 + TAB + "Log File : " + logFile + CR 276 + TAB + "Display File : " + dispFile ; 277 } 278 279 /** 280 * こ?クラスの使用方法を返します? 281 * 282 * @return こ?クラスの使用方? 283 */ 284 public String usage() { 285 StringBuilder buf = new StringBuilder(); 286 287 buf.append( "Process_Logger は、画面出力?ファイルログ、エラーメールを管?る?" ).append( CR ); 288 buf.append( "ロギング関係? LoggerProcess インターフェースの実?ラスです?" ).append( CR ); 289 buf.append( CR ); 290 buf.append( "MainProcess で使用されるログと、各種 Process で使用されるディスプレイ? ).append( CR ); 291 buf.append( "管?ます?また?エラー発生時の、メール送信機?も?ここで用意します?" ).append( CR ); 292 buf.append( CR ); 293 buf.append( "引数??中に空白を含??合?、ダブルコー??ション(\"\") で括って下さ??" ).append( CR ); 294 buf.append( "引数??の ?』?前後には、空白は挟めません。??key=value の様に" ).append( CR ); 295 buf.append( "繋げてください? ).append( CR ); 296 buf.append( CR ).append( CR ); 297 298 buf.append( getArgument().usage() ).append( CR ); 299 300 return buf.toString(); 301 } 302 303 /** 304 * こ?クラスは、main メソ?から実行できません? 305 * 306 * @param args コマンド引数配? 307 */ 308 public static void main( final String[] args ) { 309 LogWriter.log( new Process_Logger().usage() ); 310 } 311 }