Log Class Reference

#include <Logging.hh>

Collaboration diagram for Log:
Collaboration graph
[legend]

List of all members.

Public Types

enum  Level {
  TRACE = 0, DEBUG = 10, INFO = 20, WARN = 30,
  WARNING = 30, ERROR = 40, CRITICAL = 50, ALWAYS = 50
}
 

Log priority levels.

More...
typedef std::map< std::string,
Log * > 
LogMap
 Typedef for a collection of named logs.
typedef std::map< std::string,
int > 
LevelMap
 Typedef for a collection of named log levels.
typedef std::map< int,
std::string > 
ColorCodes
 Typedef for a collection of shell color codes, accessed by log level.

Public Member Functions

int getLevel () const
 Get the priority level of this logger.
LogsetLevel (int level)
 Set the priority level of this logger.
std::string getName () const
 Get the name of this logger.
LogsetName (const std::string &name)
 Set the name of this logger.
bool isActive (int level) const
 Will this log level produce output on this logger at the moment?
Explicit log methods

void trace (const std::string &message)
void debug (const std::string &message)
void info (const std::string &message)
void warn (const std::string &message)
void error (const std::string &message)

Static Public Member Functions

static void setLevel (const std::string &name, int level)
 Set the log levels.
static void setLevels (const LevelMap &logLevels)
static void setShowTimestamp (bool showTime=true)
static void setShowLevel (bool showLevel=true)
static void setShowLoggerName (bool showName=true)
static void setUseColors (bool useColors=true)
static LoggetLog (const std::string &name)
static Level getLevelFromName (const std::string &level)
 Get a log level enum from a string.
static std::string getLevelName (int level)
 Get the std::string representation of a log level.

Public Attributes

std::ostream *const _nostream

Protected Member Functions

void log (int level, const std::string &message)
 Write a message at a particular level.
std::string formatMessage (int level, const std::string &message)
 Turn a message string into the current log format.
Hidden constructors etc.

 Log (const std::string &name)
 Constructor 1.
 Log (const std::string &name, int level)
 Constructor 2.

Static Protected Member Functions

static std::string getColorCode (int level)

Private Attributes

std::string _name
 This logger's name.
int _level
 Threshold level for this logger.

Static Private Attributes

static LogMap existingLogs
 A static map of existing logs: we don't make more loggers than necessary.
static LevelMap defaultLevels
 A static map of default log levels.
static ColorCodes colorCodes
 A static map of shell color codes for the log levels.
static std::string endColorCode
 Shell color code for the end of the log levels.
static bool showTimestamp = false
 Show timestamp?
static bool showLogLevel = true
 Show log level?
static bool showLoggerName = true
 Show logger name?
static bool useShellColors = true
 Use shell colour escape codes?

Friends

std::ostream & operator<< (Log &log, int level)
 The streaming operator can use Log's internals.

Detailed Description

Definition at line 9 of file Logging.hh.


Member Typedef Documentation

typedef std::map<int, std::string> ColorCodes

Typedef for a collection of shell color codes, accessed by log level.

Definition at line 24 of file Logging.hh.

typedef std::map<std::string, int> LevelMap

Typedef for a collection of named log levels.

Definition at line 21 of file Logging.hh.

typedef std::map<std::string, Log*> LogMap

Typedef for a collection of named logs.

Definition at line 18 of file Logging.hh.


Member Enumeration Documentation

enum Level

Log priority levels.

Enumerator:
TRACE 
DEBUG 
INFO 
WARN 
WARNING 
ERROR 
CRITICAL 
ALWAYS 

Definition at line 13 of file Logging.hh.

00013                {
00014       TRACE = 0, DEBUG = 10, INFO = 20, WARN = 30, WARNING = 30, ERROR = 40, CRITICAL = 50, ALWAYS = 50
00015     };


Constructor & Destructor Documentation

Log ( const std::string &  name  )  [protected]

Constructor 1.

Definition at line 19 of file Logging.cc.

Referenced by Log::getLog().

00020     : _name(name), _level(INFO), _nostream(new ostream(0)) { }

Log ( const std::string &  name,
int  level 
) [protected]

Constructor 2.

Definition at line 23 of file Logging.cc.

00024     : _name(name), _level(level), _nostream(new ostream(0)) { }


