Logger library enables you to use unified interface to send out or receive data using one function with different parameters. You leave buffer overflows to this library as it handles it all.

Logger library howto guide.

Below is a simple program that outlines the usage of the logger library, The whole function was head-written so there might be some errors, but it is more for a live representation of usage than anything else. If someone would write a nice example program feel free to link it here.

simple usage of logger library

#include "mbed.h"
#include "logger.h"
#include "errno.h"

Ticker printout;
/**
 * \def STASH_BUFFER_LEN
 * size of stash buffer that can be used to store logged data
 */
#define STASH_BUFFER_LEN 70000
/// stash_buffer size
static char stash_buffer[STASH_BUFFER_LEN];

/**
 * Log_pop_periodic is periodically printing the messages until the buffer is empty. 
 * Once the buffer is empty it detaches and waits for another command.
*/
void log_pop_periodic(void)
{
    if( log_pop(L_BTSERIAL,stash_buffer,STASH_BUFFER_LEN) == 1 )
    {
        printout.detach();
    }
}

static int i=0;
static char read_buffer[20];
/**
 * read data from BT serial
*/
void read_from_BT()
{

    if (BTSerial.readable()) {
        read_buffer[i++] = BTSerial.getc();
        // if we read the desired character
        if (read_buffer[i-1] == 'p')
        {
            // start the printout process which will log_pop logged data
            printout.attach(&log_pop_periodic,0.5);
        }
    }    
}

int main()
{
    log_init(L_SERIAL);
    log_init(L_BTSERIAL);
    BTSerial.attach(&read_from_BT);

    // while loop to fill in loads of stinky data
    while (1) {
            // read something, then stash it
            log_stash(L_INFO,print_buffer,strlen(print_buffer),stash_buffer,STASH_BUFFER_LEN);
    }
}
Revision:
5:f232b826e1f2
Parent:
4:9360fdf3a818
--- a/logger.cpp	Wed Dec 31 22:14:48 2014 +0000
+++ b/logger.cpp	Wed Dec 31 22:23:19 2014 +0000
@@ -9,7 +9,10 @@
  * @short Logging library provides more standard re-routing of output.
  * @details While data logger needs an input to define where it output should go, we
  * could also override the output using a global variable, which would be read
- * before the entry into plc switch to override the local output request.
+ * before the entry into plc switch to override the local output request. Function
+ * needs outside buffer definition on which it can stash messages and perform
+ * a string buffer. This are then passed into stash and pop functions when
+ * such logging is assummed. 
  *
  */ 
 
@@ -119,6 +122,8 @@
  * Log_stash is meant to stash logs until they are ready to be sent, using log_pop function
  * Remember that this function can return also buffer full as result, which means you have to keep
  * deciding what you want to do - it just stashes files, but it keeps them in in case of buffer overflow.
+ * Stash buffer is defined outside library and passed in as memoryspace.
+ *
  * @param[in] lvl Debug level (ERROR,WARNING,DEBUG)
  * @param[in] msg pointer to message
  * @param[in] length length of message
@@ -128,7 +133,6 @@
  * @retval 1 success
  * @retval -ERR linux errno error message - also includes buffer full!
  *
- * @warning STASH_BUFFER_LEN sets the size of stash buffer - in case you are lacking space consider making the buffer smaller
  */
 int32_t log_stash(uint8_t lvl, char *msg, uint32_t length, char *stash_buffer,size_t stash_buffer_len) {
     if((msg == NULL) || (length == 0) || (stash_buffer == NULL) || (stash_buffer_len == 0))
@@ -168,7 +172,10 @@
 }
 
 /**
- * Log_pop function sends everything log_stash stashed
+ * Log_pop function sends everything log_stash stashed. Stash buffer is defined outside of function
+ * and pointer to memory space is passed into it. Make sure you have a string buffer on
+ * passed location, as there is still not enough checks against that
+ *
  * @param[in] plc Place to where you pop stashed messages
  * @param[in] *stash_buffer Place where stashed messages were saved
  * @param[in] stash_buffer_len how many characters can be saved on stashed message buffer
@@ -176,6 +183,7 @@
  * @retval 1 for success
  * @retval 2 for partial printout - did not send everything. You need to recall the function within timer so that you do not flood the serial port. So far it is only on BTSerial.
  * @retval -ERR errno.h error message
+ *
  */
 int32_t log_pop(uint8_t plc,char *stash_buffer,size_t stash_buffer_len) {
     if((stash_buffer == NULL) || (stash_buffer_len == 0))
@@ -190,6 +198,12 @@
         case L_SERIAL:
             if(logSerial.writeable()) {
                 logSerial.printf("%s",stash_buffer);
+                
+                //clear stash buffer
+                int i;
+                for(i=0;i<stash_buffer_len;++i) {
+                    stash_buffer[i]=0;    
+                }
             } else {
                 return -EBUSY;
             }
@@ -222,11 +236,6 @@
 
     }
     
-    //clear stash buffer
-  /*  int i;
-    for(i=0;i<STASH_BUFFER_LEN;++i) {
-        stash_buffer[i]=0;    
-    }*/
     return 1;
 }
 /**