Macのキーとマウスのログから日々の稼働開始〜終了時間を出力する
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
# -*- coding: utf-8 -*- | |
# こちら↓の成果のログから稼働開始〜終了時間を出力する | |
# http://qiita.com/edvakf@github/items/721afa8d2e69c556ba64 | |
import sys | |
import os | |
import glob | |
import datetime | |
from datetime import datetime, timedelta | |
if len(sys.argv) != 2: | |
print "Usage: {0} [Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec]".format(sys.argv[0]) | |
quit() | |
targetMonth = sys.argv[1] | |
time_min_per_day = {} | |
time_max_per_day = {} | |
row_min_per_day = {} | |
row_max_per_day = {} | |
files = glob.glob('/var/log/keymouselog.log*') | |
files.sort() | |
current_file = files[0] | |
del files[0] | |
files.append(current_file) | |
last_key = "" | |
last_month = "" | |
last_path = "" | |
keys = [] | |
for path in files: | |
# 3ヶ月より前のローテートログは削除する(被っちゃうから)でもsudoで実行してね。 | |
if ".T" in path: | |
pathParts = path.split(".T") | |
rotate_time = long(pathParts[1] + "l") | |
rotate_time = datetime.fromtimestamp(rotate_time) | |
one_year_ago_time = datetime.now() - timedelta(31*3) | |
if rotate_time < one_year_ago_time: | |
os.remove(path) | |
continue | |
# 読み取り実行 | |
f = open(path, "r") | |
last_path = path | |
keys = [] | |
for row in f: | |
rowParts = row.split(" ") | |
if "" in rowParts: | |
rowParts.remove(""); | |
month = rowParts[0] | |
day = rowParts[1] | |
time = rowParts[2] | |
key = "{0} {1:>2}".format(month, day) | |
if key not in keys: | |
keys.append(key) | |
if time_min_per_day.has_key(key): | |
min = time_min_per_day[key] | |
if time < min: | |
time_min_per_day[key] = time | |
row_min_per_day[key] = row | |
else: | |
time_min_per_day[key] = time | |
row_min_per_day[key] = row | |
if "" != last_key: | |
if last_month == targetMonth: | |
print last_key + "\t\t" + time_min_per_day[last_key] + " - " + time_max_per_day[last_key] | |
if time_max_per_day.has_key(key): | |
max = time_max_per_day[key] | |
if time > max: | |
time_max_per_day[key] = time | |
row_max_per_day[key] = row | |
else: | |
time_max_per_day[key] = time | |
row_max_per_day[key] = row | |
last_key = key | |
last_month = month | |
f.close() | |
#過去のキーログは圧縮 | |
if ".T" in path: | |
os.remove(path) | |
f = open(path, "w") | |
for key in keys: | |
if row_min_per_day.has_key(key): | |
f.write(row_min_per_day[key]) | |
if row_max_per_day.has_key(key): | |
f.write(row_max_per_day[key]) | |
f.close() | |
if "" != last_key: | |
if last_month == targetMonth: | |
print last_key + "\t\t" + time_min_per_day[last_key] + " - " + time_max_per_day[last_key] |
つか保存期間は3ヶ月で十分
毎回巨大なログを走査するのが時間の無駄なので、一度走査したファイルは開始と終了時間だけ残して上書きするようにした。2回目以降は爆速になった。
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
ファイルがソート済みなんだから最後まで出力をためないで、確定した時に都度出力するようにした。