diff --git a/assignment-client/src/AssignmentClientApp.cpp b/assignment-client/src/AssignmentClientApp.cpp index 3a962d72d2..c425a239dd 100644 --- a/assignment-client/src/AssignmentClientApp.cpp +++ b/assignment-client/src/AssignmentClientApp.cpp @@ -139,13 +139,13 @@ AssignmentClientApp::AssignmentClientApp(int argc, char* argv[]) : httpStatusPort = parser.value(httpStatusPortOption).toUShort(); } - QDir logDirectory { "." }; + QString logDirectory; + if (parser.isSet(logDirectoryOption)) { logDirectory = parser.value(logDirectoryOption); - } else { - logDirectory = QStandardPaths::writableLocation(QStandardPaths::DataLocation); } + Assignment::Type requestAssignmentType = Assignment::AllTypes; if (argumentVariantMap.contains(ASSIGNMENT_TYPE_OVERRIDE_OPTION)) { requestAssignmentType = (Assignment::Type) argumentVariantMap.value(ASSIGNMENT_TYPE_OVERRIDE_OPTION).toInt(); diff --git a/assignment-client/src/AssignmentClientMonitor.cpp b/assignment-client/src/AssignmentClientMonitor.cpp index f76434d9c7..322fe6e57e 100644 --- a/assignment-client/src/AssignmentClientMonitor.cpp +++ b/assignment-client/src/AssignmentClientMonitor.cpp @@ -33,8 +33,7 @@ AssignmentClientMonitor::AssignmentClientMonitor(const unsigned int numAssignmen const unsigned int maxAssignmentClientForks, Assignment::Type requestAssignmentType, QString assignmentPool, quint16 listenPort, QUuid walletUUID, QString assignmentServerHostname, - quint16 assignmentServerPort, quint16 httpStatusServerPort, QDir logDirectory) : - _logDirectory(logDirectory), + quint16 assignmentServerPort, quint16 httpStatusServerPort, QString logDirectory) : _httpManager(QHostAddress::LocalHost, httpStatusServerPort, "", this), _numAssignmentClientForks(numAssignmentClientForks), _minAssignmentClientForks(minAssignmentClientForks), @@ -48,6 +47,11 @@ AssignmentClientMonitor::AssignmentClientMonitor(const unsigned int numAssignmen { qDebug() << "_requestAssignmentType =" << _requestAssignmentType; + if (!logDirectory.isEmpty()) { + _wantsChildFileLogging = true; + _logDirectory = QDir(logDirectory); + } + // start the Logging class with the parent's target name LogHandler::getInstance().setTargetName(ASSIGNMENT_CLIENT_MONITOR_TARGET_NAME); @@ -159,52 +163,61 @@ void AssignmentClientMonitor::spawnChildClient() { _childArguments.append("--" + ASSIGNMENT_CLIENT_MONITOR_PORT_OPTION); _childArguments.append(QString::number(DependencyManager::get()->getLocalSockAddr().getPort())); - // Setup log files - const QString DATETIME_FORMAT = "yyyyMMdd.hh.mm.ss.zzz"; + QString nowString, stdoutFilenameTemp, stderrFilenameTemp, stdoutPathTemp, stderrPathTemp; - if (!_logDirectory.exists()) { - qDebug() << "Log directory (" << _logDirectory.absolutePath() << ") does not exist, creating."; - _logDirectory.mkpath(_logDirectory.absolutePath()); + + if (_wantsChildFileLogging) { + // Setup log files + const QString DATETIME_FORMAT = "yyyyMMdd.hh.mm.ss.zzz"; + + if (!_logDirectory.exists()) { + qDebug() << "Log directory (" << _logDirectory.absolutePath() << ") does not exist, creating."; + _logDirectory.mkpath(_logDirectory.absolutePath()); + } + + nowString = QDateTime::currentDateTime().toString(DATETIME_FORMAT); + stdoutFilenameTemp = QString("ac-%1-stdout.txt").arg(nowString); + stderrFilenameTemp = QString("ac-%1-stderr.txt").arg(nowString); + stdoutPathTemp = _logDirectory.absoluteFilePath(stdoutFilenameTemp); + stderrPathTemp = _logDirectory.absoluteFilePath(stderrFilenameTemp); + + // reset our output and error files + assignmentClient->setStandardOutputFile(stdoutPathTemp); + assignmentClient->setStandardErrorFile(stderrPathTemp); } - auto nowString = QDateTime::currentDateTime().toString(DATETIME_FORMAT); - auto stdoutFilenameTemp = QString("ac-%1-stdout.txt").arg(nowString); - auto stderrFilenameTemp = QString("ac-%1-stderr.txt").arg(nowString); - QString stdoutPathTemp = _logDirectory.absoluteFilePath(stdoutFilenameTemp); - QString stderrPathTemp = _logDirectory.absoluteFilePath(stderrFilenameTemp); - - // reset our output and error files - assignmentClient->setStandardOutputFile(stdoutPathTemp); - assignmentClient->setStandardErrorFile(stderrPathTemp); - // make sure that the output from the child process appears in our output assignmentClient->setProcessChannelMode(QProcess::ForwardedChannels); - assignmentClient->start(QCoreApplication::applicationFilePath(), _childArguments); - // Update log path to use PID in filename - auto stdoutFilename = QString("ac-%1_%2-stdout.txt").arg(nowString).arg(assignmentClient->processId()); - auto stderrFilename = QString("ac-%1_%2-stderr.txt").arg(nowString).arg(assignmentClient->processId()); - QString stdoutPath = _logDirectory.absoluteFilePath(stdoutFilename); - QString stderrPath = _logDirectory.absoluteFilePath(stderrFilename); + QString stdoutPath, stderrPath; - qDebug() << "Renaming " << stdoutPathTemp << " to " << stdoutPath; - if (!_logDirectory.rename(stdoutFilenameTemp, stdoutFilename)) { - qDebug() << "Failed to rename " << stdoutFilenameTemp; - stdoutPath = stdoutPathTemp; - stdoutFilename = stdoutFilenameTemp; + if (_wantsChildFileLogging) { + + // Update log path to use PID in filename + auto stdoutFilename = QString("ac-%1_%2-stdout.txt").arg(nowString).arg(assignmentClient->processId()); + auto stderrFilename = QString("ac-%1_%2-stderr.txt").arg(nowString).arg(assignmentClient->processId()); + stdoutPath = _logDirectory.absoluteFilePath(stdoutFilename); + stderrPath = _logDirectory.absoluteFilePath(stderrFilename); + + qDebug() << "Renaming " << stdoutPathTemp << " to " << stdoutPath; + if (!_logDirectory.rename(stdoutFilenameTemp, stdoutFilename)) { + qDebug() << "Failed to rename " << stdoutFilenameTemp; + stdoutPath = stdoutPathTemp; + stdoutFilename = stdoutFilenameTemp; + } + + qDebug() << "Renaming " << stderrPathTemp << " to " << stderrPath; + if (!QFile::rename(stderrPathTemp, stderrPath)) { + qDebug() << "Failed to rename " << stderrFilenameTemp; + stderrPath = stderrPathTemp; + stderrFilename = stderrFilenameTemp; + } + + qDebug() << "Child stdout being written to: " << stdoutFilename; + qDebug() << "Child stderr being written to: " << stderrFilename; } - qDebug() << "Renaming " << stderrPathTemp << " to " << stderrPath; - if (!QFile::rename(stderrPathTemp, stderrPath)) { - qDebug() << "Failed to rename " << stderrFilenameTemp; - stderrPath = stderrPathTemp; - stderrFilename = stderrFilenameTemp; - } - - qDebug() << "Child stdout being written to: " << stdoutFilename; - qDebug() << "Child stderr being written to: " << stderrFilename; - if (assignmentClient->processId() > 0) { auto pid = assignmentClient->processId(); // make sure we hear that this process has finished when it does @@ -212,6 +225,7 @@ void AssignmentClientMonitor::spawnChildClient() { this, [this, pid]() { childProcessFinished(pid); }); qDebug() << "Spawned a child client with PID" << assignmentClient->processId(); + _childProcesses.insert(assignmentClient->processId(), { assignmentClient, stdoutPath, stderrPath }); } } diff --git a/assignment-client/src/AssignmentClientMonitor.h b/assignment-client/src/AssignmentClientMonitor.h index a5ae3cd1af..a7f69a559b 100644 --- a/assignment-client/src/AssignmentClientMonitor.h +++ b/assignment-client/src/AssignmentClientMonitor.h @@ -38,7 +38,7 @@ public: AssignmentClientMonitor(const unsigned int numAssignmentClientForks, const unsigned int minAssignmentClientForks, const unsigned int maxAssignmentClientForks, Assignment::Type requestAssignmentType, QString assignmentPool, quint16 listenPort, QUuid walletUUID, QString assignmentServerHostname, - quint16 assignmentServerPort, quint16 httpStatusServerPort, QDir logDirectory); + quint16 assignmentServerPort, quint16 httpStatusServerPort, QString logDirectory); ~AssignmentClientMonitor(); void stopChildProcesses(); @@ -73,6 +73,8 @@ private: quint16 _assignmentServerPort; QMap _childProcesses; + + bool _wantsChildFileLogging { false }; }; #endif // hifi_AssignmentClientMonitor_h