eclogはパブリックなデータセットのひとつです.そのデータを解析した結果をまとめておきます.

eclogの解析

以下のコードで1分ごとのログ件数を集計した.

package main

import (
    "bufio"
    "encoding/csv"
    "fmt"
    "os"
    "strconv"
    "time"
)

func main() {
    // ログファイルのパス
    logFilePath := "eclog.csv"

    // 結果を保持するマップ
    minuteCounts := make(map[string]int)

    // ファイルを開く
    file, err := os.Open(logFilePath)
    if err != nil {
        fmt.Printf("ファイルを開けませんでした: %v\n", err)
        return
    }
    defer file.Close()

    // CSVリーダーを作成
    reader := csv.NewReader(bufio.NewReader(file))
    reader.Comma = ','

    // ヘッダーをスキップ
    _, err = reader.Read()
    if err != nil {
        fmt.Printf("ヘッダーの読み取りエラー: %v\n", err)
        return
    }

    // 定数: .NET TicksエポックからUNIXエポックへのオフセット (秒単位)
    const ticksToUnixEpochOffset = int64(621355968000000000) // 0001年1月1日から1970年1月1日までのTicks

    // データを読み込みながら処理
    for {
        record, err := reader.Read()
        if err != nil {
            break
        }

        // タイムスタンプを取得し、.NET Ticks形式を変換
        timestampStr := record[2]
        timestampInt, err := strconv.ParseInt(timestampStr, 10, 64)
        if err != nil {
            fmt.Printf("タイムスタンプの変換エラー: %v\n", err)
            continue
        }

        // .NET TicksをUNIX秒に変換
        unixTimestamp := (timestampInt - ticksToUnixEpochOffset) / 10000000
        t := time.Unix(unixTimestamp, 0)

        // 1分単位のキーを生成
        minuteKey := t.Format("2006-01-02 15:04")

        // 集計
        minuteCounts[minuteKey]++
    }

    // 結果を表示
    for minute, count := range minuteCounts {
        fmt.Printf("%s\t%d\n", minute, count)
    }
}

実行方法

min_sorted="summary_1min_sorted.txt"
go run summary_1min.go | sort -rn $min_sorted

1日ごとで集計

日付だけで件数を集計する.datamashが便利なので使った.

awk '{print $1"\t"$3}' < $min_sorted | datamash -g 1 sum 2 | sort -k2 -rn  > summary_1day_sorted.txt
less summary_1day_sorted.txt

ある1日を分析

$ head summary_1day_sorted.txt
2019-12-02  364240
2019-12-11  359519
2019-12-03  346094
2019-12-17  337271
2019-12-10  327883
2019-12-16  321329
2019-12-12  318294
2019-12-09  297149
2019-12-15  288511
2019-12-13  274972

2019-12-02のログを確認してみる.

$ grep "2019-12-02" $min_sorted | sort -n > output
$ awk -F':' '{print $1}' output | sort | uniq -c

  60 2019-12-02 00
  60 2019-12-02 01
  60 2019-12-02 02
  60 2019-12-02 03
  60 2019-12-02 04
  60 2019-12-02 05
  60 2019-12-02 06
  60 2019-12-02 07
  60 2019-12-02 08
  60 2019-12-02 09
  60 2019-12-02 10
  60 2019-12-02 11
  60 2019-12-02 12
  60 2019-12-02 13
  37 2019-12-02 14
  60 2019-12-02 15
  60 2019-12-02 16
  60 2019-12-02 17
  60 2019-12-02 18
  60 2019-12-02 19
  60 2019-12-02 20
  60 2019-12-02 21
  60 2019-12-02 22
  60 2019-12-02 23

→どの日のログをみても14:00(UTC)頃に欠損がある.ほかの日にも同様の時間帯に欠損がある.これは事前に把握しておくほうがよさそう.