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