Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 28, 2011 13:18:48

fr.butch
От:
Зарегистрирован: 2010-05-20
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

разбор лога jabber и подсчет времени

может кто то мнением поделится =)
нарисовал учет рабочего времени, который считает длительность дня по смене статуса в jabber. просто других служб где велось бы логирование наличия юзера нет (линухи, krb5,ldap,nfs4)

лог выглядит так:

2011-01-24 10:05:12 Received status online from username@domain
2011-01-24 15:26:30 Received status away from username@domain
2011-01-24 15:34:46 Received status online from username@domain
2011-01-24 16:40:49 Received status away from username@domain
2011-01-24 16:41:25 Received status online from username@domain
2011-01-24 18:40:01 Received status away from username@domain
2011-01-24 18:54:00 Received status online from username@domain
2011-01-24 19:44:22 Received status offline from username@domain
2011-01-25 10:17:08 Received status online from username@domain
2011-01-25 14:54:30 Received status away from username@domain
2011-01-25 15:08:33 Received status online from username@domain
2011-01-25 19:41:05 Received status offline from username@domain
тоесть за день статус меняется несколько раз, и необязательно последний статус будет offline.
так что я беру все H:M:S за каждый день, сортирую, беру 1ый и последний и высчитваю между ними разницу.

на выходе получаю что то вроде:
2011-01-22: 6ч 59м. Начало дня: 10:04:12. Конец дня: 17:03:45
2011-01-24: 10ч 27м. Начало дня: 08:49:58. Конец дня: 19:17:13
2011-01-25: 6ч 52м. Начало дня: 11:21:37. Конец дня: 18:14:29
2011-01-26: 11ч 23м. Начало дня: 09:10:54. Конец дня: 20:34:22
2011-01-27: 9ч 16м. Начало дня: 09:06:37. Конец дня: 18:22:42
2011-01-28: 1ч 20м. Начало дня: 09:48:06. Конец дня: 11:08:11
код:
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import datetime, sys

class SumTime:
def __init__(self, file):
self.file = file
self.dates = {}
self.lines = []
self.timedeltas = {}
# get lines from file and split them by spaces
for line in open(self.file, 'r').readlines():
self.lines.append(line.split(' '))
# put in dict ( { some_date: [time1, time2, time3] } )
# times from all lines.
for line in self.lines:
if self.dates.has_key(line[0]):
self.dates[line[0]].append( self.s2t(line[1]) )
else:
self.dates[line[0]] = [ self.s2t(line[1]) ]
self.getdeltas()
self.niceout()

def print_all(self):
print('filename: %s,\n dates dict: %s,\n lines: %s' % (self.file, self.dates, self.lines))

def s2t(self,s):
''' get datetime from string
'''
return datetime.datetime.strptime(s, '%H:%M:%S')

def getdeltas(self):
''' get delta in %H:%M for each day and put it in self.timedeltas
'''
for i in self.dates.keys():
d=sorted(self.dates[i], reverse=True)
# put sorted datetimes back in self.dates
self.dates[i]=d
# delta of start time and end time in sorted with reverse list
self.timedeltas[i]=d[0]-d[-1]
def sec2hm(self,sec):
try:
s=int(sec)
hours=s/(60*60)
m=s%(60*60) / 60
min=s/60
return(u"%sч %sм" % (hours,m))
except:
return(sec)

def niceout(self):
for key in sorted(self.timedeltas.keys()):
print(u'%s: %s. Начало дня: %s. Конец дня: %s' % ( key, self.sec2hm(self.timedeltas[key].seconds),
self.dates[key][-1].strftime('%H:%M:%S'), self.dates[key][0].strftime('%H:%M:%S') ) )


if __name__ == '__main__':
bla=SumTime(sys.argv[1])
ПЫСЫ: стукач детектед



Офлайн

#2 Янв. 28, 2011 16:47:23

fr.butch
От:
Зарегистрирован: 2010-05-20
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

разбор лога jabber и подсчет времени

чтобы хоть какойт о интерес пробудить, опишу основную идею парсера.
я с помощью split(' ') разделяю все строки и помещяю в lines, в итоге в элементе строк сидит дата, а в сидит время смены статуса.

далее беру пустой словарь dates
для каждой строки из lines проверяю есть ли в dates ключ равный дате ( элемент строки) и добавляю к списку значений datetime из элемента строки.

получается словарь вида
{
'2011-01-20': ,
'2011-01-21':
}

и уже по этому словарю довольно легко отсортировать значения для каждого дня, выяснить время первого статуса и последнего и посчитать разницу.

никаких идей?



Офлайн

#3 Янв. 31, 2011 21:30:59

certanista
От:
Зарегистрирован: 2010-10-28
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

разбор лога jabber и подсчет времени

Я тоже над реализацией подобного думал.
Даже не столько над определением продолжительности, сколько качества.
Есть питоновский биндинг к одной библиотеке (http://library.gnome.org/devel/libwnck/stable/), позволяет получить название используемого в данный момент приложения и кое-что еще.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version