2011-04-18 17:58:48 +02:00
import logging
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-19 15:08:04 +02:00
' gray ' : lambda ( text ) : ' \033 [1;30m ' + unicode ( text ) + ' \033 [1;m ' ,
' red ' : lambda ( text ) : ' \033 [1;31m ' + unicode ( text ) + ' \033 [1;m ' ,
' green ' : lambda ( text ) : ' \033 [1;32m ' + unicode ( text ) + ' \033 [1;m ' ,
' yellow ' : lambda ( text ) : ' \033 [1;33m ' + unicode ( text ) + ' \033 [1;m ' ,
' blue ' : lambda ( text ) : ' \033 [1;34m ' + unicode ( text ) + ' \033 [1;m ' ,
' magenta ' : lambda ( text ) : ' \033 [1;35m ' + unicode ( text ) + ' \033 [1;m ' ,
' cyan ' : lambda ( text ) : ' \033 [1;36m ' + unicode ( text ) + ' \033 [1;m ' ,
' white ' : lambda ( text ) : ' \033 [1;37m ' + unicode ( text ) + ' \033 [1;m ' ,
' crimson ' : lambda ( text ) : ' \033 [1;38m ' + unicode ( text ) + ' \033 [1;m ' ,
' bgred ' : lambda ( text ) : ' \033 [1;41m ' + unicode ( text ) + ' \033 [1;m ' ,
' bggreen ' : lambda ( text ) : ' \033 [1;42m ' + unicode ( text ) + ' \033 [1;m ' ,
' bgbrown ' : lambda ( text ) : ' \033 [1;43m ' + unicode ( text ) + ' \033 [1;m ' ,
' bgblue ' : lambda ( text ) : ' \033 [1;44m ' + unicode ( text ) + ' \033 [1;m ' ,
' bgmagenta ' : lambda ( text ) : ' \033 [1;45m ' + unicode ( text ) + ' \033 [1;m ' ,
' bgcyan ' : lambda ( text ) : ' \033 [1;46m ' + unicode ( text ) + ' \033 [1;m ' ,
' bggray ' : lambda ( text ) : ' \033 [1;47m ' + unicode ( text ) + ' \033 [1;m ' ,
' bgcrimson ' : lambda ( text ) : ' \033 [1;48m ' + unicode ( text ) + ' \033 [1;m '
2011-04-18 20:14:07 +02:00
}
class ANSIFormatter ( logging . Formatter ) :
"""
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-18 20:14:07 +02:00
if not record . levelname or record . levelname is ' INFO ' :
2011-04-19 14:49:46 +02:00
return ANSI [ ' white ' ] ( record . msg )
2011-04-18 17:58:48 +02:00
elif record . levelname is ' WARNING ' :
2011-04-18 20:14:07 +02:00
return ANSI [ ' yellow ' ] ( record . levelname ) + ' : ' + record . msg
2011-04-18 17:58:48 +02:00
elif record . levelname is ' ERROR ' :
2011-04-18 20:14:07 +02:00
return ANSI [ ' red ' ] ( record . levelname ) + ' : ' + record . msg
2011-04-18 17:58:48 +02:00
elif record . levelname is ' CRITICAL ' :
2011-04-18 20:14:07 +02:00
return ANSI [ ' bgred ' ] ( record . levelname ) + ' : ' + record . msg
class TextFormatter ( logging . Formatter ) :
"""
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
class Formatter ( object ) :
"""
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
# shortcuts
debug , info , warn , error , critical = ( logging . debug ,
logging . info ,
logging . warn ,
logging . error ,
logging . critical )
2011-04-19 14:49:46 +02:00
DEBUG , INFO , WARN , ERROR , CRITICAL = ( logging . DEBUG ,
logging . INFO ,
logging . WARN ,
logging . ERROR ,
logging . CRITICAL )
2011-04-19 11:49:24 +02:00
2011-04-19 14:49:46 +02:00
def init ( level = None , logger = logging . getLogger ( ) , handler = logging . StreamHandler ( ) ) :
2011-04-18 17:58:48 +02:00
fmt = Formatter ( )
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-19 14:49:46 +02:00
init ( )
2011-04-18 20:14:07 +02:00
logging . basicConfig ( filename = ' example.log ' , level = logging . DEBUG )
logging . debug ( ' Logging test ' )
logging . info ( ' info ' )
logging . warning ( ' warning ' )
logging . error ( ' error ' )
logging . critical ( ' critical ' )
2011-04-18 17:58:48 +02:00