def test_logrotate_copytruncate(self): from utils.tailfile import TailFile def line_parser(l): self.last_line = l tail = TailFile(logging.getLogger(), self.log_file.name, line_parser) self.assertEquals(tail._size, 0) # Write some data to the log file init_string = "hey there, I am a log\n" self.log_file.write(init_string) self.log_file.flush() # Consume from the tail gen = tail.tail(line_by_line=False, move_end=True) gen.next() # Verify that the tail consumed the data I wrote self.assertEquals(tail._size, len(init_string)) try: # Trigger a copytruncate logrotation on the log file self._trigger_logrotate() # Write a new line to the log file new_string = "I am shorter\n" self.log_file.write(new_string) self.log_file.flush() # Verify that the tail recognized the logrotation gen.next() self.assertEquals(self.last_line, new_string[:-1], self.last_line) except OSError: "logrotate is not present"
class NagiosTailer(object): def __init__(self, log_path, file_template, logger, hostname, event_func, gauge_func, freq, tags=[]): ''' :param log_path: string, path to the file to parse :param file_template: string, format of the perfdata file :param logger: Logger object :param hostname: string, name of the host this agent is running on :param event_func: function to create event, should accept dict :param gauge_func: function to report a gauge :param freq: int, size of bucket to aggregate perfdata metrics :param tags: list, list of custom tags ''' self.log_path = log_path self.log = logger self.gen = None self.tail = None self.hostname = hostname self._event = event_func self._gauge = gauge_func self._line_parsed = 0 self._freq = freq self._tags = tags if file_template is not None: self.compile_file_template(file_template) self.tail = TailFile(self.log, self.log_path, self._parse_line) self.gen = self.tail.tail(line_by_line=False, move_end=True) self.gen.next() def check(self): self._line_parsed = 0 # read until the end of file try: self.log.debug("Start nagios check for file %s" % (self.log_path)) self.gen.next() self.log.debug( "Done nagios check for file %s (parsed %s line(s))" % (self.log_path, self._line_parsed)) except StopIteration as e: self.log.exception(e) self.log.warning("Can't tail %s file" % (self.log_path)) def compile_file_template(self, file_template): try: # Escape characters that will be interpreted as regex bits # e.g. [ and ] in "[SERVICEPERFDATA]" regex = re.sub(r'[[\]*]', r'.', file_template) regex = re.sub(r'\$([^\$]*)\$', r'(?P<\1>[^\$]*)', regex) self.line_pattern = re.compile(regex) except Exception as e: raise InvalidDataTemplate("%s (%s)" % (file_template, e))
class NagiosTailer(object): def __init__(self, log_path, file_template, logger, hostname, event_func, gauge_func, freq): self.log_path = log_path self.log = logger self.gen = None self.tail = None self.hostname = hostname self._event = event_func self._gauge = gauge_func self._line_parsed = 0 self._freq = freq if file_template is not None: self.compile_file_template(file_template) self.tail = TailFile(self.log, self.log_path, self._parse_line) self.gen = self.tail.tail(line_by_line=False, move_end=True) self.gen.next() def check(self): self._line_parsed = 0 try: self.log.debug("Start nagios check for file %s" % (self.log_path)) self.gen.next() self.log.debug( "Done nagios check for file %s (parsed %s line(s))" % (self.log_path, self._line_parsed)) except StopIteration, e: self.log.exception(e) self.log.warning("Can't tail %s file" % (self.log_path))
class NagiosTailer(object): def __init__(self, log_path, file_template, logger, hostname, event_func, gauge_func, freq): ''' :param log_path: string, path to the file to parse :param file_template: string, format of the perfdata file :param logger: Logger object :param hostname: string, name of the host this agent is running on :param event_func: function to create event, should accept dict :param gauge_func: function to report a gauge :param freq: int, size of bucket to aggregate perfdata metrics ''' self.log_path = log_path self.log = logger self.gen = None self.tail = None self.hostname = hostname self._event = event_func self._gauge = gauge_func self._line_parsed = 0 self._freq = freq if file_template is not None: self.compile_file_template(file_template) self.tail = TailFile(self.log, self.log_path, self._parse_line) self.gen = self.tail.tail(line_by_line=False, move_end=True) self.gen.next() def check(self): self._line_parsed = 0 # read until the end of file try: self.log.debug("Start nagios check for file %s" % (self.log_path)) self.gen.next() self.log.debug("Done nagios check for file %s (parsed %s line(s))" % (self.log_path, self._line_parsed)) except StopIteration as e: self.log.exception(e) self.log.warning("Can't tail %s file" % (self.log_path)) def compile_file_template(self, file_template): try: # Escape characters that will be interpreted as regex bits # e.g. [ and ] in "[SERVICEPERFDATA]" regex = re.sub(r'[[\]*]', r'.', file_template) regex = re.sub(r'\$([^\$]*)\$', r'(?P<\1>[^\$]*)', regex) self.line_pattern = re.compile(regex) except Exception as e: raise InvalidDataTemplate("%s (%s)" % (file_template, e))
class NagiosTailer(object): def __init__(self, log_path, file_template, logger, hostname, event_func, gauge_func, freq): ''' :param log_path: string, path to the file to parse :param file_template: string, format of the perfdata file :param logger: Logger object :param hostname: string, name of the host this agent is running on :param event_func: function to create event, should accept dict :param gauge_func: function to report a gauge :param freq: int, size of bucket to aggregate perfdata metrics ''' self.log_path = log_path self.log = logger self.gen = None self.tail = None self.hostname = hostname self._event = event_func self._gauge = gauge_func self._line_parsed = 0 self._freq = freq if file_template is not None: self.compile_file_template(file_template) self.tail = TailFile(self.log, self.log_path, self._parse_line) self.gen = self.tail.tail(line_by_line=False, move_end=True) self.gen.next() def check(self): self._line_parsed = 0 # read until the end of file try: self.log.debug("Start nagios check for file %s" % (self.log_path)) self.gen.next() self.log.debug( "Done nagios check for file %s (parsed %s line(s))" % (self.log_path, self._line_parsed)) except StopIteration, e: self.log.exception(e) self.log.warning("Can't tail %s file" % (self.log_path))
class NagiosTailer(object): def __init__(self, log_path, file_template, logger, hostname, event_func, gauge_func, freq): ''' :param log_path: string, path to the file to parse :param file_template: string, format of the perfdata file :param logger: Logger object :param hostname: string, name of the host this agent is running on :param event_func: function to create event, should accept dict :param gauge_func: function to report a gauge :param freq: int, size of bucket to aggregate perfdata metrics ''' self.log_path = log_path self.log = logger self.gen = None self.tail = None self.hostname = hostname self._event = event_func self._gauge = gauge_func self._line_parsed = 0 self._freq = freq if file_template is not None: self.compile_file_template(file_template) self.tail = TailFile(self.log, self.log_path, self._parse_line) self.gen = self.tail.tail(line_by_line=False, move_end=True) self.gen.next() def check(self): self._line_parsed = 0 # read until the end of file try: self.log.debug("Start nagios check for file %s" % (self.log_path)) self.gen.next() self.log.debug("Done nagios check for file %s (parsed %s line(s))" % (self.log_path, self._line_parsed)) except StopIteration, e: self.log.exception(e) self.log.warning("Can't tail %s file" % (self.log_path))