pvl/syslog/filter.py
changeset 44 977442ccb72d
child 45 10dfa434da77
equal deleted inserted replaced
43:9d13b101beab 44:977442ccb72d
       
     1 import logging; log = logging.getLogger('pvl.syslog.filter')
       
     2 
       
     3 class SyslogFilter (object) :
       
     4     """
       
     5         Filter syslog messages.
       
     6     """
       
     7 
       
     8     def __init__ (self, prog=None) :
       
     9         """
       
    10             prog        - match tag (process name)
       
    11         """
       
    12 
       
    13         self.prog = prog
       
    14 
       
    15     def match_prog (self, prog) :
       
    16         """
       
    17             Match given prog?
       
    18         """
       
    19 
       
    20         # normalize
       
    21         prog = prog.lower()
       
    22 
       
    23         if prog.startswith('/') :
       
    24             # base
       
    25             prog = prog.split('/')[-1]
       
    26 
       
    27         # match
       
    28         if not prog :
       
    29             # never matches non-tagged lines
       
    30             return False
       
    31 
       
    32         elif self.prog.endswith('*') :
       
    33             # prefix match
       
    34             return prog.startswith(self.prog[:-1])
       
    35 
       
    36         else :
       
    37             return prog == self.prog
       
    38 
       
    39     def filter (self, item) :
       
    40         """
       
    41             Match given item?
       
    42         """
       
    43 
       
    44         if self.prog and not self.match_prog(item['prog']) :
       
    45             log.debug("prog: %s: %r", self.prog, item['prog'])
       
    46 
       
    47         else :
       
    48             # ok
       
    49             return True
       
    50 
       
    51     def __call__ (self, items) :
       
    52         for item in items:
       
    53             if self.filter(item) :
       
    54                 yield item
       
    55