エラーログを生成する
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();
}
}
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();
}
}