[SOLVED] 0.6.0 Logger - placing custom logger within a class

I want to provide custom loggers within classes so that I may control the output of logging from the main line.

Problem is that the following does not compile for me -

class MyClass
     Logger log("app.myclass");      // <=== PROBLEM HERE


as it gives this compiler error:

error: expected identifier before string constant
Logger log(“app.myclass”);

Is this achievable?

You may find some info about the capabilities of the LogHandlers here

@ScruffR, the answer (worked out by #1 son) is to use “C++ uniform initialisation syntax”

class MyClass

Logger log {"app.myclass"}; // uniform initialisation syntax



1 Like

Thank you, thank you! This was driving me nutty too. :smiley:

@drwheetos, due to your post I revisited this post because the original problem code I quoted was the same as the “solved” code. This being the case, I looked at my test code again:

/* LOG_TEST_02

Testing v0.6.0 logging


/* Version History
2016-11-28 HR
- Created


class TestClass {
        void TestLogging(void);
        Logger mLog {"app.testclass"}; // uniform initialisation syntax

LOG_LEVEL_ALL : special value that can be used to enable logging of all messages
LOG_LEVEL_TRACE : verbose output for debugging purposes
LOG_LEVEL_INFO : regular information messages
LOG_LEVEL_WARN : warnings and non-critical errors
LOG_LEVEL_ERROR : error messages
LOG_LEVEL_NONE : special value that can be used to disable logging of any messages


SerialLogHandler logHandler(LOG_LEVEL_NONE, {   // Logging level for non-application messages
        { "app", LOG_LEVEL_NONE },                  // Default logging level for all application messages
        { "app.network", LOG_LEVEL_TRACE },          // Logging level for networking messages
        { "app.setup", LOG_LEVEL_WARN },           // Logging level for setup messages
        { "app.test", LOG_LEVEL_WARN }            // Logging level for setup messages

// Set up my own logger instance
Logger LogSetup("app.setup");

// Test logging within class
TestClass testClass = TestClass();

void setup() {

    LogSetup(LOG_LEVEL_INFO, "Setup() completed");

void loop() {
    // Specify logging level directly
    Log(LOG_LEVEL_TRACE, "This is a trace message");
    Log(LOG_LEVEL_INFO, "This is an info message");
    Log(LOG_LEVEL_WARN, "This is a warn message");
    Log(LOG_LEVEL_ERROR, "This is an error message");



void TestClass::TestLogging(void)
    mLog(LOG_LEVEL_TRACE, "TestLogging() - trace message");
    mLog(LOG_LEVEL_INFO, "TestLogging() - info message");
    mLog(LOG_LEVEL_WARN, "TestLogging() - warn message");
    mLog(LOG_LEVEL_ERROR, "TestLogging() - error message");

The above gives two compile errors:

/workspace/log_test_02.cpp:45:33: error: use of deleted function 'TestClass::TestClass(TestClass&&)'

../wiring/inc/spark_wiring_logging.h:388:5: error: declared here
     Logger(const Logger&) = delete;

So I am now at a loss - has something changed?