5281b081849a51a9257947fbb05c569c292b5ef7
[apachelog.git] / apachelog / processor / time.py
1 import datetime as _datetime
2
3 from ..date import parse_time as _parse_time
4 from . import Processor as _Processor
5
6
7 class LogTimeProcessor (_Processor):
8     r"""Track the initial and final request times.
9
10     >>> import StringIO
11     >>> from apachelog.parser import Parser, FORMATS
12     >>> from apachelog.processor import Processor, process
13     >>> class PrintLogTimeProcessor (Processor):
14     ...     def __init__(self, log_time_processor):
15     ...         self.log_time_processor = log_time_processor
16     ...     def process(self, data):
17     ...         print('{}: {}'.format(data['%t'], self.log_time_processor.last_time))
18     >>> stream = StringIO.StringIO('\n'.join([
19     ...         '192.168.0.1 - - [18/Feb/2012:10:25:43 -0500] "GET / HTTP/1.1" 200 561 "-" "Mozilla/5.0 (...)"',
20     ...         '192.168.0.2 - - [18/Feb/2012:10:25:58 -0500] "GET / HTTP/1.1" 200 561 "-" "Mozilla/5.0 (...)"',
21     ...         ]))
22     >>> parser = Parser(FORMATS['extended'])
23     >>> ltp = LogTimeProcessor()
24     >>> processors = [ltp, PrintLogTimeProcessor(ltp)]
25     >>> process(stream, parser, processors)
26     [18/Feb/2012:10:25:43 -0500]: 2012-02-18 10:25:43-05:00
27     [18/Feb/2012:10:25:58 -0500]: 2012-02-18 10:25:58-05:00
28     >>> ltp.total_seconds()
29     15.0
30     """
31     def __init__(self):
32         self.last_time = self.start_time = self.stop_time = None
33
34     def process(self, data):
35         time = _parse_time(data['%t'])
36         self.last_time = time  # for use by subclasses or other processors
37         if self.start_time is None or time < self.start_time:
38             self.start_time = time
39         if self.stop_time is None or time > self.stop_time:
40             self.stop_time = time
41
42     def total_seconds(self):
43         if self.start_time is None:
44             return 0
45         dt = self.stop_time - self.start_time
46         return dt.total_seconds()