エラーログを生成する

webアプリ用だが、HttpServletRequestからリモートホストを取得する部分を除けばローカルのアプリでも使える。

package org.dyndns.rhmusic;

import static java.io.File.separator;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

import javax.servlet.http.HttpServletRequest;

/**
* エラーログの操作を定義するクラス
*
@author Paradigm-Shift
*/
public class Log {
 
 
/** ログファイルを生成する場所 */
 
private static final String DIR_PATH = "C:" + separator + "logs" + separator;
 
 
/**
   * 
<p>{@link Throwable}を受け取り、日付毎にlogファイルを生成する。</p>
  
* @param throwable
   *
@param rootPath - logファイルを生成する場所
   *
@param request - ユーザのリモートホストを取得するためのHttpServletRequest。
   * リモートホストを取得する必要が無い(取得できない)場合はnull。
   */
 
public static void createLog(final Throwable throwable, final HttpServletRequest request) {

   
//1ヶ月ごとのディレクトリ名を生成
   
final Date date = new Date();
   
final SimpleDateFormat sdfd = new SimpleDateFormat("yyyy_MM", Locale.JAPAN);
   
final String DIRPATH = DIR_PATH + sdfd.format(date);

   
//1週間ごとのディレクトリ名を生成
   
String count = getCount(date);
   
   
//1週間ごとにディレクトリを生成
   
final SimpleDateFormat sdff = new SimpleDateFormat("yyyy_MM_W", Locale.JAPAN);
   
final String WEEKLY_DIRPATH = DIRPATH + separator + sdff.format(date) + count + "_week";
   
final File weeklyDir = new File(WEEKLY_DIRPATH);
   
if (!weeklyDir.exists()) {
     
weeklyDir.mkdirs();
   
}

   
//1日ごとにログファイルを生成
   
final SimpleDateFormat sdfDay = new SimpleDateFormat("yyyy_MM_dd", Locale.JAPAN);
   
final String PATH = WEEKLY_DIRPATH + separator + "log_" + sdfDay.format(date) + ".txt";

   
//エラー文字列を生成
   
final String message = createMessage(throwable, request, date, sdfDay, PATH);

   
//ファイルに出力
   
writer(PATH, message);
 
}

 
/**
   * 文字列をファイルに書き込む
   *
@param PATH ファイル名
   *
@param message 文字列
   */
 
private static void writer(final String PATH, final String message) {
   
FileOutputStream fileOutputStream = null;
    OutputStreamWriter outputStreamWriter =
null;
    BufferedWriter bufferedWriter =
null;

   
try {

     
fileOutputStream = new FileOutputStream(PATH, true);//第2引数が[true]の場合は追記、[false]にすると上書き
     
outputStreamWriter = new OutputStreamWriter(fileOutputStream, "MS932");
      bufferedWriter =
new BufferedWriter(outputStreamWriter);

     
//ファイルが無ければ生成し、あればそのファイルに追記
     
bufferedWriter.write(message);
   
} catch (final Exception e) {
     
e.printStackTrace();
   
} finally {
     
try {
       
bufferedWriter.close();
        outputStreamWriter.close
();
        fileOutputStream.close
();
     
} catch (final IOException e) {
       
e.printStackTrace();
     
}
    }
  }

 
/**
   * 現在が何週目かを取得する
   *
@param date
   *
@param sdfw
   *
@return
  
*/
 
private static String getCount(final Date date) {
   
   
//1週間ごとのディレクトリ名を生成
   
final SimpleDateFormat sdfw = new SimpleDateFormat("W", Locale.JAPAN);
    String count =
null;
   
final String week = sdfw.format(date);
   
if (("1").equals(week)) {
     
count = "st";
   
} else if (("2").equals(week)) {
     
count = "nd";
   
} else if (("3").equals(week)) {
     
count = "rd";
   
} else {
     
count = "th";
   
}
   
return count;
 
}

 
/**
   * エラー文字列を生成する
   *
@param throwable
   *
@param request
   *
@param date
   *
@param sdfDay
   *
@param PATH
   *
@return ログファイルに出力する文字列
   */
 
private static String createMessage(final Throwable throwable, final HttpServletRequest request, final Date date, final SimpleDateFormat sdfDay, final String PATH) {
   
   
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss SSS", Locale.JAPAN);
   
   
//エラー文字列の生成
   
final StringBuilder stb = new StringBuilder();
   
final File lFile = new File(PATH);
   
if (!lFile.exists()) {
     
stb.append(sdfDay.format(date));
      stb.append
(" ERROR LOG\r\n\r\n");
   
}
   
stb.append("ERROR!! ");
    stb.append
(sdf.format(date));
    stb.append
(" Host : ");
   
if (request != null && request.getRemoteHost() != null) {
     
stb.append(request.getRemoteHost());
   
} else {
     
stb.append("unknown");
   
}
   
stb.append("\r\n");

    stb.append
(getStackTraceString(throwable));

    stb.append
("\r\n");
   
return stb.toString();
 
}

 
/**
   *
<p>{@link Throwable#getStackTrace()}を文字列として取得する。<p>
  
* @param throwable
   *
@return {@link StackTraceElement}ごとに改行された文字列
   */
 
private static String getStackTraceString(final Throwable throwable) {
   
final StringWriter stringWriter = new StringWriter();
    throwable.printStackTrace
(new PrintWriter(stringWriter));
   
return stringWriter.getBuffer().toString();
 
}
}

Java TipsのTOPに戻る