Member Function Documentation

void debug ( const std::string &  message  )  [inline]

Definition at line 131 of file Logging.hh.

References Log::DEBUG, and Log::log().

00131 { log(DEBUG, message); }

void error ( const std::string &  message  )  [inline]

Definition at line 137 of file Logging.hh.

References Log::ERROR, and Log::log().

00137 { log(ERROR, message); }

string formatMessage ( int  level,
const std::string &  message 
) [protected]

Turn a message string into the current log format.

Definition at line 146 of file Logging.cc.

References Log::endColorCode, Log::getColorCode(), Log::getLevelName(), Log::getName(), Log::showLoggerName, Log::showLogLevel, Log::showTimestamp, and Log::useShellColors.

Referenced by Log::log(), and Rivet::operator<<().

00146                                                             {
00147     string out;
00148     if (Log::useShellColors) {
00149       out += getColorCode(level);
00150     }
00151 
00152     if (Log::showLoggerName) {
00153       out += getName();
00154       out += ": ";
00155     }
00156 
00157     if (Log::showLogLevel) {
00158       out += Log::getLevelName(level);
00159       out += " ";
00160     }
00161 
00162     if (Log::showTimestamp) {
00163       time_t rawtime;
00164       time(&rawtime);
00165       char* timestr = ctime(&rawtime);
00166       timestr[24] = ' ';
00167       out += timestr;
00168       out += " ";
00169     }
00170 
00171     if (Log::useShellColors) {
00172       out += endColorCode;
00173     }
00174 
00175     out += " ";
00176     out += message;
00177  
00178     return out;
00179   }

string getColorCode ( int  level  )  [static, protected]

Todo:
Test for VT100 compliance?
Todo:
Do the map::upper_limit thing to find nearest level...

Definition at line 109 of file Logging.cc.

References Log::colorCodes, Log::DEBUG, Log::endColorCode, Log::ERROR, Log::INFO, Log::TRACE, Log::useShellColors, and Log::WARN.

Referenced by Log::formatMessage().

00109                                     {
00110     if (!Log::useShellColors) return "";
00111     // If the codes haven't been initialized, do so now.
00112     if (Log::colorCodes.empty()) {
00113       // If stdout is a valid tty, try to use the appropriate codes.
00114       if (isatty(1)) {
00115         /// @todo Test for VT100 compliance?
00116         Log::colorCodes[TRACE] = "\033[0;37m";
00117         Log::colorCodes[DEBUG] = "\033[0;36m";
00118         Log::colorCodes[INFO]  = "\033[0;32m";
00119         Log::colorCodes[WARN]  = "\033[0;33m";
00120         Log::colorCodes[ERROR] = "\033[0;31m";
00121         Log::endColorCode      = "\033[0m";
00122       } else {
00123         Log::colorCodes[TRACE] = "";
00124         Log::colorCodes[DEBUG] = "";
00125         Log::colorCodes[INFO] = "";
00126         Log::colorCodes[WARN] = "";
00127         Log::colorCodes[ERROR] = "";
00128       }
00129     }
00130     // Return the appropriate code from the colour map.
00131     /// @todo Do the map::upper_limit thing to find nearest level...
00132     return colorCodes[level];
00133   }

int getLevel (  )  const [inline]

Get the priority level of this logger.

Definition at line 95 of file Logging.hh.

References Log::_level.

00095                          {
00096       return _level;
00097     }

Log::Level getLevelFromName ( const std::string &  level  )  [static]

Get a log level enum from a string.

Definition at line 136 of file Logging.cc.

References Log::DEBUG, Log::ERROR, Log::INFO, Log::TRACE, and Log::WARN.

00136                                                     {
00137     if (level == "TRACE") return TRACE;
00138     if (level == "DEBUG") return DEBUG;
00139     if (level == "INFO") return INFO;
00140     if (level == "WARN") return WARN;
00141     if (level == "ERROR") return ERROR;
00142     throw Error("Couldn't create a log level from string '" + level + "'");
00143   }

string getLevelName ( int  level  )  [static]

Get the std::string representation of a log level.

Todo:
Do the map::upper_limit thing to find nearest level...

Definition at line 89 of file Logging.cc.

