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)頃に欠損がある.ほかの日にも同様の時間帯に欠損がある.これは事前に把握しておくほうがよさそう.