□技術メモ - Java-ログ出力 ※管理人の個人的な技術メモです。このページの内容の実行結果について 管理人はいかなる責任も負いかねますのでご自身の責任でお試しください。 ----------------------------------------------------------- ○簡単なログ出力 ・あらかじめファイルは作成しておくこと -------- String path = "D:\\WORK\\201811xx.txt"; try { FileWriter fw = new FileWriter(path, true); //第2引数 trueなら追加出力 fw.write(message); } catch(Exception e) { System.out.println("以下のファイルへの出力に失敗しました。" + "\r\n" + path); } -------- ○Javaにおけるエラーログ出力 ・エラーログを循環ログに出力します。 ・1行目は出力日付。本日日付と同じならファイルの最後に追加出力。 違う場合はファイル新規作成。1行目に本日日付出力。 -------- //ここでパッケージ宣言を行う import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.StringWriter; import java.text.SimpleDateFormat; import java.util.Date; import javax.xml.bind.JAXB; public class TryLog { // 定数 private final String SPC1 = " "; private final String strLogFolder = "log\\"; private final String SEP = String.valueOf(File.separatorChar); private final String BR = System.getProperty("line.separator"); // private final static String msgSep = String.valueOf("/"); private final int posStartDay = 6; //開始位置(DD) // 日付 private final String DATE_PATTERN = "yyyyMMdd"; private final SimpleDateFormat sdf = new SimpleDateFormat(DATE_PATTERN); private final String TIME_PATTERN = "HH:mm:ss"; private final SimpleDateFormat stf = new SimpleDateFormat(TIME_PATTERN); // プロパティ private String className = ""; private String subFolder = "subfolder"; // デフォルト値 // コンストラクタ public TryLog(String psClass) { setClassName(psClass); } // コンストラクタ public TryLog(String psClass, String psSubFolder) { setClassName(psClass); setSubFolder(psSubFolder); } // プロパティ設定(setter, getter) private void setClassName(String className) { this.className = className; } private String getClassName() { return className; } private void setSubFolder(String subFolder) { this.subFolder = subFolder; } private String getSubFolder() { return this.subFolder; } // NULL変換 public String NVL(Object pObj) { if (pObj == null) { return ""; } else { return pObj.toString(); } } // メッセージ出力 public void putLog(String psMessage) throws Exception { putLogMessage(psMessage, null); } // メッセージ出力 public void putLog(Exception pe) throws Exception { putLogMessage("", pe); } /** * エラーログを出力します。
* @param psMessage メッセージ * @param pe 例外 * @return なし *
     * 1行目に クラス名 + 空白 + メッセージ、
     * 2行目以降にスタックトレースを出力する。
     * 1行目は、内容が空の場合は出力しない。
     * 
**/ public void putLogMessage( String psMessage, Exception pe) throws Exception { // 日付取得 Date dateNow = new Date(); //現在時刻 String strDate = sdf.format(dateNow); //YYYYMMDD String strTime = stf.format(dateNow); //HH:mm:SS String strDD = strDate.substring(posStartDay); //DD //----mainから起動するプロジェクトの場合に、\log フォルダの直上のパスを取得する。 // .java の場合と .jar の場合で取得できるパスが違うので注意すること。 String strLogDir = getModulePath() + strLogFolder; //----Webプロジェクトの場合に、\log フォルダの直上のパスを取得する。 // 上記のモジュールでは正しく取得できないので、今回は直接指定する。 // String strLogDir = 「\logフォルダの直上のパス」 boolean bLogFileNew = false; //true:新規作成 false:既存あり // フォルダ作成 File fileLogDir = new File(strLogDir); if (!fileLogDir.exists()) { fileLogDir.mkdirs(); } // フォルダ存在確認、作成。同じファイル名がある場合はエラー。 //フォルダ作成 if (subFolder.trim().length() > 0) { strLogDir += (subFolder.trim() + "\\"); File fileLogDir2 = new File(strLogDir); if (!fileLogDir2.exists()) { fileLogDir2.mkdirs(); } // フォルダ存在確認、作成。同じファイル名がある場合はエラー。 } // ファイルの存在確認 String strLogPath = strLogDir + strDD + "log.txt"; File fileLog = new File(strLogPath); if (!fileLog.exists()) { // ファイルが存在しない bLogFileNew = true; } else { // 日付確認 FileReader fr = new FileReader(strLogPath); BufferedReader br = new BufferedReader(fr); try { String strHead = br.readLine(); // 1行読み込み if (strHead.compareTo(strDate) != 0) { // 日付が違う bLogFileNew = true; } } finally { br.close(); fr.close(); } } // ファイル新規作成 if (bLogFileNew) { FileWriter fw = new FileWriter(strLogPath); BufferedWriter bw = new BufferedWriter(fw); try { bw.write(strDate); bw.newLine(); } finally { bw.close(); fw.close(); } } // ファイルライターで出力 // 最終行にシーク FileWriter fw = new FileWriter(strLogPath, true); String strFirstMsg = ""; try { // 1行目出力 if (psMessage.trim().length() > 0) { strFirstMsg = getFirstMsg(getClassName(), psMessage); fw.write(strTime + SPC1 + strFirstMsg + BR); System.out.println(strFirstMsg); } // スタックトレース出力 if (pe != null) { String strStackTrace = cnvStackTrace(pe); fw.write(strStackTrace); System.out.println(strStackTrace); } } finally { fw.close(); } // ダイアログ出力 // JOptionPane.showMessageDialog(null, strFirstMsg); // 第1引数:ダイアログを表示する Frame を指定する。nullならデフォルトのフレームが指定される。 } //----モジュールパス取得 private String getModulePath() { String modulePath = ""; String strPath = System.getProperty("java.class.path"); //ファイル、フォルダ判定 File file = new File(strPath); if (file.isDirectory()) { modulePath = file.getPath() + SEP; // binフォルダ } else { modulePath = file.getPath(); // jarのパス modulePath = modulePath.substring(0, modulePath.lastIndexOf(SEP) + 1); } return modulePath; } /** * スタックトレースを文字列に変換します。
* @param e 例外 * @return スタックトレースの内容 * */ private String cnvStackTrace(Exception e) { // 現在時刻 Date dateNow = new Date(); String strTime = stf.format(dateNow); // HH:mm:SS形式 // 変換 String strRet = e.getMessage() + BR; java.lang.StackTraceElement[] stack = e.getStackTrace(); for (int i=0; i