Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
Macのキーとマウスのログから日々の稼働開始〜終了時間を出力する
#!/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]
@tkatochin
Owner

元のmacbooklogという名前を自分はkeymouselogに変更しているから注意。

@tkatochin
Owner

ファイル履歴の取り方が間違っていたので修正。

@tkatochin
Owner

指定月でしか取得できないように修正。
1年以上ログがたまると計算がおかしくなっちゃうから1年経過しているログは削除するようにした。
ただし、keymouselogがrootで実行されているので、sudo付きでこのシェルを起動する必要がある。

@tkatochin
Owner

ファイルがソート済みなんだから最後まで出力をためないで、確定した時に都度出力するようにした。

@tkatochin
Owner

つか保存期間は3ヶ月で十分

@tkatochin
Owner

毎回巨大なログを走査するのが時間の無駄なので、一度走査したファイルは開始と終了時間だけ残して上書きするようにした。2回目以降は爆速になった。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment