blob: 2d1709a86aceda8faccebf370d624999aa488bbb [file] [log] [blame]
/*
* 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 <sys/types.h>
#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<boost::mutex> 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<std::string>(boost::this_thread::get_id());
}
void Logger::init(const char* path){
static bool initialized = false;
boost::lock_guard<boost::mutex> 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<boost::mutex> logLock(Drill::Logger::m_logMutex);
boost::lock_guard<boost::mutex> 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