Package grizzled :: Module log
[hide private]
[frames] | no frames]

Source Code for Module grizzled.log

  1  #!/usr/bin/env python 
  2  # --------------------------------------------------------------------------- 
  3   
  4  """ 
  5  Provides some classes and functions for use with the standard Python 
  6  ``logging`` module. 
  7  """ 
  8   
  9  __docformat__ = "restructuredtext en" 
 10   
 11  # --------------------------------------------------------------------------- 
 12  # Imports 
 13  # --------------------------------------------------------------------------- 
 14   
 15  import logging 
 16  import sys 
 17  import textwrap 
 18   
 19  # --------------------------------------------------------------------------- 
 20  # Exports 
 21  # --------------------------------------------------------------------------- 
 22   
 23  __all__ = ['WrappingLogFormatter', 'init_simple_stream_logging'] 
 24   
 25  # --------------------------------------------------------------------------- 
 26  # Classes 
 27  # --------------------------------------------------------------------------- 
 28   
29 -class WrappingLogFormatter(logging.Formatter):
30 """ 31 A ``logging`` ``Formatter`` class that writes each message wrapped on line 32 boundaries. Here's a typical usage scenario: 33 34 .. python:: 35 36 import logging 37 import sys 38 from grizzled.log import WrappingLogFormatter 39 40 stderr_handler = logging.StreamHandler(sys.stderr) 41 formatter = WrappingLogFormatter(format='%(levelname)s %(message)s") 42 stderr_handler.setLevel(logging.WARNING) 43 stderr_handler.setFormatter(formatter) 44 logging.getLogger('').handlers = [stderr_handler] 45 """
46 - def __init__(self, format=None, date_format=None, max_width=79):
47 """ 48 Initialize a new ``WrappingLogFormatter``. 49 50 :Parameters: 51 format : str 52 The format to use, or ``None`` for the logging default 53 54 date_format : str 55 Date format, or ``None`` for the logging default 56 57 max_width : int 58 Maximum line width, or ``None`` to default to 79./ 59 """ 60 self.wrapper = textwrap.TextWrapper(width=max_width, 61 subsequent_indent=' ') 62 logging.Formatter.__init__(self, format, date_format)
63
64 - def format(self, record):
65 s = logging.Formatter.format(self, record) 66 result = [] 67 for line in s.split('\n'): 68 result += [self.wrapper.fill(line)] 69 70 return '\n'.join(result)
71 72 # --------------------------------------------------------------------------- 73 # Functions 74 # --------------------------------------------------------------------------- 75
76 -def init_simple_stream_logging(level=logging.INFO, 77 streams=None, 78 format=None, 79 date_format=None):
80 """ 81 Useful for simple command-line tools, this method configures the Python 82 logging API to: 83 84 - log to one or more open streams (defaulting to standard output) and 85 - use a ``WrappingLogFormatter`` 86 87 :Parameters: 88 level : int 89 Desired log level 90 91 streams : list 92 List of files or file-like objects to which to log, or ``None`` 93 to log to standard output only 94 95 format : str 96 Log format to use, or ``None`` to use a reasonable default 97 98 date_format : str 99 Date format to use in logging, or ``None`` to use a reasonable 100 default 101 """ 102 if not streams: 103 streams = [sys.stdout] 104 105 if not format: 106 format = '%(asctime)s %(message)s' 107 108 if not date_format: 109 date_format = '%H:%M:%S' 110 111 logging.basicConfig(level=level) 112 handlers = [] 113 114 formatter = WrappingLogFormatter(format=format, date_format=date_format) 115 for stream in streams: 116 log_handler = logging.StreamHandler(stream) 117 log_handler.setLevel(level) 118 log_handler.setFormatter(formatter) 119 120 handlers += [log_handler] 121 122 logging.getLogger('').handlers = handlers
123