def test_copytruncate(self): tail = FileTail(filename=self.test_log) lines = ["line %d" % i for i in range(5)] for line in lines: self.write_log(line) assert_that(tail.readlines(), equal_to(lines)) # mock copytruncate mechanic copyfile(self.test_log, self.test_log_rotated) with open(self.test_log, 'w') as file_to_truncate: file_to_truncate.truncate() next_lines = ["line %d" % i for i in range(5, 10)] for line in next_lines: self.write_log(line) # check offset is updated to the beginning assert_that(tail.readlines(), equal_to(next_lines)) # resume normal behavior final_lines = ["line %d" % i for i in range(10, 15)] for line in final_lines: self.write_log(line) assert_that(tail.readlines(), equal_to(final_lines))
def test_read_new_lines(self): tail = FileTail(filename=self.test_log) # write messages and read them for i in xrange(10): line = "this is %s line" % i self.write_log(line) new_lines = tail.readlines() assert_that(new_lines, has_length(1)) assert_that(new_lines.pop(), equal_to(line))
def test_cache_offset(self): tail = FileTail(filename=self.test_log) self.write_log('something') tail.readlines() old_offset = tail._offset # del tail object del tail # create new tail = FileTail(filename=self.test_log) assert_that(tail._offset, equal_to(old_offset))
def test_rotate(self): tail = FileTail(filename=self.test_log) # rotate it os.rename(self.test_log, self.test_log_rotated) # write something in a new one self.write_log("from a new file") # read tail and get two lines new_lines = tail.readlines() assert_that(new_lines, has_length(1)) assert_that(new_lines, equal_to(['from a new file']))
def __setup_pipeline(self, name): """ Sets up a pipeline/tail object for a collector based on "filename". :param name: Str :return: Pipeline """ tail = None try: if name.startswith('syslog'): address_bucket = name.split(',', 1)[0] host, port, address = net.ipv4_address( address=address_bucket.split('=')[1], full_format=True, silent=True) # Right now we assume AFNET address/port...e.g. no support for unix sockets if address in context.listeners: port = int(port) # socket requires integer port tail = SyslogTail(address=(host, port)) else: tail = FileTail(name) except Exception as e: context.log.error( 'failed to initialize pipeline for "%s" due to %s (maybe has no rights?)' % (name, e.__class__.__name__)) context.log.debug('additional info:', exc_info=True) return tail
def __init__(self, filename=None, log_format=None, tail=None, **kwargs): super(NginxAccessLogsCollector, self).__init__(**kwargs) self.filename = filename self.parser = NginxAccessLogParser(log_format) self.tail = tail if tail is not None else FileTail(filename) self.filters = [] # skip empty filters and filters for other log file for log_filter in self.object.filters: if log_filter.empty: continue if log_filter.filename and log_filter.filename != self.filename: continue self.filters.append(log_filter) self.register( self.http_method, self.http_status, self.http_version, self.request_length, self.body_bytes_sent, self.bytes_sent, self.gzip_ration, self.request_time, self.upstreams, )
def test_no_new_lines(self): # check one new line tail = FileTail(filename=self.test_log) self.write_log('something') new_lines = tail.readlines() assert_that(new_lines, has_length(1)) # check no new lines new_lines = tail.readlines() assert_that(new_lines, has_length(0)) # and check again one new line tail = FileTail(filename=self.test_log) self.write_log('something') new_lines = tail.readlines() assert_that(new_lines, has_length(1))
def __init__(self, filename=None, level=None, log_format=None, tail=None, **kwargs): super(NginxErrorLogsCollector, self).__init__(**kwargs) self.filename = filename self.level = level self.parser = NginxErrorLogParser() self.tail = tail if tail is not None else FileTail(filename) self.register(self.error_log_parsed)
def test_keeps_trailing_spaces(self): tail = FileTail(filename=self.test_log) self.write_log('foo bar baz ') lines = tail.readlines() assert_that(lines, has_length(1)) assert_that(lines[0], ends_with(' '))