/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include "boost/date_time/posix_time/posix_time.hpp" #include "boost/thread.hpp" #include "env.h" #include "utils.hpp" #include "logger.hpp" namespace Drill{ /* * Creates a single instance of the logger the first time this is called */ /* static */ boost::mutex g_logMutex; Logger& getLogger() { boost::lock_guard logLock(g_logMutex); static Logger* logger = new Logger(); return *logger; } std::string getTime(){ return to_simple_string(boost::posix_time::second_clock::local_time()); } std::string getTid(){ return boost::lexical_cast(boost::this_thread::get_id()); } void Logger::init(const char* path){ static bool initialized = false; boost::lock_guard logLock(m_logMutex); if (!initialized && path != NULL) { std::string fullname = path; size_t lastindex = fullname.find_last_of("."); std::string filename; if (lastindex != std::string::npos){ filename = fullname.substr(0, lastindex) + "-" + Utils::to_string(Utils::s_randomNumber()) + fullname.substr(lastindex, fullname.length()); } else{ filename = fullname.substr(0, fullname.length()) + "-" + Utils::to_string(Utils::s_randomNumber()) + ".log"; } //m_filepath=path; m_filepath = filename.c_str(); m_pOutFileStream = new std::ofstream; m_pOutFileStream->open(m_filepath.c_str(), std::ios_base::out | std::ios_base::app); if (!m_pOutFileStream->is_open()){ std::cerr << "Logfile ( " << m_filepath << ") could not be opened. Logging to stdout" << std::endl; m_filepath.erase(); delete m_pOutFileStream; m_pOutFileStream=NULL; } initialized = true; m_pOutStream = (m_pOutFileStream != NULL) ? m_pOutFileStream : &std::cout; #if defined _WIN32 || defined _WIN64 TCHAR szFile[MAX_PATH]; GetModuleFileName(NULL, szFile, MAX_PATH); #endif *m_pOutStream << "Drill Client Library" << std::endl << "Build info:" << GIT_COMMIT_PROP << std::endl #if defined _WIN32 || defined _WIN64 << "Loaded by process: " << szFile << std::endl << "Current process id is: " << ::GetCurrentProcessId() << std::endl #else << "Current process id is: " << getpid() << std::endl #endif << "Initialized Logging to file (" << ((path!=NULL)?path:"std::out") << "). " << std::endl; } } void Logger::close(){ //boost::lock_guard logLock(Drill::Logger::m_logMutex); boost::lock_guard logLock(m_logMutex); if (m_pOutFileStream != NULL){ if (m_pOutFileStream->is_open()){ m_pOutFileStream->close(); } delete m_pOutFileStream; m_pOutFileStream = NULL; m_pOutStream = &std::cout; // set it back to std::cout in case someone tries to log even after close } } // The log call itself cannot be thread safe. Use the DRILL_MT_LOG macro to make // this thread safe std::ostream& Logger::log(logLevel_t level){ *m_pOutStream << getTime(); *m_pOutStream << " : " << levelAsString(level); *m_pOutStream << " : " << getTid(); *m_pOutStream << " : "; return *m_pOutStream; } } // namespace Drill