# :coding: utf-8
# :copyright: Copyright (c) 2013 Martin Pengelly-Phillips
# :license: See LICENSE.txt.
import sawmill
from .base import Filterer
[docs]class Level(Filterer):
'''Filter logs according to defined log level limits.'''
[docs] def __init__(self, min='info', max=None, levels=sawmill.levels):
'''Initialise filterer with *min* and *max* levels.
The values must be taken from passed *levels* array. If the value given
is None then it will be as if there is not limit.
A :py:class:`~sawmill.log.Log` level value must fall between (inclusive)
the *min* and *max* values.
'''
super(Level, self).__init__()
self.min = min
self.max = max
self.levels = levels
[docs] def filter(self, logs):
'''Return *logs* whose level is between the defined range.
.. note::
If a log has no level information (or a level not present in the
current levels array) it will pass the filter successfully.
'''
passed = []
for log in logs:
level = log.get('level')
# If level information not present then pass filter.
if level is None:
passed.append(log)
continue
# If level value not recognised, play safe and pass filter.
try:
level_index = self.levels.index(level)
except ValueError:
passed.append(log)
continue
# Check against defined range.
if self.min is not None:
min_index = self.levels.index(self.min)
if level_index < min_index:
continue
if self.max is not None:
max_index = self.levels.index(self.max)
if level_index > max_index:
continue
passed.append(log)
return passed