References Log::DEBUG, Log::ERROR, Log::INFO, Log::TRACE, and Log::WARN.

Referenced by Log::formatMessage().

00089                                     {
00090     /// @todo Do the map::upper_limit thing to find nearest level...
00091     switch(level) {
00092     case TRACE:
00093       return "TRACE";
00094     case DEBUG:
00095       return "DEBUG";
00096     case INFO:
00097       return "INFO";
00098     case WARN:
00099       return "WARN";
00100     case ERROR:
00101       return "ERROR";
00102     default:
00103       return "";
00104     }
00105     //throw Error("Enum value was not a valid log level. How did that happen?");
00106   }

Log & getLog ( const std::string &  name  )  [static]

Get a logger with the given name. The level will be taken from the "requestedLevels" static map or will be INFO by default.

Definition at line 55 of file Logging.cc.

References Log::defaultLevels, Log::existingLogs, Log::INFO, and Log::Log().

Referenced by Event::_geNormAlignment(), Run::init(), AnalysisInfo::make(), mt2::mt2_massless(), Run::openFile(), Run::processEvent(), and Run::readEvent().

00055                                      {
00056     if (existingLogs.find(name) == existingLogs.end()) {
00057       int level = INFO;
00058       // Try running through all parent classes to find an existing level
00059       string tmpname = name;
00060       bool triedAllParents = false;
00061       while (! triedAllParents) {
00062         // Is there a default level?
00063         if (defaultLevels.find(tmpname) != defaultLevels.end()) {
00064           level = defaultLevels.find(tmpname)->second;
00065           break;
00066         }
00067         // Is there already such a logger? (NB. tmpname != name)
00068         if (existingLogs.find(tmpname) != existingLogs.end()) {
00069           level = existingLogs.find(tmpname)->second->getLevel();
00070           break;
00071         }
00072         // Crop the string back to the next parent level
00073         size_t lastDot = tmpname.find_last_of(".");
00074         if (lastDot != string::npos) {
00075           tmpname = tmpname.substr(0, lastDot);
00076         } else {
00077           triedAllParents = true;
00078         }
00079       }
00080       // for (LevelMap::const_iterator l = defaultLevels.begin(); l != defaultLevels.end(); ++l) {
00081       // 
00082       // }
00083       existingLogs[name] = new Log(name, level);
00084     }
00085     return *existingLogs[name];
00086   }

std::string getName (  )  const [inline]

Get the name of this logger.

Definition at line 112 of file Logging.hh.

References Log::_name.

Referenced by Log::formatMessage().

00112                               {
00113       return _name;
00114     }

void info ( const std::string &  message  )  [inline]

Definition at line 133 of file Logging.hh.

References Log::INFO, and Log::log().

00133 { log(INFO, message); }

bool isActive ( int  level  )  const [inline]

Will this log level produce output on this logger at the moment?

Definition at line 123 of file Logging.hh.

References Log::_level.

Referenced by Event::_geNormAlignment(), InvMassFinalState::calc(), Log::log(), Rivet::operator<<(), VetoedFinalState::project(), and InitialQuarks::project().

00123                                    {
00124       return (level >= _level);
00125     }

void log ( int  level,
const std::string &  message 
) [protected]

Write a message at a particular level.

Definition at line 182 of file Logging.cc.

References Log::formatMessage(), and Log::isActive().

Referenced by Log::debug(), Log::error(), Log::info(), Log::trace(), and Log::warn().

00182                                                 {
00183     if (isActive(level)) {
00184       cout << formatMessage(level, message) << endl;
00185     }
00186   }

Log& setLevel ( int  level  )  [inline]

Set the priority level of this logger.

Definition at line 100 of file Logging.hh.

References Log::_level.

00100                              {
00101       _level = level;
00102       return *this;
00103     }

void setLevel ( const std::string &  name,
int  level 
) [static]

Set the log levels.

Definition at line 40 of file Logging.cc.

References Rivet::_updateLevels(), Log::defaultLevels, and Log::existingLogs.

00040                                                   {
00041     defaultLevels[name] = level;
00042     //cout << name << " -> " << level << endl;
00043     _updateLevels(defaultLevels, existingLogs);
00044   }

void setLevels ( const LevelMap logLevels  )  [static]

Definition at line 47 of file Logging.cc.

