From 001ecec729c04d8a62e285b818d646e7e8f39e03 Mon Sep 17 00:00:00 2001 From: Leonardo Murillo Date: Mon, 9 Sep 2013 14:38:57 -0600 Subject: [PATCH 1/8] Removing audio-mixer and avatar-mixer jobs --- jenkins/jobs.groovy | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/jenkins/jobs.groovy b/jenkins/jobs.groovy index ed33f49723..306ee030a8 100644 --- a/jenkins/jobs.groovy +++ b/jenkins/jobs.groovy @@ -102,8 +102,6 @@ static Closure cmakeBuild(srcDir, instCommand) { def targets = [ 'animation-server':true, 'assignment-server':true, - 'audio-mixer':true, - 'avatar-mixer':true, 'domain-server':true, 'eve':true, 'pairing-server':true, @@ -188,4 +186,4 @@ doxygenJob.with { } } -queue doxygenJob \ No newline at end of file +queue doxygenJob From 8077963bb1d2641b04bf8eeddc9f2a44f18aefc4 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 9 Sep 2013 14:21:33 -0700 Subject: [PATCH 2/8] add standardized logging and leverage forked assignment clients --- assignment-client/src/main.cpp | 20 ++-- domain-server/src/main.cpp | 6 +- libraries/audio/src/AudioMixer.cpp | 14 +-- libraries/shared/src/Assignment.cpp | 6 +- libraries/shared/src/Assignment.h | 2 + libraries/shared/src/Logging.cpp | 106 ++++++++++++++++++ .../shared/src/{Logstash.h => Logging.h} | 18 ++- libraries/shared/src/Logstash.cpp | 60 ---------- 8 files changed, 150 insertions(+), 82 deletions(-) create mode 100644 libraries/shared/src/Logging.cpp rename libraries/shared/src/{Logstash.h => Logging.h} (66%) delete mode 100644 libraries/shared/src/Logstash.cpp diff --git a/assignment-client/src/main.cpp b/assignment-client/src/main.cpp index 130cca9135..9259e503e3 100644 --- a/assignment-client/src/main.cpp +++ b/assignment-client/src/main.cpp @@ -15,11 +15,14 @@ #include #include #include +#include #include #include #include const long long ASSIGNMENT_REQUEST_INTERVAL_USECS = 1 * 1000 * 1000; +const char PARENT_TARGET_NAME[] = "assignment-client-monitor"; +const char CHILD_TARGET_NAME[] = "assignment-client"; pid_t* childForks = NULL; sockaddr_in customAssignmentSocket = {}; @@ -61,14 +64,15 @@ void childClient() { // construct the deployed assignment from the packet data Assignment deployedAssignment(packetData, receivedBytes); - qDebug() << "Received an assignment - " << deployedAssignment << "\n"; + Logging::standardizedLog(QString("Received an assignment - %1").arg(deployedAssignment.toString()), + CHILD_TARGET_NAME); // switch our nodelist DOMAIN_IP to the ip receieved in the assignment if (deployedAssignment.getDomainSocket()->sa_family == AF_INET) { in_addr domainSocketAddr = ((sockaddr_in*) deployedAssignment.getDomainSocket())->sin_addr; nodeList->setDomainIP(inet_ntoa(domainSocketAddr)); - qDebug() << "Changed domain IP to " << inet_ntoa(domainSocketAddr); + Logging::standardizedLog(QString("Changed Domain IP to %1").arg(inet_ntoa(domainSocketAddr)), CHILD_TARGET_NAME); } if (deployedAssignment.getType() == Assignment::AudioMixer) { @@ -77,7 +81,8 @@ void childClient() { AvatarMixer::run(); } - qDebug() << "Assignment finished or never started - waiting for new assignment"; + Logging::standardizedLog(QString("Assignment finished or never started - waiting for new assignment"), + CHILD_TARGET_NAME); // reset our NodeList by switching back to unassigned and clearing the list nodeList->setOwnerType(NODE_TYPE_UNASSIGNED); @@ -96,14 +101,11 @@ void sigchldHandler(int sig) { break; } - qDebug() << "Handling death of" << processID; - int newForkProcessID = 0; // find the dead process in the array of child forks for (int i = 0; i < ::numForks; i++) { if (::childForks[i] == processID) { - qDebug() << "Matched" << ::childForks[i] << "with" << processID; newForkProcessID = fork(); if (newForkProcessID == 0) { @@ -115,6 +117,10 @@ void sigchldHandler(int sig) { } else { // this is the parent, replace the dead process with the new one ::childForks[i] = newForkProcessID; + + Logging::standardizedLog(QString("Repleaced dead %1 with new fork %2").arg(processID).arg(newForkProcessID), + PARENT_TARGET_NAME); + break; } } @@ -165,7 +171,7 @@ int main(int argc, const char* argv[]) { if (numForksString) { ::numForks = atoi(numForksString); - qDebug() << "Starting" << numForks << "assignment clients."; + Logging::standardizedLog(QString("Starting %1 assignment clients").arg(numForks), PARENT_TARGET_NAME); ::childForks = new pid_t[numForks]; diff --git a/domain-server/src/main.cpp b/domain-server/src/main.cpp index 0d51671e0c..5739639f95 100644 --- a/domain-server/src/main.cpp +++ b/domain-server/src/main.cpp @@ -28,7 +28,7 @@ #include "Assignment.h" #include "NodeList.h" #include "NodeTypes.h" -#include "Logstash.h" +#include "Logging.h" #include "PacketHeaders.h" #include "SharedUtil.h" @@ -234,12 +234,12 @@ int main(int argc, const char* argv[]) { } } - if (Logstash::shouldSendStats()) { + if (Logging::shouldSendStats()) { if (usecTimestampNow() - usecTimestamp(&lastStatSendTime) >= (NODE_COUNT_STAT_INTERVAL_MSECS * 1000)) { // time to send our count of nodes and servers to logstash const char NODE_COUNT_LOGSTASH_KEY[] = "ds-node-count"; - Logstash::stashValue(STAT_TYPE_TIMER, NODE_COUNT_LOGSTASH_KEY, nodeList->getNumAliveNodes()); + Logging::stashValue(STAT_TYPE_TIMER, NODE_COUNT_LOGSTASH_KEY, nodeList->getNumAliveNodes()); gettimeofday(&lastStatSendTime, NULL); } diff --git a/libraries/audio/src/AudioMixer.cpp b/libraries/audio/src/AudioMixer.cpp index c6387ce02a..b11aa9c14b 100644 --- a/libraries/audio/src/AudioMixer.cpp +++ b/libraries/audio/src/AudioMixer.cpp @@ -32,7 +32,7 @@ #include #include -#include +#include #include #include #include @@ -105,8 +105,8 @@ void AudioMixer::run() { stk::StkFrames stkFrameBuffer(BUFFER_LENGTH_SAMPLES_PER_CHANNEL, 1); // if we'll be sending stats, call the Logstash::socket() method to make it load the logstash IP outside the loop - if (Logstash::shouldSendStats()) { - Logstash::socket(); + if (Logging::shouldSendStats()) { + Logging::socket(); } while (true) { @@ -114,7 +114,7 @@ void AudioMixer::run() { break; } - if (Logstash::shouldSendStats()) { + if (Logging::shouldSendStats()) { gettimeofday(&beginSendTime, NULL); } @@ -123,12 +123,12 @@ void AudioMixer::run() { gettimeofday(&lastDomainServerCheckIn, NULL); NodeList::getInstance()->sendDomainServerCheckIn(); - if (Logstash::shouldSendStats() && numStatCollections > 0) { + if (Logging::shouldSendStats() && numStatCollections > 0) { // if we should be sending stats to Logstash send the appropriate average now const char MIXER_LOGSTASH_METRIC_NAME[] = "audio-mixer-frame-time-usage"; float averageFrameTimePercentage = sumFrameTimePercentages / numStatCollections; - Logstash::stashValue(STAT_TYPE_TIMER, MIXER_LOGSTASH_METRIC_NAME, averageFrameTimePercentage); + Logging::stashValue(STAT_TYPE_TIMER, MIXER_LOGSTASH_METRIC_NAME, averageFrameTimePercentage); sumFrameTimePercentages = 0.0f; numStatCollections = 0; @@ -398,7 +398,7 @@ void AudioMixer::run() { } } - if (Logstash::shouldSendStats()) { + if (Logging::shouldSendStats()) { // send a packet to our logstash instance // calculate the percentage value for time elapsed for this send (of the max allowable time) diff --git a/libraries/shared/src/Assignment.cpp b/libraries/shared/src/Assignment.cpp index 850922396f..867854030a 100644 --- a/libraries/shared/src/Assignment.cpp +++ b/libraries/shared/src/Assignment.cpp @@ -130,7 +130,11 @@ int Assignment::packToBuffer(unsigned char* buffer) { return numPackedBytes; } +QString Assignment::toString() const { + return QString("T:%1 P:%2").arg(_type).arg(_pool); +} + QDebug operator<<(QDebug debug, const Assignment &assignment) { - debug << "T:" << assignment.getType() << "P:" << assignment.getPool(); + debug << assignment.toString().toStdString().c_str(); return debug.nospace(); } \ No newline at end of file diff --git a/libraries/shared/src/Assignment.h b/libraries/shared/src/Assignment.h index 693cc42577..34cf065ce5 100644 --- a/libraries/shared/src/Assignment.h +++ b/libraries/shared/src/Assignment.h @@ -54,6 +54,8 @@ public: /// Sets _time to the current time given by gettimeofday void setCreateTimeToNow() { gettimeofday(&_time, NULL); } + QString toString() const; + private: Assignment::Direction _direction; /// the direction of the assignment (Create, Deploy, Request) Assignment::Type _type; /// the type of the assignment, defines what the assignee will do diff --git a/libraries/shared/src/Logging.cpp b/libraries/shared/src/Logging.cpp new file mode 100644 index 0000000000..cb4c249620 --- /dev/null +++ b/libraries/shared/src/Logging.cpp @@ -0,0 +1,106 @@ +// +// Logging.cpp +// hifi +// +// Created by Stephen Birarda on 6/11/13. +// Copyright (c) 2013 HighFidelity, Inc. All rights reserved. +// + +#include +#include +#include + +#include "SharedUtil.h" +#include "NodeList.h" + +#include "Logging.h" + +sockaddr_in Logging::logstashSocket = {}; + +sockaddr* Logging::socket() { + + if (logstashSocket.sin_addr.s_addr == 0) { + // we need to construct the socket object + + // assume IPv4 + logstashSocket.sin_family = AF_INET; + + // use the constant port + logstashSocket.sin_port = htons(LOGSTASH_UDP_PORT); + + // lookup the IP address for the constant hostname + struct hostent* logstashHostInfo; + if ((logstashHostInfo = gethostbyname(LOGSTASH_HOSTNAME))) { + memcpy(&logstashSocket.sin_addr, logstashHostInfo->h_addr_list[0], logstashHostInfo->h_length); + } else { + printf("Failed to lookup logstash IP - will try again on next log attempt.\n"); + } + } + + return (sockaddr*) &logstashSocket; +} + +bool Logging::shouldSendStats() { + static bool shouldSendStats = isInEnvironment("production"); + return shouldSendStats; +} + +void Logging::stashValue(char statType, const char* key, float value) { + static char logstashPacket[MAX_PACKET_SIZE]; + + // load up the logstash packet with the key and the passed float value + // send it to 4 decimal places + int numPacketBytes = sprintf(logstashPacket, "%c %s %.4f", statType, key, value); + + NodeList *nodeList = NodeList::getInstance(); + + if (nodeList) { + nodeList->getNodeSocket()->send(socket(), logstashPacket, numPacketBytes); + } +} + +const QString DEBUG_STRING = "DEBUG"; +const QString WARN_STRING = "WARN"; +const QString ERROR_STRING = "ERROR"; + +const QString& stringForLogType(Logging::Type logType) { + if (logType == Logging::Debug) { + return DEBUG_STRING; + } else if (logType == Logging::Warn) { + return WARN_STRING; + } else { + return ERROR_STRING; + } +} + +// the following will produce 2000-10-02 13:55:36 -0700 +const char DATE_STRING_FORMAT[] = "%F %H:%M:%S %z"; + +void Logging::standardizedLog(const QString &output, const char* targetName, Logging::Type logType) { + time_t rawTime; + time(&rawTime); + struct tm* localTime = localtime(&rawTime); + + // log prefix is in the following format + // [DEBUG] [TIMESTAMP] [PID:PARENT_PID] [TARGET] logged string + + QString prefixString = QString("[%1] ").arg(stringForLogType(logType)); + + char dateString[100]; + strftime(dateString, sizeof(dateString), DATE_STRING_FORMAT, localTime); + + prefixString.append(QString("[%1] ").arg(dateString)); + + prefixString.append(QString("[%1").arg(getpid())); + + pid_t parentProcessID = getppid(); + if (parentProcessID != 0) { + prefixString.append(QString(":%1] ").arg(parentProcessID)); + } else { + prefixString.append("]"); + } + + prefixString.append(QString("[%1]").arg(targetName)); + + qDebug("%s %s", prefixString.toStdString().c_str(), output.toStdString().c_str()); +} \ No newline at end of file diff --git a/libraries/shared/src/Logstash.h b/libraries/shared/src/Logging.h similarity index 66% rename from libraries/shared/src/Logstash.h rename to libraries/shared/src/Logging.h index 7c805ddb23..c8f12ac8b6 100644 --- a/libraries/shared/src/Logstash.h +++ b/libraries/shared/src/Logging.h @@ -1,16 +1,18 @@ // -// Logstash.h +// Logging.h // hifi // // Created by Stephen Birarda on 6/11/13. // Copyright (c) 2013 HighFidelity, Inc. All rights reserved. // -#ifndef __hifi__Logstash__ -#define __hifi__Logstash__ +#ifndef __hifi__Logging__ +#define __hifi__Logging__ #include +#include + const int LOGSTASH_UDP_PORT = 9500; const char LOGSTASH_HOSTNAME[] = "graphite.highfidelity.io"; @@ -18,11 +20,19 @@ const char STAT_TYPE_TIMER = 't'; const char STAT_TYPE_COUNTER = 'c'; const char STAT_TYPE_GAUGE = 'g'; -class Logstash { +class Logging { public: + + enum Type { + Error, + Warn, + Debug + }; + static sockaddr* socket(); static bool shouldSendStats(); static void stashValue(char statType, const char* key, float value); + static void standardizedLog(const QString& output, const char* targetName, Logging::Type logType = Logging::Debug); private: static sockaddr_in logstashSocket; }; diff --git a/libraries/shared/src/Logstash.cpp b/libraries/shared/src/Logstash.cpp deleted file mode 100644 index 63d3da56d9..0000000000 --- a/libraries/shared/src/Logstash.cpp +++ /dev/null @@ -1,60 +0,0 @@ -// -// Logstash.cpp -// hifi -// -// Created by Stephen Birarda on 6/11/13. -// Copyright (c) 2013 HighFidelity, Inc. All rights reserved. -// - -#include -#include -#include - -#include "SharedUtil.h" -#include "NodeList.h" - -#include "Logstash.h" - -sockaddr_in Logstash::logstashSocket = {}; - -sockaddr* Logstash::socket() { - - if (logstashSocket.sin_addr.s_addr == 0) { - // we need to construct the socket object - - // assume IPv4 - logstashSocket.sin_family = AF_INET; - - // use the constant port - logstashSocket.sin_port = htons(LOGSTASH_UDP_PORT); - - // lookup the IP address for the constant hostname - struct hostent* logstashHostInfo; - if ((logstashHostInfo = gethostbyname(LOGSTASH_HOSTNAME))) { - memcpy(&logstashSocket.sin_addr, logstashHostInfo->h_addr_list[0], logstashHostInfo->h_length); - } else { - printf("Failed to lookup logstash IP - will try again on next log attempt.\n"); - } - } - - return (sockaddr*) &logstashSocket; -} - -bool Logstash::shouldSendStats() { - static bool shouldSendStats = isInEnvironment("production"); - return shouldSendStats; -} - -void Logstash::stashValue(char statType, const char* key, float value) { - static char logstashPacket[MAX_PACKET_SIZE]; - - // load up the logstash packet with the key and the passed float value - // send it to 4 decimal places - int numPacketBytes = sprintf(logstashPacket, "%c %s %.4f", statType, key, value); - - NodeList *nodeList = NodeList::getInstance(); - - if (nodeList) { - nodeList->getNodeSocket()->send(socket(), logstashPacket, numPacketBytes); - } -} \ No newline at end of file From fe8fabee3830203f137bb6d7af734325b0fa9535 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 9 Sep 2013 14:31:27 -0700 Subject: [PATCH 3/8] add a static method to the Logging class to change target name --- assignment-client/src/main.cpp | 19 +++++++++++-------- libraries/shared/src/Logging.cpp | 24 ++++++++++++++++++------ libraries/shared/src/Logging.h | 4 +++- 3 files changed, 32 insertions(+), 15 deletions(-) diff --git a/assignment-client/src/main.cpp b/assignment-client/src/main.cpp index 9259e503e3..f375c74f69 100644 --- a/assignment-client/src/main.cpp +++ b/assignment-client/src/main.cpp @@ -61,18 +61,20 @@ void childClient() { if (nodeList->getNodeSocket()->receive(packetData, &receivedBytes) && packetData[0] == PACKET_TYPE_DEPLOY_ASSIGNMENT && packetVersionMatch(packetData)) { + // reset the logging target to the the CHILD_TARGET_NAME + Logging::setTargetName(CHILD_TARGET_NAME); + // construct the deployed assignment from the packet data Assignment deployedAssignment(packetData, receivedBytes); - Logging::standardizedLog(QString("Received an assignment - %1").arg(deployedAssignment.toString()), - CHILD_TARGET_NAME); + Logging::standardizedLog(QString("Received an assignment - %1").arg(deployedAssignment.toString())); // switch our nodelist DOMAIN_IP to the ip receieved in the assignment if (deployedAssignment.getDomainSocket()->sa_family == AF_INET) { in_addr domainSocketAddr = ((sockaddr_in*) deployedAssignment.getDomainSocket())->sin_addr; nodeList->setDomainIP(inet_ntoa(domainSocketAddr)); - Logging::standardizedLog(QString("Changed Domain IP to %1").arg(inet_ntoa(domainSocketAddr)), CHILD_TARGET_NAME); + Logging::standardizedLog(QString("Changed Domain IP to %1").arg(inet_ntoa(domainSocketAddr))); } if (deployedAssignment.getType() == Assignment::AudioMixer) { @@ -81,8 +83,7 @@ void childClient() { AvatarMixer::run(); } - Logging::standardizedLog(QString("Assignment finished or never started - waiting for new assignment"), - CHILD_TARGET_NAME); + Logging::standardizedLog(QString("Assignment finished or never started - waiting for new assignment")); // reset our NodeList by switching back to unassigned and clearing the list nodeList->setOwnerType(NODE_TYPE_UNASSIGNED); @@ -118,8 +119,7 @@ void sigchldHandler(int sig) { // this is the parent, replace the dead process with the new one ::childForks[i] = newForkProcessID; - Logging::standardizedLog(QString("Repleaced dead %1 with new fork %2").arg(processID).arg(newForkProcessID), - PARENT_TARGET_NAME); + Logging::standardizedLog(QString("Replaced dead %1 with new fork %2").arg(processID).arg(newForkProcessID)); break; } @@ -154,6 +154,9 @@ int main(int argc, const char* argv[]) { setvbuf(stdout, NULL, _IOLBF, 0); + // start the Logging class with the parent's target name + Logging::setTargetName(PARENT_TARGET_NAME); + // grab the overriden assignment-server hostname from argv, if it exists const char* customAssignmentServer = getCmdOption(argc, argv, "-a"); if (customAssignmentServer) { @@ -171,7 +174,7 @@ int main(int argc, const char* argv[]) { if (numForksString) { ::numForks = atoi(numForksString); - Logging::standardizedLog(QString("Starting %1 assignment clients").arg(numForks), PARENT_TARGET_NAME); + Logging::standardizedLog(QString("Starting %1 assignment clients").arg(numForks)); ::childForks = new pid_t[numForks]; diff --git a/libraries/shared/src/Logging.cpp b/libraries/shared/src/Logging.cpp index cb4c249620..7fb141eba9 100644 --- a/libraries/shared/src/Logging.cpp +++ b/libraries/shared/src/Logging.cpp @@ -16,6 +16,7 @@ #include "Logging.h" sockaddr_in Logging::logstashSocket = {}; +char* Logging::targetName = NULL; sockaddr* Logging::socket() { @@ -73,10 +74,19 @@ const QString& stringForLogType(Logging::Type logType) { } } +void Logging::setTargetName(const char* targetName) { + // remove the old target name, if it exists + delete Logging::targetName; + + // copy over the new target name + Logging::targetName = new char[strlen(targetName)]; + strcpy(Logging::targetName, targetName); +} + // the following will produce 2000-10-02 13:55:36 -0700 const char DATE_STRING_FORMAT[] = "%F %H:%M:%S %z"; -void Logging::standardizedLog(const QString &output, const char* targetName, Logging::Type logType) { +void Logging::standardizedLog(const QString &output, Logging::Type logType) { time_t rawTime; time(&rawTime); struct tm* localTime = localtime(&rawTime); @@ -84,23 +94,25 @@ void Logging::standardizedLog(const QString &output, const char* targetName, Log // log prefix is in the following format // [DEBUG] [TIMESTAMP] [PID:PARENT_PID] [TARGET] logged string - QString prefixString = QString("[%1] ").arg(stringForLogType(logType)); + QString prefixString = QString("[%1]").arg(stringForLogType(logType)); char dateString[100]; strftime(dateString, sizeof(dateString), DATE_STRING_FORMAT, localTime); - prefixString.append(QString("[%1] ").arg(dateString)); + prefixString.append(QString(" [%1]").arg(dateString)); - prefixString.append(QString("[%1").arg(getpid())); + prefixString.append(QString(" [%1").arg(getpid())); pid_t parentProcessID = getppid(); if (parentProcessID != 0) { - prefixString.append(QString(":%1] ").arg(parentProcessID)); + prefixString.append(QString(":%1]").arg(parentProcessID)); } else { prefixString.append("]"); } - prefixString.append(QString("[%1]").arg(targetName)); + if (Logging::targetName) { + prefixString.append(QString(" [%1]").arg(Logging::targetName)); + } qDebug("%s %s", prefixString.toStdString().c_str(), output.toStdString().c_str()); } \ No newline at end of file diff --git a/libraries/shared/src/Logging.h b/libraries/shared/src/Logging.h index c8f12ac8b6..472063d84c 100644 --- a/libraries/shared/src/Logging.h +++ b/libraries/shared/src/Logging.h @@ -32,9 +32,11 @@ public: static sockaddr* socket(); static bool shouldSendStats(); static void stashValue(char statType, const char* key, float value); - static void standardizedLog(const QString& output, const char* targetName, Logging::Type logType = Logging::Debug); + static void setTargetName(const char* targetName); + static void standardizedLog(const QString& output, Logging::Type logType = Logging::Debug); private: static sockaddr_in logstashSocket; + static char* targetName; }; #endif /* defined(__hifi__Logstash__) */ From b0c9dfeddc3b598a88231430917d4ed84f009e79 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 9 Sep 2013 14:47:15 -0700 Subject: [PATCH 4/8] more leveraging of standardized logging --- assignment-client/src/main.cpp | 9 +++++++-- libraries/audio/src/AudioMixer.cpp | 4 ++++ libraries/avatars/src/AvatarMixer.cpp | 6 ++++++ libraries/shared/src/Logging.cpp | 4 ++++ libraries/shared/src/Logging.h | 1 + libraries/shared/src/Node.cpp | 12 +++++++----- libraries/shared/src/Node.h | 2 ++ libraries/shared/src/NodeList.cpp | 16 ++++++++-------- libraries/shared/src/UDPSocket.cpp | 3 ++- 9 files changed, 41 insertions(+), 16 deletions(-) diff --git a/assignment-client/src/main.cpp b/assignment-client/src/main.cpp index f375c74f69..896b69b274 100644 --- a/assignment-client/src/main.cpp +++ b/assignment-client/src/main.cpp @@ -32,6 +32,9 @@ int numForks = 0; void childClient() { // this is one of the child forks or there is a single assignment client, continue assignment-client execution + // set the logging target to the the CHILD_TARGET_NAME + Logging::setTargetName(CHILD_TARGET_NAME); + // create a NodeList as an unassigned client NodeList* nodeList = NodeList::createInstance(NODE_TYPE_UNASSIGNED); @@ -61,8 +64,7 @@ void childClient() { if (nodeList->getNodeSocket()->receive(packetData, &receivedBytes) && packetData[0] == PACKET_TYPE_DEPLOY_ASSIGNMENT && packetVersionMatch(packetData)) { - // reset the logging target to the the CHILD_TARGET_NAME - Logging::setTargetName(CHILD_TARGET_NAME); + // construct the deployed assignment from the packet data Assignment deployedAssignment(packetData, receivedBytes); @@ -88,6 +90,9 @@ void childClient() { // reset our NodeList by switching back to unassigned and clearing the list nodeList->setOwnerType(NODE_TYPE_UNASSIGNED); nodeList->clear(); + + // reset the logging target to the the CHILD_TARGET_NAME + Logging::setTargetName(CHILD_TARGET_NAME); } } } diff --git a/libraries/audio/src/AudioMixer.cpp b/libraries/audio/src/AudioMixer.cpp index b11aa9c14b..d4b6097134 100644 --- a/libraries/audio/src/AudioMixer.cpp +++ b/libraries/audio/src/AudioMixer.cpp @@ -57,6 +57,8 @@ const unsigned int BUFFER_SEND_INTERVAL_USECS = floorf((BUFFER_LENGTH_SAMPLES_PE const int MAX_SAMPLE_VALUE = std::numeric_limits::max(); const int MIN_SAMPLE_VALUE = std::numeric_limits::min(); +const char AUDIO_MIXER_LOGGING_TARGET_NAME[] = "audio-mixer"; + void attachNewBufferToNode(Node *newNode) { if (!newNode->getLinkedData()) { if (newNode->getType() == NODE_TYPE_AGENT) { @@ -68,6 +70,8 @@ void attachNewBufferToNode(Node *newNode) { } void AudioMixer::run() { + // change the logging target name while this is running + Logging::setTargetName(AUDIO_MIXER_LOGGING_TARGET_NAME); NodeList *nodeList = NodeList::getInstance(); nodeList->setOwnerType(NODE_TYPE_AUDIO_MIXER); diff --git a/libraries/avatars/src/AvatarMixer.cpp b/libraries/avatars/src/AvatarMixer.cpp index 92e27a64af..acf77be8da 100644 --- a/libraries/avatars/src/AvatarMixer.cpp +++ b/libraries/avatars/src/AvatarMixer.cpp @@ -10,6 +10,7 @@ // The avatar mixer receives head, hand and positional data from all connected // nodes, and broadcasts that data back to them, every BROADCAST_INTERVAL ms. +#include #include #include #include @@ -18,6 +19,8 @@ #include "AvatarMixer.h" +const char AVATAR_MIXER_LOGGING_NAME[] = "avatar-mixer"; + unsigned char* addNodeToBroadcastPacket(unsigned char *currentPosition, Node *nodeToAdd) { currentPosition += packNodeId(currentPosition, nodeToAdd->getNodeID()); @@ -81,6 +84,9 @@ void broadcastAvatarData(NodeList* nodeList, sockaddr* nodeAddress) { } void AvatarMixer::run() { + // change the logging target name while AvatarMixer is running + Logging::setTargetName(AVATAR_MIXER_LOGGING_NAME); + NodeList* nodeList = NodeList::getInstance(); nodeList->setOwnerType(NODE_TYPE_AVATAR_MIXER); diff --git a/libraries/shared/src/Logging.cpp b/libraries/shared/src/Logging.cpp index 7fb141eba9..9da64ec271 100644 --- a/libraries/shared/src/Logging.cpp +++ b/libraries/shared/src/Logging.cpp @@ -86,6 +86,10 @@ void Logging::setTargetName(const char* targetName) { // the following will produce 2000-10-02 13:55:36 -0700 const char DATE_STRING_FORMAT[] = "%F %H:%M:%S %z"; +void Logging::standardizedLog(const char *output, Logging::Type logType) { + standardizedLog(QString(output), logType); +} + void Logging::standardizedLog(const QString &output, Logging::Type logType) { time_t rawTime; time(&rawTime); diff --git a/libraries/shared/src/Logging.h b/libraries/shared/src/Logging.h index 472063d84c..705bad86b3 100644 --- a/libraries/shared/src/Logging.h +++ b/libraries/shared/src/Logging.h @@ -33,6 +33,7 @@ public: static bool shouldSendStats(); static void stashValue(char statType, const char* key, float value); static void setTargetName(const char* targetName); + static void standardizedLog(const char* output, Logging::Type logType = Logging::Debug); static void standardizedLog(const QString& output, Logging::Type logType = Logging::Debug); private: static sockaddr_in logstashSocket; diff --git a/libraries/shared/src/Node.cpp b/libraries/shared/src/Node.cpp index c91626d99d..09d8801068 100644 --- a/libraries/shared/src/Node.cpp +++ b/libraries/shared/src/Node.cpp @@ -144,14 +144,16 @@ float Node::getAverageKilobitsPerSecond() { } } -QDebug operator<<(QDebug debug, const Node &node) { +QString Node::toString() const { char publicAddressBuffer[16] = {'\0'}; - unsigned short publicAddressPort = loadBufferWithSocketInfo(publicAddressBuffer, node.getPublicSocket()); + unsigned short publicAddressPort = loadBufferWithSocketInfo(publicAddressBuffer, _publicSocket); //char localAddressBuffer[16] = {'\0'}; //unsigned short localAddressPort = loadBufferWithSocketInfo(localAddressBuffer, node.localSocket); - debug << "#" << node.getNodeID() << node.getTypeName() << node.getType(); - debug.nospace() << publicAddressBuffer << ":" << publicAddressPort; - return debug.nospace(); + return QString("# %1 %2 %3 %4:%5").arg(_nodeID).arg(getTypeName()).arg(_type).arg(publicAddressBuffer).arg(publicAddressPort); +} + +QDebug operator<<(QDebug debug, const Node &node) { + return debug << node.toString(); } diff --git a/libraries/shared/src/Node.h b/libraries/shared/src/Node.h index 2de75bcec1..d22d4e0076 100644 --- a/libraries/shared/src/Node.h +++ b/libraries/shared/src/Node.h @@ -72,6 +72,8 @@ public: void unlock() { pthread_mutex_unlock(&_mutex); } static void printLog(Node const&); + + QString toString() const; private: // privatize copy and assignment operator to disallow Node copying Node(const Node &otherNode); diff --git a/libraries/shared/src/NodeList.cpp b/libraries/shared/src/NodeList.cpp index 4d042b0f63..7b0bef7002 100644 --- a/libraries/shared/src/NodeList.cpp +++ b/libraries/shared/src/NodeList.cpp @@ -14,6 +14,7 @@ #include #include "Assignment.h" +#include "Logging.h" #include "NodeList.h" #include "NodeTypes.h" #include "PacketHeaders.h" @@ -43,7 +44,7 @@ NodeList* NodeList::createInstance(char ownerType, unsigned short int socketList if (!_sharedInstance) { _sharedInstance = new NodeList(ownerType, socketListenPort); } else { - qDebug("NodeList createInstance called with existing instance.\n"); + Logging::standardizedLog("NodeList createInstance called with existing instance."); } return _sharedInstance; @@ -51,7 +52,7 @@ NodeList* NodeList::createInstance(char ownerType, unsigned short int socketList NodeList* NodeList::getInstance() { if (!_sharedInstance) { - qDebug("NodeList getInstance called before call to createInstance. Returning NULL pointer.\n"); + Logging::standardizedLog("NodeList getInstance called before call to createInstance. Returning NULL pointer."); } return _sharedInstance; @@ -278,13 +279,12 @@ void NodeList::sendDomainServerCheckIn() { sockaddr_in tempAddress; memcpy(&tempAddress.sin_addr, pHostInfo->h_addr_list[0], pHostInfo->h_length); strcpy(_domainIP, inet_ntoa(tempAddress.sin_addr)); - - qDebug("Domain Server: %s\n", _domainHostname); + Logging::standardizedLog(QString("Domain Server: %1").arg(_domainHostname)); } else { - qDebug("Failed domain server lookup\n"); + Logging::standardizedLog("Failed domain server lookup", Logging::Warn); } } else if (!printedDomainServerIP) { - qDebug("Domain Server IP: %s\n", _domainIP); + Logging::standardizedLog(QString("Domain Server IP: %1").arg(_domainIP)); printedDomainServerIP = true; } @@ -460,7 +460,7 @@ void NodeList::addNodeToList(Node* newNode) { ++_numNodes; - qDebug() << "Added" << *newNode << "\n"; + Logging::standardizedLog(QString("Added %1").arg(newNode->toString())); notifyHooksOfAddedNode(newNode); } @@ -516,7 +516,7 @@ void* removeSilentNodes(void *args) { if ((checkTimeUSecs - node->getLastHeardMicrostamp()) > NODE_SILENCE_THRESHOLD_USECS) { - qDebug() << "Killed" << *node << "\n"; + Logging::standardizedLog(QString("Killed %1").arg(node->toString())); nodeList->notifyHooksOfKilledNode(&*node); diff --git a/libraries/shared/src/UDPSocket.cpp b/libraries/shared/src/UDPSocket.cpp index ab2460dd7f..f2f5129181 100644 --- a/libraries/shared/src/UDPSocket.cpp +++ b/libraries/shared/src/UDPSocket.cpp @@ -23,6 +23,7 @@ #include +#include "Logging.h" #include "UDPSocket.h" sockaddr_in destSockaddr, senderAddress; @@ -170,7 +171,7 @@ UDPSocket::UDPSocket(unsigned short int listeningPort) : const int DEFAULT_BLOCKING_SOCKET_TIMEOUT_USECS = 0.5 * 1000000; setBlockingReceiveTimeoutInUsecs(DEFAULT_BLOCKING_SOCKET_TIMEOUT_USECS); - qDebug("Created UDP socket listening on port %hu.\n", _listeningPort); + Logging::standardizedLog(QString("Created UDP Socket listening on %1").arg(_listeningPort)); } UDPSocket::~UDPSocket() { From 9a259ea618b1deecc15610dbf88fb7b5ea689a13 Mon Sep 17 00:00:00 2001 From: Leonardo Murillo Date: Mon, 9 Sep 2013 15:51:52 -0600 Subject: [PATCH 5/8] Adding assignment-client to DSL --- jenkins/jobs.groovy | 1 + 1 file changed, 1 insertion(+) diff --git a/jenkins/jobs.groovy b/jenkins/jobs.groovy index 306ee030a8..7cab63d42d 100644 --- a/jenkins/jobs.groovy +++ b/jenkins/jobs.groovy @@ -102,6 +102,7 @@ static Closure cmakeBuild(srcDir, instCommand) { def targets = [ 'animation-server':true, 'assignment-server':true, + 'assignment-client':true, 'domain-server':true, 'eve':true, 'pairing-server':true, From 613334074f2c8d2e7c356b3c63ad4a4322afa1e6 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 9 Sep 2013 15:11:11 -0700 Subject: [PATCH 6/8] leverage qDebug and custom message handler for verbose logging --- assignment-client/src/main.cpp | 19 +++++++----- interface/src/Application.cpp | 4 +-- libraries/shared/src/Assignment.cpp | 6 +--- libraries/shared/src/Assignment.h | 2 -- libraries/shared/src/Logging.cpp | 46 +++++++++++++---------------- libraries/shared/src/Logging.h | 10 +------ libraries/shared/src/Node.cpp | 12 ++++---- libraries/shared/src/Node.h | 2 -- libraries/shared/src/NodeList.cpp | 14 ++++----- libraries/shared/src/UDPSocket.cpp | 2 +- 10 files changed, 49 insertions(+), 68 deletions(-) diff --git a/assignment-client/src/main.cpp b/assignment-client/src/main.cpp index 896b69b274..0579b8bb56 100644 --- a/assignment-client/src/main.cpp +++ b/assignment-client/src/main.cpp @@ -69,14 +69,14 @@ void childClient() { // construct the deployed assignment from the packet data Assignment deployedAssignment(packetData, receivedBytes); - Logging::standardizedLog(QString("Received an assignment - %1").arg(deployedAssignment.toString())); + qDebug() << "Received an assignment -" << deployedAssignment << "\n"; // switch our nodelist DOMAIN_IP to the ip receieved in the assignment if (deployedAssignment.getDomainSocket()->sa_family == AF_INET) { in_addr domainSocketAddr = ((sockaddr_in*) deployedAssignment.getDomainSocket())->sin_addr; nodeList->setDomainIP(inet_ntoa(domainSocketAddr)); - Logging::standardizedLog(QString("Changed Domain IP to %1").arg(inet_ntoa(domainSocketAddr))); + qDebug("Changed Domain IP to %s\n", inet_ntoa(domainSocketAddr)); } if (deployedAssignment.getType() == Assignment::AudioMixer) { @@ -85,7 +85,7 @@ void childClient() { AvatarMixer::run(); } - Logging::standardizedLog(QString("Assignment finished or never started - waiting for new assignment")); + qDebug("Assignment finished or never started - waiting for new assignment\n"); // reset our NodeList by switching back to unassigned and clearing the list nodeList->setOwnerType(NODE_TYPE_UNASSIGNED); @@ -124,7 +124,7 @@ void sigchldHandler(int sig) { // this is the parent, replace the dead process with the new one ::childForks[i] = newForkProcessID; - Logging::standardizedLog(QString("Replaced dead %1 with new fork %2").arg(processID).arg(newForkProcessID)); + qDebug("Replaced dead %d with new fork %d\n", processID, newForkProcessID); break; } @@ -159,6 +159,9 @@ int main(int argc, const char* argv[]) { setvbuf(stdout, NULL, _IOLBF, 0); + // use the verbose message handler in Logging + qInstallMessageHandler(Logging::verboseMessageHandler); + // start the Logging class with the parent's target name Logging::setTargetName(PARENT_TARGET_NAME); @@ -179,12 +182,12 @@ int main(int argc, const char* argv[]) { if (numForksString) { ::numForks = atoi(numForksString); - Logging::standardizedLog(QString("Starting %1 assignment clients").arg(numForks)); + qDebug("Starting %d assignment clients\n", ::numForks); - ::childForks = new pid_t[numForks]; + ::childForks = new pid_t[::numForks]; // fire off as many children as we need (this is one less than the parent since the parent will run as well) - for (int i = 0; i < numForks; i++) { + for (int i = 0; i < ::numForks; i++) { processID = fork(); if (processID == 0) { @@ -197,7 +200,7 @@ int main(int argc, const char* argv[]) { } } - if (processID == 0 || numForks == 0) { + if (processID == 0 || ::numForks == 0) { childClient(); } else { parentMonitor(); diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index ea61179057..7f055abe88 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -48,7 +48,7 @@ #include #include #include -#include +#include #include #include #include @@ -318,7 +318,7 @@ void Application::initializeGL() { const char LOGSTASH_INTERFACE_START_TIME_KEY[] = "interface-start-time"; // ask the Logstash class to record the startup time - Logstash::stashValue(STAT_TYPE_TIMER, LOGSTASH_INTERFACE_START_TIME_KEY, startupTime); + Logging::stashValue(STAT_TYPE_TIMER, LOGSTASH_INTERFACE_START_TIME_KEY, startupTime); } // update before the first render diff --git a/libraries/shared/src/Assignment.cpp b/libraries/shared/src/Assignment.cpp index 867854030a..850922396f 100644 --- a/libraries/shared/src/Assignment.cpp +++ b/libraries/shared/src/Assignment.cpp @@ -130,11 +130,7 @@ int Assignment::packToBuffer(unsigned char* buffer) { return numPackedBytes; } -QString Assignment::toString() const { - return QString("T:%1 P:%2").arg(_type).arg(_pool); -} - QDebug operator<<(QDebug debug, const Assignment &assignment) { - debug << assignment.toString().toStdString().c_str(); + debug << "T:" << assignment.getType() << "P:" << assignment.getPool(); return debug.nospace(); } \ No newline at end of file diff --git a/libraries/shared/src/Assignment.h b/libraries/shared/src/Assignment.h index 34cf065ce5..693cc42577 100644 --- a/libraries/shared/src/Assignment.h +++ b/libraries/shared/src/Assignment.h @@ -54,8 +54,6 @@ public: /// Sets _time to the current time given by gettimeofday void setCreateTimeToNow() { gettimeofday(&_time, NULL); } - QString toString() const; - private: Assignment::Direction _direction; /// the direction of the assignment (Create, Deploy, Request) Assignment::Type _type; /// the type of the assignment, defines what the assignee will do diff --git a/libraries/shared/src/Logging.cpp b/libraries/shared/src/Logging.cpp index 9da64ec271..bfdc3523f1 100644 --- a/libraries/shared/src/Logging.cpp +++ b/libraries/shared/src/Logging.cpp @@ -8,6 +8,7 @@ #include #include +#include #include #include "SharedUtil.h" @@ -60,20 +61,6 @@ void Logging::stashValue(char statType, const char* key, float value) { } } -const QString DEBUG_STRING = "DEBUG"; -const QString WARN_STRING = "WARN"; -const QString ERROR_STRING = "ERROR"; - -const QString& stringForLogType(Logging::Type logType) { - if (logType == Logging::Debug) { - return DEBUG_STRING; - } else if (logType == Logging::Warn) { - return WARN_STRING; - } else { - return ERROR_STRING; - } -} - void Logging::setTargetName(const char* targetName) { // remove the old target name, if it exists delete Logging::targetName; @@ -83,22 +70,31 @@ void Logging::setTargetName(const char* targetName) { strcpy(Logging::targetName, targetName); } +const char* stringForLogType(QtMsgType msgType) { + switch (msgType) { + case QtDebugMsg: + return "DEBUG"; + case QtCriticalMsg: + return "CRITICAL"; + case QtFatalMsg: + return "FATAL"; + case QtWarningMsg: + return "WARNING"; + } +} + // the following will produce 2000-10-02 13:55:36 -0700 const char DATE_STRING_FORMAT[] = "%F %H:%M:%S %z"; -void Logging::standardizedLog(const char *output, Logging::Type logType) { - standardizedLog(QString(output), logType); -} - -void Logging::standardizedLog(const QString &output, Logging::Type logType) { - time_t rawTime; - time(&rawTime); - struct tm* localTime = localtime(&rawTime); - +void Logging::verboseMessageHandler(QtMsgType type, const QMessageLogContext& context, const QString& message) { // log prefix is in the following format // [DEBUG] [TIMESTAMP] [PID:PARENT_PID] [TARGET] logged string - QString prefixString = QString("[%1]").arg(stringForLogType(logType)); + QString prefixString = QString("[%1]").arg(stringForLogType(type)); + + time_t rawTime; + time(&rawTime); + struct tm* localTime = localtime(&rawTime); char dateString[100]; strftime(dateString, sizeof(dateString), DATE_STRING_FORMAT, localTime); @@ -118,5 +114,5 @@ void Logging::standardizedLog(const QString &output, Logging::Type logType) { prefixString.append(QString(" [%1]").arg(Logging::targetName)); } - qDebug("%s %s", prefixString.toStdString().c_str(), output.toStdString().c_str()); + fprintf(stdout, "%s %s", prefixString.toLocal8Bit().constData(), message.toLocal8Bit().constData()); } \ No newline at end of file diff --git a/libraries/shared/src/Logging.h b/libraries/shared/src/Logging.h index 705bad86b3..0bd6197b9a 100644 --- a/libraries/shared/src/Logging.h +++ b/libraries/shared/src/Logging.h @@ -22,19 +22,11 @@ const char STAT_TYPE_GAUGE = 'g'; class Logging { public: - - enum Type { - Error, - Warn, - Debug - }; - static sockaddr* socket(); static bool shouldSendStats(); static void stashValue(char statType, const char* key, float value); static void setTargetName(const char* targetName); - static void standardizedLog(const char* output, Logging::Type logType = Logging::Debug); - static void standardizedLog(const QString& output, Logging::Type logType = Logging::Debug); + static void verboseMessageHandler(QtMsgType type, const QMessageLogContext& context, const QString &message); private: static sockaddr_in logstashSocket; static char* targetName; diff --git a/libraries/shared/src/Node.cpp b/libraries/shared/src/Node.cpp index 09d8801068..c91626d99d 100644 --- a/libraries/shared/src/Node.cpp +++ b/libraries/shared/src/Node.cpp @@ -144,16 +144,14 @@ float Node::getAverageKilobitsPerSecond() { } } -QString Node::toString() const { +QDebug operator<<(QDebug debug, const Node &node) { char publicAddressBuffer[16] = {'\0'}; - unsigned short publicAddressPort = loadBufferWithSocketInfo(publicAddressBuffer, _publicSocket); + unsigned short publicAddressPort = loadBufferWithSocketInfo(publicAddressBuffer, node.getPublicSocket()); //char localAddressBuffer[16] = {'\0'}; //unsigned short localAddressPort = loadBufferWithSocketInfo(localAddressBuffer, node.localSocket); - return QString("# %1 %2 %3 %4:%5").arg(_nodeID).arg(getTypeName()).arg(_type).arg(publicAddressBuffer).arg(publicAddressPort); -} - -QDebug operator<<(QDebug debug, const Node &node) { - return debug << node.toString(); + debug << "#" << node.getNodeID() << node.getTypeName() << node.getType(); + debug.nospace() << publicAddressBuffer << ":" << publicAddressPort; + return debug.nospace(); } diff --git a/libraries/shared/src/Node.h b/libraries/shared/src/Node.h index d22d4e0076..2de75bcec1 100644 --- a/libraries/shared/src/Node.h +++ b/libraries/shared/src/Node.h @@ -72,8 +72,6 @@ public: void unlock() { pthread_mutex_unlock(&_mutex); } static void printLog(Node const&); - - QString toString() const; private: // privatize copy and assignment operator to disallow Node copying Node(const Node &otherNode); diff --git a/libraries/shared/src/NodeList.cpp b/libraries/shared/src/NodeList.cpp index 7b0bef7002..3b16150a00 100644 --- a/libraries/shared/src/NodeList.cpp +++ b/libraries/shared/src/NodeList.cpp @@ -44,7 +44,7 @@ NodeList* NodeList::createInstance(char ownerType, unsigned short int socketList if (!_sharedInstance) { _sharedInstance = new NodeList(ownerType, socketListenPort); } else { - Logging::standardizedLog("NodeList createInstance called with existing instance."); + qDebug("NodeList createInstance called with existing instance."); } return _sharedInstance; @@ -52,7 +52,7 @@ NodeList* NodeList::createInstance(char ownerType, unsigned short int socketList NodeList* NodeList::getInstance() { if (!_sharedInstance) { - Logging::standardizedLog("NodeList getInstance called before call to createInstance. Returning NULL pointer."); + qDebug("NodeList getInstance called before call to createInstance. Returning NULL pointer."); } return _sharedInstance; @@ -279,12 +279,12 @@ void NodeList::sendDomainServerCheckIn() { sockaddr_in tempAddress; memcpy(&tempAddress.sin_addr, pHostInfo->h_addr_list[0], pHostInfo->h_length); strcpy(_domainIP, inet_ntoa(tempAddress.sin_addr)); - Logging::standardizedLog(QString("Domain Server: %1").arg(_domainHostname)); + qDebug("Domain Server: %s", _domainHostname); } else { - Logging::standardizedLog("Failed domain server lookup", Logging::Warn); + qDebug("Failed domain server lookup"); } } else if (!printedDomainServerIP) { - Logging::standardizedLog(QString("Domain Server IP: %1").arg(_domainIP)); + qDebug("Domain Server IP: %s", _domainIP); printedDomainServerIP = true; } @@ -460,7 +460,7 @@ void NodeList::addNodeToList(Node* newNode) { ++_numNodes; - Logging::standardizedLog(QString("Added %1").arg(newNode->toString())); + qDebug() << "Added" << *newNode << "\n"; notifyHooksOfAddedNode(newNode); } @@ -516,7 +516,7 @@ void* removeSilentNodes(void *args) { if ((checkTimeUSecs - node->getLastHeardMicrostamp()) > NODE_SILENCE_THRESHOLD_USECS) { - Logging::standardizedLog(QString("Killed %1").arg(node->toString())); + qDebug() << "Killed " << *node << "\n"; nodeList->notifyHooksOfKilledNode(&*node); diff --git a/libraries/shared/src/UDPSocket.cpp b/libraries/shared/src/UDPSocket.cpp index f2f5129181..d89265b471 100644 --- a/libraries/shared/src/UDPSocket.cpp +++ b/libraries/shared/src/UDPSocket.cpp @@ -171,7 +171,7 @@ UDPSocket::UDPSocket(unsigned short int listeningPort) : const int DEFAULT_BLOCKING_SOCKET_TIMEOUT_USECS = 0.5 * 1000000; setBlockingReceiveTimeoutInUsecs(DEFAULT_BLOCKING_SOCKET_TIMEOUT_USECS); - Logging::standardizedLog(QString("Created UDP Socket listening on %1").arg(_listeningPort)); + qDebug("Created UDP Socket listening on %hd\n", _listeningPort); } UDPSocket::~UDPSocket() { From bbc051a7641bbf5d6c6aa524cf7792bab7768d07 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 9 Sep 2013 15:27:27 -0700 Subject: [PATCH 7/8] add doxygen comments to refactored Logging class --- libraries/shared/src/Logging.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/libraries/shared/src/Logging.h b/libraries/shared/src/Logging.h index 0bd6197b9a..c4f921070a 100644 --- a/libraries/shared/src/Logging.h +++ b/libraries/shared/src/Logging.h @@ -20,12 +20,28 @@ const char STAT_TYPE_TIMER = 't'; const char STAT_TYPE_COUNTER = 'c'; const char STAT_TYPE_GAUGE = 'g'; +/// Handles custom message handling and sending of stats/logs to Logstash instance class Logging { public: + /// \return the socket used to send stats to logstash static sockaddr* socket(); + + /// checks if this target should send stats to logstash, given its current environment + /// \return true if the caller should send stats to logstash static bool shouldSendStats(); + + /// stashes a float value to Logstash instance + /// \param statType a stat type from the constants in this file + /// \param key the key at which to store the stat + /// \param value the value to store static void stashValue(char statType, const char* key, float value); + + /// sets the target name to output via the verboseMessageHandler, called once before logging begins + /// \param targetName the desired target name to output in logs static void setTargetName(const char* targetName); + + /// a qtMessageHandler that can be hooked up to a target that links to Qt + /// prints various process, message type, and time information static void verboseMessageHandler(QtMsgType type, const QMessageLogContext& context, const QString &message); private: static sockaddr_in logstashSocket; From 1c792cf46a0e1f189d03d4ba0743c6f725974649 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 9 Sep 2013 15:35:28 -0700 Subject: [PATCH 8/8] some newline additions for logging in NodeList --- libraries/shared/src/NodeList.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/shared/src/NodeList.cpp b/libraries/shared/src/NodeList.cpp index 3b16150a00..a982e22242 100644 --- a/libraries/shared/src/NodeList.cpp +++ b/libraries/shared/src/NodeList.cpp @@ -279,12 +279,12 @@ void NodeList::sendDomainServerCheckIn() { sockaddr_in tempAddress; memcpy(&tempAddress.sin_addr, pHostInfo->h_addr_list[0], pHostInfo->h_length); strcpy(_domainIP, inet_ntoa(tempAddress.sin_addr)); - qDebug("Domain Server: %s", _domainHostname); + qDebug("Domain Server: %s\n", _domainHostname); } else { - qDebug("Failed domain server lookup"); + qDebug("Failed domain server lookup\n"); } } else if (!printedDomainServerIP) { - qDebug("Domain Server IP: %s", _domainIP); + qDebug("Domain Server IP: %s\n", _domainIP); printedDomainServerIP = true; }