Skip to content


Crow comes with a simple and easy to use logging system.

Setting up logging level

You can set up the level at which crow displays logs by using the app's loglevel(crow::LogLevel) method.

The available log levels are as follows (please not that setting a level will also display all logs below this level):

  • Debug
  • Info
  • Warning
  • Error
  • Critical

To set a logLevel, just use app.loglevel(crow::LogLevel::Warning), This will not show any debug or info logs. It will however still show error and critical logs.


Setting the Macro CROW_ENABLE_DEBUG during compilation will also set the log level to Debug (unless otherwise set using loglevel()).

Writing a log

Writing a log is as simple as CROW_LOG_<LOG LEVEL> << "Hello"; (replace<LOG LEVEL> with the actual level in all caps, so you have CROW_LOG_WARNING).

Creating A custom logger

Assuming you have an existing logger or Crow's default format just doesn't work for you. Crow allows you to use a custom logger for any log made using the CROW_LOG_<LOG LEVEL> macro.
All you need is a class extending crow::ILogHandler containing the method void log(std::string, crow::LogLevel).
Once you have your custom logger, you need to set it via crow::logger::setHandler(&MyLogger);. Here's a full example:

class CustomLogger : public crow::ILogHandler {
  CustomLogger() {}
  void log(std::string message, crow::LogLevel /*level*/) {
    // "message" doesn't contain the timestamp and loglevel
    // prefix the default logger does and it doesn't end
    // in a newline.
    std::cerr << message << std::endl;

int main(int argc, char** argv) {
  CustomLogger logger;

  crow::SimpleApp app;
  CROW_ROUTE(app, "/")([]() { return "Hello"; });;