2011-04-25 12:13:44 +02:00
from logging import *
2011-04-18 20:14:07 +02:00
import sys
import os
2011-04-18 17:58:48 +02:00
2011-04-18 20:14:07 +02:00
global ANSI
ANSI = {
2011-04-25 12:13:44 +02:00
' gray ' : lambda ( text ) : u ' \033 [1;30m ' + unicode ( text ) + u ' \033 [1;m ' ,
' red ' : lambda ( text ) : u ' \033 [1;31m ' + unicode ( text ) + u ' \033 [1;m ' ,
' green ' : lambda ( text ) : u ' \033 [1;32m ' + unicode ( text ) + u ' \033 [1;m ' ,
' yellow ' : lambda ( text ) : u ' \033 [1;33m ' + unicode ( text ) + u ' \033 [1;m ' ,
' blue ' : lambda ( text ) : u ' \033 [1;34m ' + unicode ( text ) + u ' \033 [1;m ' ,
' magenta ' : lambda ( text ) : u ' \033 [1;35m ' + unicode ( text ) + u ' \033 [1;m ' ,
' cyan ' : lambda ( text ) : u ' \033 [1;36m ' + unicode ( text ) + u ' \033 [1;m ' ,
' white ' : lambda ( text ) : u ' \033 [1;37m ' + unicode ( text ) + u ' \033 [1;m ' ,
' bgred ' : lambda ( text ) : u ' \033 [1;41m ' + unicode ( text ) + u ' \033 [1;m ' ,
' bggreen ' : lambda ( text ) : u ' \033 [1;42m ' + unicode ( text ) + u ' \033 [1;m ' ,
' bgbrown ' : lambda ( text ) : u ' \033 [1;43m ' + unicode ( text ) + u ' \033 [1;m ' ,
' bgblue ' : lambda ( text ) : u ' \033 [1;44m ' + unicode ( text ) + u ' \033 [1;m ' ,
' bgmagenta ' : lambda ( text ) : u ' \033 [1;45m ' + unicode ( text ) + u ' \033 [1;m ' ,
' bgcyan ' : lambda ( text ) : u ' \033 [1;46m ' + unicode ( text ) + u ' \033 [1;m ' ,
' bggray ' : lambda ( text ) : u ' \033 [1;47m ' + unicode ( text ) + u ' \033 [1;m ' ,
' bgyellow ' : lambda ( text ) : u ' \033 [1;43m ' + unicode ( text ) + u ' \033 [1;m ' ,
' bggrey ' : lambda ( text ) : u ' \033 [1;100m ' + unicode ( text ) + u ' \033 [1;m '
2011-04-18 20:14:07 +02:00
}
2011-04-25 12:13:44 +02:00
class ANSIFormatter ( Formatter ) :
2011-04-18 20:14:07 +02:00
"""
Convert a ` logging . LogReport ' object into colored text, using ANSI escape sequences.
"""
## colors:
2011-04-18 17:58:48 +02:00
def format ( self , record ) :
2011-04-25 12:13:44 +02:00
if record . levelname is ' INFO ' :
return ANSI [ ' cyan ' ] ( ' -> ' ) + unicode ( record . msg )
2011-04-18 17:58:48 +02:00
elif record . levelname is ' WARNING ' :
2011-04-25 12:13:44 +02:00
return ANSI [ ' yellow ' ] ( record . levelname ) + ' : ' + unicode ( record . msg )
2011-04-18 17:58:48 +02:00
elif record . levelname is ' ERROR ' :
2011-04-25 12:13:44 +02:00
return ANSI [ ' red ' ] ( record . levelname ) + ' : ' + unicode ( record . msg )
2011-04-18 17:58:48 +02:00
elif record . levelname is ' CRITICAL ' :
2011-04-25 12:13:44 +02:00
return ANSI [ ' bgred ' ] ( record . levelname ) + ' : ' + unicode ( record . msg )
elif record . levelname is ' DEBUG ' :
return ANSI [ ' bggrey ' ] ( record . levelname ) + ' : ' + unicode ( record . msg )
else :
return ANSI [ ' white ' ] ( record . levelname ) + ' : ' + unicode ( record . msg )
2011-04-18 20:14:07 +02:00
2011-04-25 12:13:44 +02:00
class TextFormatter ( Formatter ) :
2011-04-18 20:14:07 +02:00
"""
Convert a ` logging . LogReport ' object into text.
"""
def format ( self , record ) :
if not record . levelname or record . levelname is ' INFO ' :
return record . msg
else :
return record . levelname + ' : ' + record . msg
2011-04-25 12:13:44 +02:00
class DummyFormatter ( object ) :
2011-04-18 20:14:07 +02:00
"""
A dummy class .
Return an instance of the appropriate formatter ( ANSIFormatter if sys . stdout . isatty ( ) is True , else TextFormatter )
"""
def __new__ ( cls , * args , * * kwargs ) :
if os . isatty ( sys . stdout . fileno ( ) ) : # thanks to http://stackoverflow.com/questions/2086961/how-can-i-determine-if-a-python-script-is-executed-from-crontab/2087031#2087031
return ANSIFormatter ( * args , * * kwargs )
else :
return TextFormatter ( * args , * * kwargs )
2011-04-18 17:58:48 +02:00
2011-04-19 11:49:24 +02:00
2011-04-25 12:13:44 +02:00
def init ( level = None , logger = getLogger ( ) , handler = StreamHandler ( ) ) :
fmt = DummyFormatter ( )
2011-04-18 17:58:48 +02:00
handler . setFormatter ( fmt )
logger . addHandler ( handler )
2011-04-20 14:44:25 +02:00
if level :
logger . setLevel ( level )
2011-04-18 17:58:48 +02:00
2011-04-18 20:14:07 +02:00
if __name__ == ' __main__ ' :
2011-04-25 12:13:44 +02:00
init ( level = DEBUG )
debug ( ' debug ' )
info ( ' info ' )
warning ( ' warning ' )
error ( ' error ' )
critical ( ' critical ' )
__all__ = [
" debug " ,
" info " ,
" warn " ,
" error " ,
" critical " ,
" DEBUG " ,
" INFO " ,
" WARN " ,
" ERROR " ,
" CRITICAL "
]