package analyzer; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileFilter; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.text.DateFormat; import java.text.DecimalFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import analyzer.entity.RefererEntity; import analyzer.entity.SummaryEntity; import analyzer.entity.UrlEntity; public class AccessLogAnalyzer { // トレース出力フラグ private static boolean DO_TRACE = false; // アクセスログがあるディレクトリを指定する // 末尾はディレクトリの区切り文字 // このディレクトリの中には.txtファイルのみを配置すること、ディレクトリも置いてはならない private static final String LOG_FILE_DIRECTORY = "E:/work/access_log/"; // 日付(yyyyMMdd)をキーに、urlとrefererのentityをListで保持するLinkedHashMap private static final Map> ENTITY_MAP = new LinkedHashMap>(); // urlをキーに、urlと参照回数を保持するHashMap private static final Map SUMMARY_MAP = new HashMap(); // ログファイル名の正規表現パターン private static final String REGEX = "access_log_[0-9]{8}?.txt"; // ログファイルの文字コード private static final String LOG_ENCODING = "Windows-31J"; // ログファイルの項目区切り文字 private static final String LOG_SPLITTER = "\t"; // ログファイルの1行あたりの項目数 private static final int LOG_ITEM_COUNT = 3; // ログファイルの日付部分の抽出用(不要部分)、HTML生成時のファイル名用 private static final String ACCESS_LOG_NAME_HEADER = "access_log_"; // ログファイルの拡張子 private static final String LOG_EXT = ".txt"; // 空文字 private static final String BLANK = ""; // 半角スペース private static final String SPACE = " "; // 出力HTMLの拡張子 private static final String HTML_EXT = ".html"; // リファラ用出力HTMLの付与文言 private static final String HTML_REFERER_CHAR = "_referer"; // リファラ用出力HTMLの数値カウンタのフォーマット private static final String HTML_COUNTER_FORMAT = "0000"; // リファラ用出力HTMLの数値カウンタのフォーマッター private static final DecimalFormat HTML_COUNTER_FORMATTER = new DecimalFormat(HTML_COUNTER_FORMAT); // リファラ用出力HTMLのタイトル用フォーマット(Parse用) private static final String HTML_TITLE_FORMAT_PARSE = "yyyyMMdd"; // リファラ用出力HTMLのタイトル用フォーマッター(Parse用) private static final DateFormat HTML_TITLE_FORMATTER_PARSE = new SimpleDateFormat(HTML_TITLE_FORMAT_PARSE); // リファラ用出力HTMLのタイトル用フォーマット(Format用) private static final String HTML_TITLE_FORMAT_FORMAT = "yyyy/MM/dd"; // リファラ用出力HTMLのタイトル用フォーマッター(Format用)(index用HTMLのタイトルにも使用) private static final DateFormat HTML_TITLE_FORMATTER_FORMAT = new SimpleDateFormat(HTML_TITLE_FORMAT_FORMAT); // 出力HTMLの出力ディレクトリ名 // LOG_FILE_DIRECTORYの直下にディレクトリを作成する // 末尾はディレクトリの区切り文字 private static final String HTML_DIRECTORY = "html/"; // システムから取得する改行コードのキー private static final String RETURN_CODE_KEY = "line.separator"; // システムから取得する改行コード private static final String RETURN_CODE = System.getProperty(RETURN_CODE_KEY); // 出力HTMLの固定文言「(リファラ無し)」 private static final String HTML_NO_REFERER = "(リファラ無し)"; // 日付ごとのurl一覧出力HTMLのファイル名 private static final String HTML_INDEX = "index.html"; // サマリー用出力HTMLのファイル名 private static final String HTML_SUMMARY = "summary.html"; // 日付ごとのurl一覧出力HTMLのタイトル固定部 private static final String HTML_INDEX_TITLE = "アクセスログ 解析結果 "; // 出力HTMLの固定文言「合計参照回数」 private static final String HTML_REFERED_COUNT_HEADER = "合計参照回数"; // 出力HTMLの固定文言「回」 private static final String HTML_REFERED_COUNT_FOOTER = "回"; // 出力HTMLの固定文言「アクセスログ 解析結果一覧」 private static final String HTML_ACCESS_LOG_LIST = "アクセスログ 解析結果一覧"; // 出力HTMLの固定文言「アクセスログ 解析結果一覧」 private static final String HTML_ACCESS_LOG_LIST_VIEW_TITLE = "アクセスログ 解析結果一覧 生成日 : "; // 出力HTMLの固定文言「アクセスログ リファラ詳細 」 private static final String HTML_ACCESS_LOG_REFERER_DETAIL = "アクセスログ リファラ詳細 "; // 出力HTMLの固定文言「アクセスログ 解析結果一覧 - ページビューのランキング」 private static final String HTML_ACCESS_LOG_SUMMARY_RANKING = "アクセスログ 解析結果一覧 - ページビューのランキング"; // リファラ用HTMLから戻る先のディレクトリ参照 // 末尾はディレクトリの区切り文字 private static final String HTML_ACCESS_LOG_BACK_DIRECTORY = "../"; // 「アクセスログ 解析結果一覧」から戻る先 private static final String HTML_ACCESS_LOG_RETURN_URL = "../../../../index.html"; static { // リファラ用出力HTMLの数値カウンタは整数4桁に固定 HTML_COUNTER_FORMATTER.setMaximumIntegerDigits(HTML_COUNTER_FORMAT.length()); HTML_COUNTER_FORMATTER.setMinimumIntegerDigits(HTML_COUNTER_FORMAT.length()); HTML_COUNTER_FORMATTER.setMaximumFractionDigits(0); HTML_COUNTER_FORMATTER.setMinimumFractionDigits(0); } public static void main(String[] args) { // 対象チェック // Windows環境ではFile#isDirectory()の挙動が怪しいので、File#isFile()を使用する File directory = new File(LOG_FILE_DIRECTORY); if (!directory.exists() || directory.isFile()) { System.err.println("指定されたパスが見つからない、またはディレクトリではありません。"); System.err.println(LOG_FILE_DIRECTORY); System.err.println("処理を終了します。"); return; } // ファイル名の一覧を取得する File[] files = directory.listFiles(new FileFilter() { public boolean accept(File pathname) { // ディレクトリはfalse if (!pathname.isFile()) { return false; } // 対象ディレクトリの中には.txtファイルのみが存在すること String absolutePath = pathname.getAbsolutePath(); if (!absolutePath.endsWith(LOG_EXT)) { return false; } // ファイル名の検査 // access_log_yyyyMMdd.txt形式のフォーマットであること String fileName = absolutePath.substring(absolutePath.lastIndexOf(File.separator) + 1); if (!fileName.matches(REGEX)) { return false; } // 検査が通ればtrue return true; } }); // 全ファイルを読み込み、ENTITY_MAPに格納する // 例外が発生した時点で、全ての処理を中止する for (File file : files) { BufferedReader reader = null; try { reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), LOG_ENCODING)); String line = null; while ((line = reader.readLine()) != null) { // 項目数チェック String[] lineItems = line.split(LOG_SPLITTER); // refererが無い場合も考慮する if (lineItems.length != LOG_ITEM_COUNT && lineItems.length != (LOG_ITEM_COUNT - 1)) { System.err.println("ログファイル内の項目数が不正です。"); System.err.println(file.getAbsolutePath()); System.err.println("処理を終了します。"); return; } // ENTITY_MAPに情報を格納する // キーはログファイル名の日付部分(yyyyMMdd)とする String absolutePath = file.getAbsolutePath(); String key = absolutePath.substring(absolutePath.lastIndexOf(File.separator) + 1); key = key.replaceAll(ACCESS_LOG_NAME_HEADER, BLANK); key = key.replaceAll(LOG_EXT, BLANK); // urlとrefererを保持 String url = lineItems[1]; String referer; try { referer = lineItems[2]; } catch (IndexOutOfBoundsException ex) { referer = BLANK; } // ENTITY_MAPに新規登録 if (!ENTITY_MAP.containsKey(key)) { RefererEntity refererEntity = new RefererEntity(referer, 1); List refererEntityList = new ArrayList(); refererEntityList.add(refererEntity); UrlEntity urlEntity = new UrlEntity(url, refererEntityList); List urlEntityList = new ArrayList(); urlEntityList.add(urlEntity); ENTITY_MAP.put(key, urlEntityList); } else { // 追加時 List urlEntityList = ENTITY_MAP.get(key); // 一致するurlがあるか検索する boolean sameUrlFound = false; for (UrlEntity urlEntity : urlEntityList) { // 一致するurlがある場合 if (url.equals(urlEntity.getUrl())) { // url一致フラグをon sameUrlFound = true; // 一致するrefererがあるか検索する boolean sameRefererFound = false; for (RefererEntity refererEntity : urlEntity.getRefererEntityList()) { // 一致するrefererがある場合 if (referer.equals(refererEntity.getReferer())) { // referer一致フラグをon sameRefererFound = true; // countをインクリメント refererEntity.setCount(refererEntity.getCount() + 1); } // 一致するrefererがある場合、countをインクリメント後にrefererEntityのループをbreak if (sameRefererFound) { break; } } // 一致するrefererがある場合、既にcountをインクリメントしてあるので、urlEntityのループをbreak if (sameRefererFound) { break; } else { // 一致するrefererが無い場合、新規にrefererEntityを作成し、urlEntityが保持するlistにadd RefererEntity refererEntity = new RefererEntity(referer, 1); urlEntity.getRefererEntityList().add(refererEntity); } } } // 一致するurlが無い場合、新規にurlEntityとrefererEntityを作成する if (!sameUrlFound) { RefererEntity refererEntity = new RefererEntity(referer, 1); List refererEntityList = new ArrayList(); refererEntityList.add(refererEntity); UrlEntity urlEntity = new UrlEntity(url, refererEntityList); ENTITY_MAP.get(key).add(urlEntity); } } // SUMMARY_MAPにurlの参照回数を登録する if (SUMMARY_MAP.containsKey(url)) { SUMMARY_MAP.get(url).setCount(SUMMARY_MAP.get(url).getCount() + 1); } else { SUMMARY_MAP.put(url, new SummaryEntity(url, 1)); } } } catch (UnsupportedEncodingException ex) { System.err.println("不正な文字エンコーディング指定です。"); System.err.println(file.getAbsolutePath()); System.err.println("処理を終了します。"); ex.printStackTrace(); return; } catch (FileNotFoundException ex) { System.err.println("対象ファイルが見つかりません。"); System.err.println(file.getAbsolutePath()); System.err.println("処理を終了します。"); ex.printStackTrace(); return; } catch (IOException ex) { System.err.println("ファイル読み取り時に例外が発生しました。"); System.err.println(file.getAbsolutePath()); System.err.println("処理を終了します。"); ex.printStackTrace(); return; } finally { if (reader != null) { try { reader.close(); } catch (IOException ex) { System.err.println("ファイルの後処理で例外が発生しましたが、無視して処理を続行します。"); ex.printStackTrace(); } } } } // ---------------------------------------------------------------------------------------------------- // trace start // ---------------------------------------------------------------------------------------------------- if (DO_TRACE) { for (Iterator>> itr = ENTITY_MAP.entrySet().iterator(); itr.hasNext();) { Entry> entry = itr.next(); System.out.println(entry.getKey()); for (UrlEntity entity : entry.getValue()) { System.out.println(LOG_SPLITTER + entity); } } for (Iterator> itr = SUMMARY_MAP.entrySet().iterator(); itr.hasNext();) { Entry entry = itr.next(); System.out.println(entry.getValue()); } } // ---------------------------------------------------------------------------------------------------- // trace end // ---------------------------------------------------------------------------------------------------- // HTMLの出力ディレクトリを作成する // 既に存在する場合はエラーとする String htmlDirectoryName = LOG_FILE_DIRECTORY + HTML_DIRECTORY.substring(0, HTML_DIRECTORY.length() - 1); File htmlDirectory = new File(htmlDirectoryName); if (htmlDirectory.exists()) { // 存在する場合は、対象がファイルかディレクトリかを検査して、警告を出して終了 if (htmlDirectory.isFile()) { System.err.println("ディレクトリを作成できません。以下のディレクトリにあるファイル[" + HTML_DIRECTORY.substring(0, HTML_DIRECTORY.length() - 1) + "]を削除して下さい。"); System.err.println(LOG_FILE_DIRECTORY); System.err.println("処理を終了します。"); return; } else { System.err.println("以下のディレクトリにディレクトリ[" + HTML_DIRECTORY.substring(0, HTML_DIRECTORY.length() - 1) + "]が既に存在します。"); System.err.println(LOG_FILE_DIRECTORY); System.err.println("処理を終了します。"); return; } } if (!htmlDirectory.mkdir()) { System.err.println("以下のディレクトリにディレクトリ[" + HTML_DIRECTORY.substring(0, HTML_DIRECTORY.length() - 1) + "]を作成しようとして失敗しました。"); System.err.println(LOG_FILE_DIRECTORY); System.err.println("処理を終了します。"); return; } // 全体index用HTMLの出力 BufferedWriter indexWriter = null; // これが出力される全体index用HTMLの絶対パス File indexHtml = new File(LOG_FILE_DIRECTORY + HTML_DIRECTORY + HTML_INDEX); // サマリー用HTMLの出力 BufferedWriter summaryWriter = null; // これが出力されるサマリー用HTMLの絶対パス File summaryHtml = new File(LOG_FILE_DIRECTORY + HTML_DIRECTORY + HTML_SUMMARY); try { // writer定義 indexWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(indexHtml, true), LOG_ENCODING)); // indexのhtml出力(固定部) indexWriter.write(createHtmlHeader4Index()); // 日付ごとの総アクセス数を保持 int countByDay = 0; // アクセスログの総件数 int totalAccessCount = 0; // ENTITY_MAPのキーのカウンタ int listCounter = 1; // ENTITY_MAPのキーの件数(すなわち日付の件数)だけループ、HTMLを出力する for (Iterator>> itr = ENTITY_MAP.entrySet().iterator(); itr.hasNext();) { Entry> entry = itr.next(); // ENTITY_MAPのキーはyyyyMMddで格納されている String key = entry.getKey(); // yyyyMMddをyyyy/MM/ddに変換しておく String yyyyMMdd = HTML_TITLE_FORMATTER_FORMAT.format(HTML_TITLE_FORMATTER_PARSE.parse(key)); // htmlディレクトリ直下にyyyyMMddのディレクトリを作成する File yyyyMmddDirectory = new File(LOG_FILE_DIRECTORY + HTML_DIRECTORY + key); if (!yyyyMmddDirectory.mkdir()) { System.err.println("以下のディレクトリにディレクトリ[" + key + "]を作成しようとして失敗しました。"); System.err.println(LOG_FILE_DIRECTORY + HTML_DIRECTORY); System.err.println("処理を終了します。"); return; } // 絶対パスで定義 String htmlDefaultName = LOG_FILE_DIRECTORY + HTML_DIRECTORY + key + File.separator + ACCESS_LOG_NAME_HEADER + key; // リファラー用HTMLのファイル名のカウンタ int count = 1; // urlEntityListをソートする List urlEntityList = entry.getValue(); Collections.sort(urlEntityList, new Comparator() { public int compare(UrlEntity o1, UrlEntity o2) { int o1Count = 0; for (RefererEntity refererEntity : o1.getRefererEntityList()) { o1Count += refererEntity.getCount(); } int o2Count = 0; for (RefererEntity refererEntity : o2.getRefererEntityList()) { o2Count += refererEntity.getCount(); } // ページビューが同一であれば、urlで昇順ソート // ページビューが異なれば、参照回数で降順ソート return o1Count == o2Count ? o1.getUrl().compareTo(o2.getUrl()) : o1Count < o2Count ? 1 : -1; } }); // これが出力される日付ごとのindex用HTMLの絶対パス File urlHtml = new File(LOG_FILE_DIRECTORY + HTML_DIRECTORY + key + File.separator + HTML_INDEX); // 日付ごとのindex用HTMLの出力 // 1つの日付に対して、n件のurlを出力 BufferedWriter urlWriter = null; try { // writer定義 urlWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(urlHtml, true), LOG_ENCODING)); // urlのhtml出力(固定部) String urlTitle = HTML_INDEX_TITLE + yyyyMMdd; urlWriter.write(createHtmlHeader4Url(urlTitle, yyyyMMdd)); // urlごとの合計件数を保持する int urlTotalCount = 0; // urlの件数カウンタ int urlCount = 1; // その日付で参照されたURLの数だけループ for (UrlEntity urlEntity : urlEntityList) { String url = urlEntity.getUrl(); String htmlCounter = HTML_COUNTER_FORMATTER.format(count); // これが出力されるリファラ用HTMLの絶対パス File refererHtml = new File(htmlDefaultName + HTML_REFERER_CHAR + htmlCounter + HTML_EXT); // urlが参照された回数 int urlReferedCount = 0; for (RefererEntity refererEntity : urlEntity.getRefererEntityList()) { urlReferedCount += refererEntity.getCount(); } // urlのhtml出力(データ部) String refererHtmlFileName = refererHtml.getAbsolutePath().substring(refererHtml.getAbsolutePath().lastIndexOf(File.separator) + 1); urlWriter.write(createHtmlData4Url(htmlCounter, urlCount, urlEntity, urlReferedCount, refererHtmlFileName)); // リファラ用HTMLの出力 // 1つのurlに対して、n件のリファラを出力 BufferedWriter refererWriter = null; try { // writer定義 refererWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(refererHtml, true), LOG_ENCODING)); // refererのhtml出力(固定部) refererWriter.write(createHtmlHeader4Referer(yyyyMMdd, url)); // refererEntityListを参照回数で降順にソートする List refererEntityList = urlEntity.getRefererEntityList(); Collections.sort(refererEntityList, new Comparator() { public int compare(RefererEntity o1, RefererEntity o2) { return o1.getCount() == o2.getCount() ? 0 : o1.getCount() < o2.getCount() ? 1 : -1; } }); // リファラごとの合計件数を保持する int refererTotalCount = 0; // リファラの件数カウンタ int refererCount = 1; // 参照されたURLに対するリファラと参照回数の出力 for (RefererEntity refererEntity : refererEntityList) { countByDay += refererEntity.getCount(); totalAccessCount += refererEntity.getCount(); urlTotalCount += refererEntity.getCount(); refererTotalCount += refererEntity.getCount(); // refererのhtml出力(データ部) refererWriter.write(createHtmlData4Referer(refererEntity, refererCount)); refererCount++; } // refererのhtml出力(固定部) refererWriter.write(createHtmlFooter4Referer(refererTotalCount, htmlCounter)); } catch (IOException ex) { System.err.println("以下のファイルの出力に失敗しました。"); System.err.println(refererHtml.getAbsolutePath()); System.err.println("処理を終了します。"); ex.printStackTrace(); return; } finally { if (refererWriter != null) { try { refererWriter.flush(); refererWriter.close(); } catch (IOException ex) { System.err.println("ファイルの後処理で例外が発生しましたが、無視して処理を続行します。"); ex.printStackTrace(); } } } // リファラ用HTMLカウンタのインクリメント count++; // urlの件数カウンタのインクリメント urlCount++; } // urlのhtml出力(固定部) urlWriter.write(createHtmlFooter4Url(urlTotalCount, key)); } catch (IOException ex) { System.err.println("以下のファイルの出力に失敗しました。"); System.err.println(urlHtml.getAbsolutePath()); System.err.println("処理を終了します。"); ex.printStackTrace(); return; } finally { if (urlWriter != null) { try { urlWriter.flush(); urlWriter.close(); } catch (IOException ex) { System.err.println("ファイルの後処理で例外が発生しましたが、無視して処理を続行します。"); ex.printStackTrace(); } } } // indexのhtml出力(データ部) indexWriter.write(createHtmlData4Index(key, listCounter, yyyyMMdd, countByDay)); // 日付ごとの総アクセス数を初期化 countByDay = 0; listCounter++; } // indexのhtml出力(固定部) indexWriter.write(createHtmlFooter4Index(totalAccessCount)); // writer定義 summaryWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(summaryHtml, true), LOG_ENCODING)); // サマリーのhtml出力(固定部) summaryWriter.write(createHtmlHeader4Summary()); // SummaryEntityをList化してソートする List summaryEntityList = new ArrayList(SUMMARY_MAP.values()); Collections.sort(summaryEntityList, new Comparator() { public int compare(SummaryEntity o1, SummaryEntity o2) { // ページビューが同一であれば、urlで昇順ソート // ページビューが異なれば、参照回数で降順ソート return o1.getCount() == o2.getCount() ? o1.getUrl().compareTo(o2.getUrl()) : o1.getCount() < o2.getCount() ? 1 : -1; } }); // サマリーのhtml出力(データ部) summaryWriter.write(createHtmlData4Summary(summaryEntityList)); // サマリーのhtml出力(固定部) summaryWriter.write(createHtmlFooter4Summary(totalAccessCount)); } catch (ParseException ex) { // 発生しないはず System.err.println("日付項目の変換で例外が発生しました。"); System.err.println("処理を終了します。"); ex.printStackTrace(); return; } catch (IOException ex) { System.err.println("以下のファイルの出力に失敗しました。"); System.err.println(indexHtml.getAbsolutePath()); System.err.println("処理を終了します。"); ex.printStackTrace(); return; } finally { if (indexWriter != null) { try { indexWriter.flush(); indexWriter.close(); } catch (IOException ex) { System.err.println("ファイルの後処理で例外が発生しましたが、無視して処理を続行します。"); ex.printStackTrace(); } } if (summaryWriter != null) { try { summaryWriter.flush(); summaryWriter.close(); } catch (IOException ex) { System.err.println("ファイルの後処理で例外が発生しましたが、無視して処理を続行します。"); ex.printStackTrace(); } } } } private static String createHtmlHeader4Summary() { return new StringBuffer() .append("" + RETURN_CODE) .append("" + RETURN_CODE) .append("" + RETURN_CODE) .append("" + HTML_ACCESS_LOG_SUMMARY_RANKING + "" + RETURN_CODE) .append("" + RETURN_CODE) .append("" + RETURN_CODE) .append("" + RETURN_CODE) .append("" + RETURN_CODE) .append("
" + RETURN_CODE) .append("" + HTML_ACCESS_LOG_SUMMARY_RANKING + "" + RETURN_CODE) .append("
" + RETURN_CODE) .append("
" + RETURN_CODE) .append("アクセスログの解析結果より、ページビューを上位より抽出した一覧です。
" + RETURN_CODE) .append("第一ソートキーはアクセス数で降順ソート、第二ソートキーはURLで昇順ソートになっています。
" + RETURN_CODE) .append("
" + RETURN_CODE) .append("URLは別ウィンドウで開きます。
" + RETURN_CODE) .append("
" + RETURN_CODE) .append("
" + RETURN_CODE) .append("" + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append("
" + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .toString(); } private static String createHtmlData4Summary(List summaryEntityList) { StringBuffer htmlBuffer = new StringBuffer(); int i = 1; for (SummaryEntity summaryEntity: summaryEntityList) { htmlBuffer .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE); i++; } return htmlBuffer.toString(); } private static String createHtmlFooter4Summary(int totalAccessCount) { return new StringBuffer() .append(" " + RETURN_CODE) .append("
No.URLアクセス数
" + i + "" + summaryEntity.getUrl() + "" + summaryEntity.getCount() + "
" + RETURN_CODE) .append("
" + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append("
" + HTML_REFERED_COUNT_HEADER + SPACE + totalAccessCount + HTML_REFERED_COUNT_FOOTER + "
" + RETURN_CODE) .append("
" + RETURN_CODE) .append("
" + RETURN_CODE) .append("" + RETURN_CODE) .append("
" + RETURN_CODE) .append("
" + RETURN_CODE) .append("
" + RETURN_CODE) .append("
戻る
" + RETURN_CODE) .append("" + RETURN_CODE) .toString(); } private static String createHtmlHeader4Index() { return new StringBuffer() .append("" + RETURN_CODE) .append("" + RETURN_CODE) .append("" + RETURN_CODE) .append("" + HTML_ACCESS_LOG_LIST + "" + RETURN_CODE) .append("" + RETURN_CODE) .append("" + RETURN_CODE) .append("" + RETURN_CODE) .append("" + RETURN_CODE) .append("
" + RETURN_CODE) .append("" + HTML_ACCESS_LOG_LIST_VIEW_TITLE + HTML_TITLE_FORMATTER_FORMAT.format(new Date()) +"" + RETURN_CODE) .append("
" + RETURN_CODE) .append("
" + RETURN_CODE) .append("アクセスログの解析結果の一覧です。
" + RETURN_CODE) .append("参照回数をクリックすることで、日付ごとのアクセスされたURL一覧が参照できます。
" + RETURN_CODE) .append("
" + RETURN_CODE) .append("ページビューごとのランキングは「" + HTML_SUMMARY + "」を参照して下さい。
" + RETURN_CODE) .append("
" + RETURN_CODE) .append("
" + RETURN_CODE) .append("" + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append("
" + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .toString(); } private static String createHtmlData4Index(String key, int listCounter, String yyyyMMdd, int countByDay) { return new StringBuffer() .append(" " + RETURN_CODE) .append(" "+ RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .toString(); } private static String createHtmlFooter4Index(int totalAccessCount) { return new StringBuffer() .append(" " + RETURN_CODE) .append("
No.日付アクセス数
" + listCounter + "" + yyyyMMdd + "のアクセスログ" + countByDay + "
" + RETURN_CODE) .append("
" + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append("
" + HTML_REFERED_COUNT_HEADER + SPACE + totalAccessCount + HTML_REFERED_COUNT_FOOTER + "
" + RETURN_CODE) .append("
" + RETURN_CODE) .append("
" + RETURN_CODE) .append("" + RETURN_CODE) .append("
" + RETURN_CODE) .append("
" + RETURN_CODE) .append("
" + RETURN_CODE) .append("
戻る
" + RETURN_CODE) .append("" + RETURN_CODE) .toString(); } private static String createHtmlHeader4Url(String title, String yyyyMMdd) { return new StringBuffer() .append("" + RETURN_CODE) .append("" + RETURN_CODE) .append("" + RETURN_CODE) .append("" + title + "" + RETURN_CODE) .append("" + RETURN_CODE) .append("" + RETURN_CODE) .append("" + RETURN_CODE) .append("" + RETURN_CODE) .append("
" + RETURN_CODE) .append("" + title + "" + RETURN_CODE) .append("
" + RETURN_CODE) .append("
" + RETURN_CODE) .append(yyyyMMdd + "のアクセスログ一覧です。
" + RETURN_CODE) .append("参照回数をクリックすることで、対象URLに対するリファラ一覧が参照できます。
" + RETURN_CODE) .append("
" + RETURN_CODE) .append("URLは別ウィンドウで開きます。
" + RETURN_CODE) .append("
" + RETURN_CODE) .append("
" + RETURN_CODE) .append("" + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append("
" + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .toString(); } private static String createHtmlData4Url(String htmlCounter, int urlCount, UrlEntity urlEntity, int urlReferedCount, String refererHtmlFileName) { return new StringBuffer() .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .toString(); } private static String createHtmlFooter4Url(int totalCount, String key) { return new StringBuffer() .append(" " + RETURN_CODE) .append("
No.URL参照回数
" + urlCount + "" + urlEntity.getUrl() + "" + urlReferedCount + "
" + RETURN_CODE) .append("
" + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append("
" + HTML_REFERED_COUNT_HEADER + SPACE + totalCount + HTML_REFERED_COUNT_FOOTER + "
" + RETURN_CODE) .append("
" + RETURN_CODE) .append("
" + RETURN_CODE) .append("
" + RETURN_CODE) .append("
" + RETURN_CODE) .append("
" + RETURN_CODE) .append("
戻る
" + RETURN_CODE) .append("" + RETURN_CODE) .append("" + RETURN_CODE) .toString(); } private static String createHtmlHeader4Referer(String yyyyMMdd, String url) { return new StringBuffer() .append("" + RETURN_CODE) .append("" + RETURN_CODE) .append("" + RETURN_CODE) .append("" + HTML_ACCESS_LOG_REFERER_DETAIL + "" + RETURN_CODE) .append("" + RETURN_CODE) .append("" + RETURN_CODE) .append("" + RETURN_CODE) .append("" + RETURN_CODE) .append("
" + RETURN_CODE) .append("" + HTML_ACCESS_LOG_REFERER_DETAIL + "" + RETURN_CODE) .append("
" + RETURN_CODE) .append("
" + RETURN_CODE) .append("" + url + "
" + RETURN_CODE) .append(yyyyMMdd + "に上記URLにアクセスされた際のリファラ一覧です。
" + RETURN_CODE) .append("
" + RETURN_CODE) .append("リンクは全て別ウィンドウで開きます。
" + RETURN_CODE) .append("
" + RETURN_CODE) .append("
" + RETURN_CODE) .append("" + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append("
" + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .toString(); } private static String createHtmlData4Referer(RefererEntity refererEntity, int refererCount) { return new StringBuffer() .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(BLANK.equals(refererEntity.getReferer()) ? " " + RETURN_CODE : " " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .toString(); } private static String createHtmlFooter4Referer(int totalCount, String htmlCounter) { return new StringBuffer() .append(" " + RETURN_CODE) .append("
No.リファラ参照回数
" + refererCount + "" + HTML_NO_REFERER + "" + refererEntity.getReferer() + "" + refererEntity.getCount() + "
" + RETURN_CODE) .append("
" + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append(" " + RETURN_CODE) .append("
" + HTML_REFERED_COUNT_HEADER + SPACE + totalCount + HTML_REFERED_COUNT_FOOTER + "
" + RETURN_CODE) .append("
" + RETURN_CODE) .append("
" + RETURN_CODE) .append("
" + RETURN_CODE) .append("
" + RETURN_CODE) .append("
" + RETURN_CODE) .append("
戻る
" + RETURN_CODE) .append("" + RETURN_CODE) .append("" + RETURN_CODE) .toString(); } }