Take the new doc out of the branch and into trunk
[nodemanager.git] / logger.py
index 3411df5..8abd8fd 100644 (file)
--- a/logger.py
+++ b/logger.py
@@ -1,25 +1,27 @@
-import fcntl
-import os
+"""A very simple logger that tries to be concurrency-safe."""
+
+import os, sys
 import subprocess
 import time
 import traceback
 
-from config import LOG_FILE
 
+LOG_FILE = '/var/log/nm'
 
 def log(msg):
     """Write <msg> to the log file."""
-    # the next three lines ought to be an atomic operation but aren't
-    fd = os.open(LOG_FILE, os.O_WRONLY | os.O_CREAT | os.O_APPEND, 0600)
-    flags = fcntl.fcntl(fd, fcntl.F_GETFD)
-    fcntl.fcntl(fd, fcntl.F_SETFD, flags | fcntl.FD_CLOEXEC)
-    if not msg.endswith('\n'): msg += '\n'
-    os.write(fd, '%s: %s' % (time.asctime(time.gmtime()), msg))
-    os.close(fd)
+    try:
+        fd = os.open(LOG_FILE, os.O_WRONLY | os.O_CREAT | os.O_APPEND, 0600)
+        if not msg.endswith('\n'): msg += '\n'
+        os.write(fd, '%s: %s' % (time.asctime(time.gmtime()), msg))
+        os.close(fd)
+    except OSError:
+        sys.stderr.write(msg)
+        sys.stderr.flush()
 
 def log_call(*args):
     log('running command %s' % ' '.join(args))
-    try: subprocess.call(args)
+    try: subprocess.call(args, close_fds=True)
     except: log_exc()
 
 def log_exc():