References Rivet::_updateLevels(), Log::defaultLevels, and Log::existingLogs.

00047                                                {
00048     for (LevelMap::const_iterator lev = logLevels.begin(); lev != logLevels.end(); ++lev) {
00049       defaultLevels[lev->first] = lev->second;
00050     }
00051     _updateLevels(defaultLevels, existingLogs);
00052   }

Log& setName ( const std::string &  name  )  [inline]

Set the name of this logger.

Definition at line 117 of file Logging.hh.

References Log::_name.

00117                                         {
00118       _name = name;
00119       return *this;
00120     }

static void setShowLevel ( bool  showLevel = true  )  [inline, static]

Definition at line 60 of file Logging.hh.

References Log::showLogLevel.

00060                                                   {
00061       showLogLevel = showLevel;
00062     }

static void setShowLoggerName ( bool  showName = true  )  [inline, static]

Definition at line 64 of file Logging.hh.

References Log::showLoggerName.

00064                                                       {
00065       showLoggerName = showName;
00066     }

static void setShowTimestamp ( bool  showTime = true  )  [inline, static]

Definition at line 56 of file Logging.hh.

References Log::showTimestamp.

00056                                                      {
00057       showTimestamp = showTime;
00058     }

static void setUseColors ( bool  useColors = true  )  [inline, static]

Definition at line 68 of file Logging.hh.

References Log::useShellColors.

00068                                                   {
00069       useShellColors = useColors;
00070     }

void trace ( const std::string &  message  )  [inline]

Definition at line 129 of file Logging.hh.

References Log::log(), and Log::TRACE.

00129 { log(TRACE, message); }

void warn ( const std::string &  message  )  [inline]

Definition at line 135 of file Logging.hh.

References Log::log(), and Log::WARN.

00135 { log(WARN, message); }


Friends And Related Function Documentation

std::ostream& operator<< ( Log log,
int  level 
) [friend]

The streaming operator can use Log's internals.

Definition at line 189 of file Logging.cc.

00189                                            {
00190     if (log.isActive(level)) {
00191       cout << log.formatMessage(level, "");
00192       return cout;
00193     } else {
00194       return *(log._nostream);
00195     }
00196   }


Member Data Documentation

int _level [private]

Threshold level for this logger.

Definition at line 145 of file Logging.hh.

Referenced by Log::getLevel(), Log::isActive(), and Log::setLevel().

std::string _name [private]

This logger's name.

Definition at line 142 of file Logging.hh.

Referenced by Log::getName(), and Log::setName().

std::ostream* const _nostream

A null output stream, used for piping discarded output to nowhere.

Todo:
Hide this...

Definition at line 158 of file Logging.hh.

Referenced by Rivet::operator<<().

Log::ColorCodes colorCodes [static, private]

A static map of shell color codes for the log levels.

Definition at line 34 of file Logging.hh.

Referenced by Log::getColorCode().

Log::LevelMap defaultLevels [static, private]

A static map of default log levels.

Definition at line 31 of file Logging.hh.

Referenced by Log::getLog(), Log::setLevel(), and Log::setLevels().

string endColorCode [static, private]

Shell color code for the end of the log levels.

Definition at line 37 of file Logging.hh.

Referenced by Log::formatMessage(), and Log::getColorCode().

Log::LogMap existingLogs [static, private]

A static map of existing logs: we don't make more loggers than necessary.

Definition at line 28 of file Logging.hh.

Referenced by Log::getLog(), Log::setLevel(), and Log::setLevels().

bool showLoggerName = true [static, private]

Show logger name?

Definition at line 46 of file Logging.hh.

Referenced by Log::formatMessage(), and Log::setShowLoggerName().

bool showLogLevel = true [static, private]

Show log level?

Definition at line 43 of file Logging.hh.

Referenced by Log::formatMessage(), and Log::setShowLevel().

bool showTimestamp = false [static, private]

Show timestamp?

Definition at line 40 of file Logging.hh.

Referenced by Log::formatMessage(), and Log::setShowTimestamp().

bool useShellColors = true [static, private]

Use shell colour escape codes?

Definition at line 49 of file Logging.hh.

Referenced by Log::formatMessage(), Log::getColorCode(), and Log::setUseColors().


The documentation for this class was generated from the following files: