Library for serial logging via macros.

A simple library for logging to a USB serial connection using macros.

Example usage

#include "mbed.h"
#define LOG_LEVEL_INFO
#include "logger.h"

SerialLogger logger;

int main() {
    logger.start();
    INFO("Logging at info level.");
}

Log levels

This library supports five log levels: TRACE, DEBUG, INFO, WARN and ERROR.

Log levels are hierarchical (in the order given above) meaning that when a given level is enabled all levels below are enabled. For example:

#define LOG_LEVEL_TRACE

Will enable all levels since trace is at the top of the hierarchy, where as:

#define LOG_LEVEL_WARN

Will enable from WARN down (WARN and ERROR). If no log level is defined then no logging is performed at all and the logging code can remain in place with no impact on performance. This hierarchy means that the any performance hit of writing data down a serial line can be reduced to differing levels during development and removed entirely in production by not specifying a log level.

Committer:
ollie8
Date:
Tue Aug 18 13:50:23 2015 +0000
Revision:
2:aa7033f339e1
Parent:
1:2e4615f18293
Changed name of level macros

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ollie8 0:46f37f02c1f1 1 #ifndef __LOGGER_H__
ollie8 0:46f37f02c1f1 2 #define __LOGGER_H__
ollie8 0:46f37f02c1f1 3
ollie8 0:46f37f02c1f1 4 #include "mbed.h"
ollie8 0:46f37f02c1f1 5
ollie8 2:aa7033f339e1 6 #if defined LOG_LEVEL_TRACE
ollie8 0:46f37f02c1f1 7 #define TRACE(x, ...) std::printf("[TRACE: %s:%d]"x"\r\n", __FILE__, __LINE__, ##__VA_ARGS__);
ollie8 0:46f37f02c1f1 8 #define DEBUG(x, ...) std::printf("[DEBUG: %s:%d]"x"\r\n", __FILE__, __LINE__, ##__VA_ARGS__);
ollie8 0:46f37f02c1f1 9 #define INFO(x, ...) std::printf("[INFO: %s:%d]"x"\r\n", __FILE__, __LINE__, ##__VA_ARGS__);
ollie8 0:46f37f02c1f1 10 #define WARN(x, ...) std::printf("[WARN: %s:%d]"x"\r\n", __FILE__, __LINE__, ##__VA_ARGS__);
ollie8 0:46f37f02c1f1 11 #define ERROR(x, ...) std::printf("[ERROR: %s:%d]"x"\r\n", __FILE__, __LINE__, ##__VA_ARGS__);
ollie8 0:46f37f02c1f1 12
ollie8 2:aa7033f339e1 13 #elif defined LOG_LEVEL_DEBUG
ollie8 0:46f37f02c1f1 14 #define TRACE(x, ...)
ollie8 0:46f37f02c1f1 15 #define DEBUG(x, ...) std::printf("[DEBUG: %s:%d]"x"\r\n", __FILE__, __LINE__, ##__VA_ARGS__);
ollie8 0:46f37f02c1f1 16 #define INFO(x, ...) std::printf("[INFO: %s:%d]"x"\r\n", __FILE__, __LINE__, ##__VA_ARGS__);
ollie8 0:46f37f02c1f1 17 #define WARN(x, ...) std::printf("[WARN: %s:%d]"x"\r\n", __FILE__, __LINE__, ##__VA_ARGS__);
ollie8 0:46f37f02c1f1 18 #define ERROR(x, ...) std::printf("[ERROR: %s:%d]"x"\r\n", __FILE__, __LINE__, ##__VA_ARGS__);
ollie8 0:46f37f02c1f1 19
ollie8 2:aa7033f339e1 20 #elif defined LOG_LEVEL_INFO
ollie8 0:46f37f02c1f1 21 #define TRACE(x, ...)
ollie8 0:46f37f02c1f1 22 #define DEBUG(x, ...)
ollie8 0:46f37f02c1f1 23 #define INFO(x, ...) std::printf("[INFO: %s:%d]"x"\r\n", __FILE__, __LINE__, ##__VA_ARGS__);
ollie8 0:46f37f02c1f1 24 #define WARN(x, ...) std::printf("[WARN: %s:%d]"x"\r\n", __FILE__, __LINE__, ##__VA_ARGS__);
ollie8 0:46f37f02c1f1 25 #define ERROR(x, ...) std::printf("[ERROR: %s:%d]"x"\r\n", __FILE__, __LINE__, ##__VA_ARGS__);
ollie8 0:46f37f02c1f1 26
ollie8 2:aa7033f339e1 27 #elif defined LOG_LEVEL_WARN
ollie8 0:46f37f02c1f1 28 #define TRACE(x, ...)
ollie8 0:46f37f02c1f1 29 #define DEBUG(x, ...)
ollie8 0:46f37f02c1f1 30 #define INFO(x, ...)
ollie8 0:46f37f02c1f1 31 #define WARN(x, ...) std::printf("[WARN: %s:%d]"x"\r\n", __FILE__, __LINE__, ##__VA_ARGS__);
ollie8 0:46f37f02c1f1 32 #define ERROR(x, ...) std::printf("[ERROR: %s:%d]"x"\r\n", __FILE__, __LINE__, ##__VA_ARGS__);
ollie8 0:46f37f02c1f1 33
ollie8 2:aa7033f339e1 34 #elif defined LOG_LEVEL_ERROR
ollie8 0:46f37f02c1f1 35 #define TRACE(x, ...)
ollie8 0:46f37f02c1f1 36 #define DEBUG(x, ...)
ollie8 0:46f37f02c1f1 37 #define INFO(x, ...)
ollie8 0:46f37f02c1f1 38 #define WARN(x, ...)
ollie8 0:46f37f02c1f1 39 #define ERROR(x, ...) std::printf("[ERROR: %s:%d]"x"\r\n", __FILE__, __LINE__, ##__VA_ARGS__);
ollie8 0:46f37f02c1f1 40
ollie8 0:46f37f02c1f1 41 #else
ollie8 0:46f37f02c1f1 42 #define TRACE(x, ...)
ollie8 0:46f37f02c1f1 43 #define DEBUG(x, ...)
ollie8 0:46f37f02c1f1 44 #define INFO(x, ...)
ollie8 0:46f37f02c1f1 45 #define WARN(x, ...)
ollie8 0:46f37f02c1f1 46 #define ERROR(x, ...)
ollie8 0:46f37f02c1f1 47 #endif
ollie8 0:46f37f02c1f1 48
ollie8 0:46f37f02c1f1 49 class SerialLogger {
ollie8 0:46f37f02c1f1 50
ollie8 0:46f37f02c1f1 51 private:
ollie8 0:46f37f02c1f1 52 Serial *pc;
ollie8 0:46f37f02c1f1 53
ollie8 0:46f37f02c1f1 54 public:
ollie8 0:46f37f02c1f1 55 SerialLogger() {
ollie8 0:46f37f02c1f1 56 pc = new Serial(USBTX, USBRX);
ollie8 0:46f37f02c1f1 57 }
ollie8 0:46f37f02c1f1 58
ollie8 1:2e4615f18293 59 void start(int baudRate = 460800) {
ollie8 1:2e4615f18293 60 pc->baud(baudRate);
ollie8 0:46f37f02c1f1 61 }
ollie8 0:46f37f02c1f1 62 };
ollie8 0:46f37f02c1f1 63
ollie8 0:46f37f02c1f1 64
ollie8 0:46f37f02c1f1 65 #endif