| 1698 | } |
| 1699 | |
| 1700 | void TypedConfigurations::insertFile(Level level, const std::string& fullFilename) { |
| 1701 | #if defined(ELPP_NO_LOG_TO_FILE) |
| 1702 | setValue(level, false, &m_toFileMap); |
| 1703 | ELPP_UNUSED(fullFilename); |
| 1704 | m_fileStreamMap.insert(std::make_pair(level, base::FileStreamPtr(nullptr))); |
| 1705 | return; |
| 1706 | #endif |
| 1707 | std::string resolvedFilename = resolveFilename(fullFilename); |
| 1708 | if (resolvedFilename.empty()) { |
| 1709 | std::cerr << "Could not load empty file for logging, please re-check your configurations for level [" |
| 1710 | << LevelHelper::convertToString(level) << "]"; |
| 1711 | } |
| 1712 | std::string filePath = base::utils::File::extractPathFromFilename(resolvedFilename, base::consts::kFilePathSeperator); |
| 1713 | if (filePath.size() < resolvedFilename.size()) { |
| 1714 | base::utils::File::createPath(filePath); |
| 1715 | } |
| 1716 | auto create = [&](Level level) { |
| 1717 | base::LogStreamsReferenceMap::iterator filestreamIter = m_logStreamsReference->find(resolvedFilename); |
| 1718 | base::type::fstream_t* fs = nullptr; |
| 1719 | if (filestreamIter == m_logStreamsReference->end()) { |
| 1720 | // We need a completely new stream, nothing to share with |
| 1721 | fs = base::utils::File::newFileStream(resolvedFilename); |
| 1722 | m_filenameMap.insert(std::make_pair(level, resolvedFilename)); |
| 1723 | m_fileStreamMap.insert(std::make_pair(level, base::FileStreamPtr(fs))); |
| 1724 | m_logStreamsReference->insert(std::make_pair(resolvedFilename, base::FileStreamPtr(m_fileStreamMap.at(level)))); |
| 1725 | } else { |
| 1726 | // Woops! we have an existing one, share it! |
| 1727 | m_filenameMap.insert(std::make_pair(level, filestreamIter->first)); |
| 1728 | m_fileStreamMap.insert(std::make_pair(level, base::FileStreamPtr(filestreamIter->second))); |
| 1729 | fs = filestreamIter->second.get(); |
| 1730 | } |
| 1731 | if (fs == nullptr) { |
| 1732 | // We display bad file error from newFileStream() |
| 1733 | ELPP_INTERNAL_ERROR("Setting [TO_FILE] of [" |
| 1734 | << LevelHelper::convertToString(level) << "] to FALSE", false); |
| 1735 | setValue(level, false, &m_toFileMap); |
| 1736 | } |
| 1737 | }; |
| 1738 | // If we dont have file conf for any level, create it for Level::Global first |
| 1739 | // otherwise create for specified level |
| 1740 | create(m_filenameMap.empty() && m_fileStreamMap.empty() ? Level::Global : level); |
| 1741 | } |
| 1742 | |
| 1743 | bool TypedConfigurations::unsafeValidateFileRolling(Level level, const PreRollOutCallback& preRollOutCallback) { |
| 1744 | base::type::fstream_t* fs = unsafeGetConfigByRef(level, &m_fileStreamMap, "fileStream").get(); |