diff --git a/tcutils/loghelper.py b/tcutils/loghelper.py
new file mode 100644
index 0000000..5bebb21
--- /dev/null
+++ b/tcutils/loghelper.py
@@ -0,0 +1,76 @@
+# -*- coding: utf-8 -*-
+"""
+Created on 2012-6-12
+
+@author: cheng.tang
+"""
+
+import logging
+import time
+import logging.handlers
+
+
+class _LogFormatter(logging.Formatter):
+    def __init__(self, *args, **kwargs):
+        logging.Formatter.__init__(self, *args, **kwargs)
+
+    def format(self, record):
+        try:
+            record.message = record.getMessage()
+        except Exception, e:
+            record.message = "Bad message (%r): %r" % (e, record.__dict__)
+        #record.asctime = time.strftime(
+        #    "%y%m%d %H:%M:%S", self.converter(record.created))
+        record.asctime = time.strftime(
+            "%m%d %H:%M:%S", self.converter(record.created))
+        #prefix = '[%(levelname)1.1s %(asctime)s %(module)s:%(lineno)d]' % \
+        #    record.__dict__
+        prefix = '[%(levelname)1.1s %(asctime)s]' % record.__dict__
+
+        formatted = prefix + " " + record.message
+        if record.exc_info:
+            if not record.exc_text:
+                record.exc_text = self.formatException(record.exc_info)
+        if record.exc_text:
+            formatted = formatted.rstrip() + "\n" + record.exc_text
+        return formatted.replace("\n", "\n    ")
+
+
+def _enable_pretty_logging(**kwargs):
+    """Turns on formatted logging output as configured.
+    This is called automatically by `parse_command_line`.
+    """
+    log_file_prefix = kwargs.get('log_file_prefix', None)
+    log_to_socket = kwargs.get('log_to_socket', None)
+    root_logger = logging.getLogger()
+    if log_file_prefix:
+        # 10M
+        log_file_max_size = kwargs.get('log_file_max_size', 1024 * 1024 * 10)
+        log_file_num_backups = kwargs.get('log_file_num_backups', 5)
+        #channel = ConcurrentRotatingFileHandler(
+        channel = logging.handlers.RotatingFileHandler(
+            mode="a",
+            filename=log_file_prefix,
+            maxBytes=log_file_max_size,
+            backupCount=log_file_num_backups)
+        channel.setFormatter(_LogFormatter())
+        root_logger.addHandler(channel)
+
+    if log_to_socket:
+        channel = logging.handlers.SocketHandler('localhost',
+                    logging.handlers.DEFAULT_TCP_LOGGING_PORT)
+        channel.setFormatter(_LogFormatter())
+        root_logger.addHandler(channel)
+
+    if kwargs.get('log_to_std', 'true') == 'true':
+        channel = logging.StreamHandler()
+        channel.setFormatter(_LogFormatter())
+        root_logger.addHandler(channel)
+
+
+def setup_logger(**kwargs):
+    level = kwargs.get('log_level', 'info')
+    level_str = dict(info=logging.INFO, debug=logging.DEBUG,
+                     error=logging.ERROR)
+    logging.getLogger().setLevel(level_str.get(level, logging.INFO))
+    _enable_pretty_logging(**kwargs)
