def test_overlap(self): """ 2 dogs can watch the same file """ DOGS = { 'test1': { 'paths': ['a.log'], 'includes': ['error', 'wrong'], 'handler': self.handler }, 'test2': { 'paths': ['a.log'], 'includes': ['warning', 'wrong'], 'handler': self.handler } } f = self.open('a.log') logdogs = LogDogs(DOGS) self.write(f, 'an error\n') logdogs.process() self.assertEqual(self.q.get_nowait(), ['an error\n']) self.write(f, 'a warning\n') logdogs.process() self.assertEqual(self.q.get_nowait(), ['a warning\n']) self.assertTrue(self.q.empty()) self.write(f, 'something wrong\n') logdogs.process() # received 2 times self.assertEqual(self.q.get_nowait(), ['something wrong\n']) self.assertEqual(self.q.get_nowait(), ['something wrong\n'])
def test_1_file(self): """ the simplest case """ DOGS = { 'test': { 'paths': ['a.log'], 'includes': ['wrong'], 'excludes': ['long'], 'handler': self.handler } } f = self.open('a.log') logdogs = LogDogs(DOGS) self.write(f, 'hello world\n') logdogs.process() self.assertTrue(self.q.empty()) self.write(f, 'something wrong\nwhats wrong\n') logdogs.process() self.assertEqual(self.q.get_nowait(), ['something wrong\n', 'whats wrong\n']) self.write(f, 'a long wrong answer\n') logdogs.process() self.assertTrue(self.q.empty())
def test_2_not_exists(self): """ bug: the same dog watch the same path(.) twice """ DOGS = { 'test': { 'paths': ['a.log', 'b.log'], 'includes': ['wrong'], 'handler': self.handler } } logdogs = LogDogs(DOGS) # create file after watch f = self.open('a.log') self.write(f, 'something wrong\n') logdogs.process() self.assertEqual(self.q.get_nowait(), ['something wrong\n'])
def test_not_exists(self): """ log file is not required to exist before watch """ DOGS = { 'test': { 'paths': ['a.log'], 'includes': ['wrong'], 'handler': self.handler } } logdogs = LogDogs(DOGS) # create file after watch f = self.open('a.log') self.write(f, 'something wrong\n') logdogs.process() self.assertEqual(self.q.get_nowait(), ['something wrong\n'])
def test_2_files(self): """ a dog can watch more than 1 files """ DOGS = { 'test': { 'paths': ['a.log', 'b.log'], 'includes': ['wrong'], 'handler': self.handler } } f1 = self.open('a.log') f2 = self.open('b.log') logdogs = LogDogs(DOGS) self.write(f1, 'something wrong\n') self.write(f2, 'whats wrong\n') logdogs.process() self.assertEqual(self.q.get_nowait(), ['something wrong\n']) self.assertEqual(self.q.get_nowait(), ['whats wrong\n'])
def test_rotate(self): """ log file is moved and a new one is created """ DOGS = { 'test': { 'paths': ['a.log'], 'includes': ['wrong'], 'handler': self.handler } } f = self.open('a.log') logdogs = LogDogs(DOGS) self.write(f, 'something wrong\n') logdogs.process() self.assertEqual(self.q.get_nowait(), ['something wrong\n']) shutil.move('a.log', 'b.log') self.write(f, 'whats wrong\n') # nginx will still log to old log file before reopen signal is handled # in some cases the last few logs are missing # write to new file immediately f = self.open('a.log') self.write(f, 'all is wrong\n') logdogs.process() self.assertEqual(self.q.get_nowait(), ['whats wrong\n']) self.assertEqual(self.q.get_nowait(), ['all is wrong\n'])
def test_glob_recursively(self): """ ** can be used in glob pattern """ DOGS = { 'test': { 'paths': ['logs/**/*.log'], 'includes': ['wrong'], 'handler': self.handler } } os.makedirs('logs/b') os.makedirs('logs/c') fa = self.open('logs/a.log') fb = self.open('logs/b/b.log') logdogs = LogDogs(DOGS) self.write(fa, 'something wrong\n') logdogs.process() self.assertEqual(self.q.get_nowait(), ['something wrong\n']) self.write(fb, 'you are wrong\n') logdogs.process() self.assertEqual(self.q.get_nowait(), ['you are wrong\n']) # create a new log file fc = self.open('logs/c/c.log') self.write(fc, 'Am I wrong?\n') logdogs.process() self.assertEqual(self.q.get_nowait(), ['Am I wrong?\n']) # create a new sub-directory os.makedirs('logs/d') fd = self.open('logs/d/d.log') self.write(fd, 'wrong! wrong! wrong!\n') logdogs.process() self.assertEqual(self.q.get_nowait(), ['wrong! wrong! wrong!\n'])
def test_half_line(self): """ bug: half line will be read if the log is being written at the same time """ DOGS = { 'test': { 'paths': ['a.log'], 'includes': ['wrong'], 'handler': self.handler } } # create an empty file or truncate if it exists f = self.open('a.log') logdogs = LogDogs(DOGS) self.write(f, 'something w') logdogs.process() self.assertTrue(self.q.empty()) self.write(f, 'rong\n') logdogs.process() self.assertEqual(self.q.get_nowait(), ['something wrong\n'])
def test_ignore_old_logs(self): """ old logs in the log file are ignored """ DOGS = { 'test': { 'paths': ['a.log'], 'includes': ['wrong'], 'handler': self.handler } } f = self.open('a.log') self.write(f, 'you are on a wrong way\n') logdogs = LogDogs(DOGS) self.write(f, 'hello world\n') logdogs.process() self.assertTrue(self.q.empty()) self.write(f, 'something wrong\n') logdogs.process() self.assertEqual(self.q.get_nowait(), ['something wrong\n'])
def test_glob(self): """ glob pattern can be used in path """ DOGS = { 'test': { 'paths': ['logs/*.log'], 'includes': ['wrong'], 'handler': self.handler } } os.makedirs('logs') f = self.open('logs/a.log') logdogs = LogDogs(DOGS) self.write(f, 'something wrong\n') logdogs.process() self.assertEqual(self.q.get_nowait(), ['something wrong\n']) f = self.open('logs/b.log') self.write(f, 'whats wrong\n') logdogs.process() self.assertEqual(self.q.get_nowait(), ['whats wrong\n'])
def __init__(self): self.count = 0 def __call__(self, file, lines): self.count += 1 logger.info('...') # Do whatever you want here... DOGS = { "test": { "paths": ["a.log", "b.log"], "handler": MyHandler(), "includes": [r"wrong"], "excludes": [r"nothing"] }, "glob": { "paths": ["**/*.log"], "handler": MyHandler(), "includes": [r"wrong"], } } logdogs = LogDogs(DOGS) logdogs.run(5, daemon=True, pid='logdogs.pid', stdout='logdogs.out', stderr='logdogs.err', working_directory=os.path.abspath('.'))