Index: src/liblogger/TAsyncMultiLogger.cpp =================================================================== diff -u -N -ra4635addad389b9e117679437a3e1b64a739ea96 -rdf9de596aad09b008aa076f8e5bb479f19c77259 --- src/liblogger/TAsyncMultiLogger.cpp (.../TAsyncMultiLogger.cpp) (revision a4635addad389b9e117679437a3e1b64a739ea96) +++ src/liblogger/TAsyncMultiLogger.cpp (.../TAsyncMultiLogger.cpp) (revision df9de596aad09b008aa076f8e5bb479f19c77259) @@ -21,6 +21,7 @@ #include #include #include +#include namespace logger { @@ -64,6 +65,8 @@ TLogFileDataPtr TAsyncMultiLogger::CreateLoggerData(PCTSTR pszLogPath, const TMultiLoggerConfigPtr& spLoggerConfig) { TLogFileDataPtr spLogFileData = std::make_shared(pszLogPath, spLoggerConfig, m_spGlobalRotationInfo); + if(!m_bLoggingEnabled) + spLogFileData->DisableLogging(); boost::unique_lock lock(m_mutex); m_setLoggerData.insert(spLogFileData); @@ -97,14 +100,14 @@ try { - std::vector vHandles; - bool bStopProcessing = false; do { + std::vector vHandles; + std::wstring strError; + { boost::unique_lock lock(pAsyncLogger->m_mutex); - vHandles.clear(); vHandles.push_back(pAsyncLogger->m_spStopEvent.get()); std::transform(pAsyncLogger->m_setLoggerData.begin(), pAsyncLogger->m_setLoggerData.end(), std::back_inserter(vHandles), [](const TLogFileDataPtr& rData) { return rData->GetEntriesEvent().get(); }); @@ -116,7 +119,17 @@ bStopProcessing = true; break; } + if(dwWaitResult == WAIT_FAILED) + { + DWORD dwLastError = GetLastError(); + _ASSERTE(dwLastError == ERROR_SUCCESS); + strError = boost::str(boost::wformat(L"Asynchronous logger critical failure: waiting failed with error %1%. Logging will be disabled until the application will be restarted.") % dwLastError); + pAsyncLogger->m_bLoggingEnabled = false; + + bStopProcessing = true; + } + std::vector vLogs; { boost::shared_lock lock(pAsyncLogger->m_mutex); @@ -127,6 +140,13 @@ { try { + // append emergency message + if(!strError.empty()) + { + spLogData->PushLogEntry(strError); + spLogData->DisableLogging(); + } + spLogData->StoreLogEntries(); spLogData->CloseUnusedFile(); }