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))
Example #2
0
    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))
Example #3
0
    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))
Example #4
0
    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))
Example #5
0
    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']))
Example #6
0
    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']))
Example #7
0
    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
Example #8
0
    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,
        )
Example #9
0
    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))
Example #10
0
 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)
Example #11
0
    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))
Example #12
0
    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))
Example #13
0
 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('    '))