How to log

Logging is implemented via the global class instance osmscout::log. It can be found in the header osmscout/util/Logging.h.

Log levels are implemented via the methods Debug(), Info(), Warn() and Error(). All of these methods in the parameterless variant return a instance of Logger::Line. You can switch log levels on and off by passing a boolean value to the above methods. Logger::Line uses the shift left operator (<<) to output values. Currently supported datatypes are all internal types, std::string, and osmscout::StopClock.

Logger::Line uses a Destination to actually output the given parameter.

Example

A simple example:

log.Error() << "Error getting areas from optimized areas index!";

A more complex example from the MapPainter class.

    if (parameter.IsDebugPerformance()) {
      log.Info()
          << "Paths: "
          << data.ways.size() << "/" << waysSegments << "/" << waysDrawn << "/" << waysLabelDrawn << " (pcs) "
          << prepareWaysTimer << "/" << pathsTimer << "/" << pathLabelsTimer << " (sec)";

      log.Info()
          << "Areas: "
          << data.areas.size() << "/" << areasSegments << "/" << areasDrawn << " (pcs) "
          << prepareAreasTimer << "/" << areasTimer << "/" << areaLabelsTimer << " (sec)";

      log.Info()
          << "Nodes: "
          << data.nodes.size() <<"+" << data.poiNodes.size() << "/" << nodesDrawn << " (pcs) "
          << nodesTimer << "/" << poisTimer << " (sec)";

      log.Info()
          << "Labels: " << labels.size() << "/" << overlayLabels.size() << "/" << labelsDrawn << " (pcs) "
          << labelsTimer << " (sec)";
    }

Existing logger implementations

The default logger implementation is a set to ConsoleLogger. Console logger logs debug and information level logs to std::cout and warning and error logs to std::cerr.

ConsoleLogger uses StreamLogger as base class, which offers the required classes (StreamDestination) to redirect logs to a implementation of std::ostream.

The current othe rexisting Logger implementation is NoOpLogger which internally uses a NoOpDestination, which does nothing.

How to redirect logging information

To redirect logging you implement the abstract baseclass Logger or inherit from one of the existing implementations (StreamLogger might be adaquate base class for most purposes).

You then implement the method Logger::Log(Level level) by return a Logger::Line instatiated with your custom implementation of Logger::Destination.