//---------------------------------------------------------------------------
//
// Project: OpenWalnut ( http://www.openwalnut.org )
//
// Copyright 2009 OpenWalnut Community, BSV@Uni-Leipzig and CNCF@MPI-CBS
// For more information see http://www.openwalnut.org/copying
//
// This file is part of OpenWalnut.
//
// OpenWalnut is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// OpenWalnut is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with OpenWalnut. If not, see .
//
//---------------------------------------------------------------------------
#include
#include
#include "boost/date_time/posix_time/posix_time.hpp"
#include
#include "WLogger.h"
WLogger::WLogger( std::string fileName, LogLevel level ):
WThreadedRunner(),
m_LogLevel( level ),
m_STDOUTLevel( level ),
m_STDERRLevel( LL_ERROR ),
m_LogFileLevel( level ),
m_LogFileName( fileName ),
m_QueueMutex()
{
addLogMessage( "Initalizing Logger", "Logger", LL_DEBUG );
addLogMessage( "===============================================================================", "Logger", LL_INFO );
addLogMessage( "= Starting Log Session =", "Logger", LL_INFO );
addLogMessage( "===============================================================================", "Logger", LL_INFO );
}
WLogger::~WLogger()
{
}
void WLogger::setLogLevel( LogLevel level )
{
m_LogLevel = level;
}
void WLogger::setSTDOUTLevel( LogLevel level )
{
m_STDOUTLevel = level;
}
void WLogger::setSTDERRLevel( LogLevel level )
{
m_STDERRLevel = level;
}
void WLogger::setLogFileLevel( LogLevel level )
{
m_LogFileLevel = level;
}
void WLogger::setLogFileName( std::string fileName )
{
/**
* TODO (schurade) check if it's a valid filename
*/
m_LogFileName = fileName;
}
void WLogger::addLogMessage( std::string message, std::string source, LogLevel level )
{
if ( m_LogLevel > level || m_FinishRequested )
{
return;
}
boost::posix_time::ptime t( boost::posix_time::second_clock::local_time() );
std::string timeString( to_simple_string( t ) );
WLogEntry entry( timeString, message, level, source );
boost::mutex::scoped_lock l( m_QueueMutex );
m_LogQueue.push( entry );
}
void WLogger::processQueue()
{
boost::mutex::scoped_lock l( m_QueueMutex );
while ( !m_LogQueue.empty() )
{
WLogEntry entry = m_LogQueue.front();
m_LogQueue.pop();
m_SessionLog.push_back( entry );
if ( entry.getLogLevel() >= m_STDOUTLevel )
{
std::cout << entry.getLogString();
}
if ( entry.getLogLevel() >= m_STDERRLevel )
{
std::cerr << entry.getLogString();
}
if ( entry.getLogLevel() >= m_LogFileLevel )
{
boost::filesystem::path p( "walnut.log" );
boost::filesystem::ofstream ofs( p, boost::filesystem::ofstream::app );
ofs << entry.getLogString();
}
}
}
void WLogger::threadMain()
{
// Since the modules run in a separate thread: such loops are possible
while ( !m_FinishRequested )
{
processQueue();
// do fancy stuff
sleep( 1 );
}
// clean up stuff
}