Permalink
Browse files

Now that I've moved to multiple app servers, gotta log multiple serve…

…r logs. Rtail to the rescue.
  • Loading branch information...
1 parent a17ffd5 commit 02c4731fd88d2485c43446420629319c87f8ea4d @samuelclay committed Aug 21, 2011
Showing with 53 additions and 0 deletions.
  1. +53 −0 utils/rtail.py
View
@@ -0,0 +1,53 @@
+#!/usr/bin/env python
+
+"""
+Usage:
+
+ ./rtail.py user@host:path/foo.log bar.log host2:/path/baz.log
+"""
+
+import optparse
+import os
+import re
+import select
+import subprocess
+import sys
+
+
+def main():
+ op = optparse.OptionParser()
+ options, args = op.parse_args()
+ streams = list()
+ for arg in args:
+ if re.match(r"^(.+@)?[a-zA-Z0-9.-]+:.+", arg):
+ # this is a remote location
+ hostname, path = arg.split(":", 1)
+ s = subprocess.Popen(["ssh", hostname, "tail -f " + path], stdout=subprocess.PIPE)
+ s.name = arg
+ streams.append(s)
+ else:
+ s = subprocess.Popen(["tail", "-f", arg], stdout=subprocess.PIPE)
+ s.name = arg
+ streams.append(s)
+
+ try:
+ while True:
+ r, _, _ = select.select(
+ [stream.stdout.fileno() for stream in streams], [], [])
+ for fileno in r:
+ for stream in streams:
+ if stream.stdout.fileno() != fileno:
+ continue
+ data = os.read(fileno, 4096)
+ if not data:
+ streams.remove(stream)
+ break
+ host = re.match(r'^(.*?)\.', stream.name)
+ combination_message = "[%s] %s" % (host.group(1), data)
+ sys.stdout.write(combination_message)
+ break
+ except KeyboardInterrupt:
+ print " --- End of Logging ---"
+
+if __name__ == "__main__":
+ main()

0 comments on commit 02c4731

Please sign in to comment.