FEATURE: Add default logger with file- and win32 debuglogging
git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@3 67173fc5-114c-0410-ac8e-9d2fd5bffc1fpull/1/head
parent
fe773845cb
commit
96ea41502a
|
@ -0,0 +1,199 @@
|
||||||
|
#include "DefaultLogger.h"
|
||||||
|
#include "aiAssert.h"
|
||||||
|
#include "DefaultIOSystem.h"
|
||||||
|
#include "Win32DebugLogStream.h"
|
||||||
|
#include "IOStream.h"
|
||||||
|
#include "FileLogStream.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
namespace Assimp
|
||||||
|
{
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
DefaultLogger *DefaultLogger::m_pLogger = NULL;
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
struct LogStreamInfo
|
||||||
|
{
|
||||||
|
unsigned int m_uiErrorSeverity;
|
||||||
|
LogStream *m_pStream;
|
||||||
|
|
||||||
|
// Constructor
|
||||||
|
LogStreamInfo( unsigned int uiErrorSev, LogStream *pStream ) :
|
||||||
|
m_uiErrorSeverity( uiErrorSev ),
|
||||||
|
m_pStream( pStream )
|
||||||
|
{
|
||||||
|
// empty
|
||||||
|
}
|
||||||
|
};
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Creates the only singleton instance
|
||||||
|
Logger *DefaultLogger::create(const std::string &name, LogSeverity severity)
|
||||||
|
{
|
||||||
|
ai_assert (NULL == m_pLogger);
|
||||||
|
m_pLogger = new DefaultLogger( name, severity );
|
||||||
|
|
||||||
|
return m_pLogger;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Singleton getter
|
||||||
|
Logger *DefaultLogger::get()
|
||||||
|
{
|
||||||
|
ai_assert (NULL != m_pLogger);
|
||||||
|
return m_pLogger;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Kills the only instance
|
||||||
|
void DefaultLogger::kill()
|
||||||
|
{
|
||||||
|
ai_assert (NULL != m_pLogger);
|
||||||
|
delete m_pLogger;
|
||||||
|
m_pLogger = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Debug message
|
||||||
|
void DefaultLogger::debug(const std::string &message)
|
||||||
|
{
|
||||||
|
if ( m_Severity == Logger::NORMAL )
|
||||||
|
return;
|
||||||
|
|
||||||
|
const std::string msg( "Debug: " + message );
|
||||||
|
writeToStreams( msg, Logger::DEBUGGING );
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Logs an info
|
||||||
|
void DefaultLogger::info(const std::string &message)
|
||||||
|
{
|
||||||
|
const std::string msg( "Info: " + message );
|
||||||
|
writeToStreams( msg , Logger::INFO );
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Logs a warning
|
||||||
|
void DefaultLogger::warn( const std::string &message )
|
||||||
|
{
|
||||||
|
const std::string msg( "Warn: " + message );
|
||||||
|
writeToStreams( msg, Logger::WARN );
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Logs an error
|
||||||
|
void DefaultLogger::error( const std::string &message )
|
||||||
|
{
|
||||||
|
const std::string msg( "Error: " + message );
|
||||||
|
writeToStreams( msg, Logger::ERR );
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Severity setter
|
||||||
|
void DefaultLogger::setLogSeverity( LogSeverity log_severity )
|
||||||
|
{
|
||||||
|
m_Severity = log_severity;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Attachs a new stream
|
||||||
|
void DefaultLogger::attachStream( LogStream *pStream, unsigned int severity )
|
||||||
|
{
|
||||||
|
ai_assert ( NULL != pStream );
|
||||||
|
|
||||||
|
LogStreamInfo *pInfo = new LogStreamInfo( severity, pStream );
|
||||||
|
m_StreamArray.push_back( pInfo );
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Detatch a stream
|
||||||
|
void DefaultLogger::detatchStream( LogStream *pStream, unsigned int severity )
|
||||||
|
{
|
||||||
|
ai_assert ( NULL != pStream );
|
||||||
|
|
||||||
|
for ( StreamIt it = m_StreamArray.begin();
|
||||||
|
it != m_StreamArray.end();
|
||||||
|
++it )
|
||||||
|
{
|
||||||
|
if ( (*it)->m_pStream == pStream )
|
||||||
|
{
|
||||||
|
unsigned int uiSev = (*it)->m_uiErrorSeverity;
|
||||||
|
if ( severity & Logger::INFO )
|
||||||
|
uiSev &= ( ~Logger::INFO );
|
||||||
|
if ( severity & Logger::WARN )
|
||||||
|
uiSev &= ( ~Logger::WARN );
|
||||||
|
if ( severity & Logger::ERR )
|
||||||
|
uiSev &= ( ~Logger::ERR );
|
||||||
|
|
||||||
|
(*it)->m_uiErrorSeverity = uiSev;
|
||||||
|
|
||||||
|
if ( (*it)->m_uiErrorSeverity == 0 )
|
||||||
|
{
|
||||||
|
it = m_StreamArray.erase( it );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Constructor
|
||||||
|
DefaultLogger::DefaultLogger( const std::string &name, LogSeverity severity ) :
|
||||||
|
m_Severity( severity )
|
||||||
|
{
|
||||||
|
if (name.empty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
m_Streams.push_back( new FileLogStream( name ) );
|
||||||
|
m_Streams.push_back( new Win32DebugLogStream() );
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Destructor
|
||||||
|
DefaultLogger::~DefaultLogger()
|
||||||
|
{
|
||||||
|
for ( StreamIt it = m_StreamArray.begin();
|
||||||
|
it != m_StreamArray.end();
|
||||||
|
++it )
|
||||||
|
{
|
||||||
|
delete *it;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (std::vector<LogStream*>::iterator it = m_Streams.begin();
|
||||||
|
it != m_Streams.end();
|
||||||
|
++it)
|
||||||
|
{
|
||||||
|
delete *it;
|
||||||
|
}
|
||||||
|
m_Streams.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Writes message to stream
|
||||||
|
void DefaultLogger::writeToStreams(const std::string &message,
|
||||||
|
ErrorSeverity ErrorSev )
|
||||||
|
{
|
||||||
|
if ( message.empty() )
|
||||||
|
return;
|
||||||
|
|
||||||
|
for ( ConstStreamIt it = this->m_StreamArray.begin();
|
||||||
|
it != m_StreamArray.end();
|
||||||
|
++it)
|
||||||
|
{
|
||||||
|
if ( ErrorSev & (*it)->m_uiErrorSeverity )
|
||||||
|
{
|
||||||
|
(*it)->m_pStream->write( message );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (std::vector<LogStream*>::iterator it = m_Streams.begin();
|
||||||
|
it != m_Streams.end();
|
||||||
|
++it)
|
||||||
|
{
|
||||||
|
(*it)->write( message + std::string("\n"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
} // Namespace Assimp
|
|
@ -0,0 +1,85 @@
|
||||||
|
#include "Logger.h"
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace Assimp
|
||||||
|
{
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
class IOStream;
|
||||||
|
struct LogStreamInfo;
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
/** @class DefaultLogger
|
||||||
|
* @brief Default logging implementation. The logger writes into a file.
|
||||||
|
* The name can be set by creating the logger. If no filename was specified
|
||||||
|
* the logger will use the standard out and error streams.
|
||||||
|
*/
|
||||||
|
class DefaultLogger :
|
||||||
|
public Logger
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/** @brief Creates the only logging instance
|
||||||
|
* @param name Name for logfile
|
||||||
|
* @param severity Log severity, VERBOSE will activate debug messages
|
||||||
|
*/
|
||||||
|
static Logger *create(const std::string &name, LogSeverity severity);
|
||||||
|
|
||||||
|
/** @brief Getter for singleton instance
|
||||||
|
* @return Only instance
|
||||||
|
*/
|
||||||
|
static Logger *get();
|
||||||
|
|
||||||
|
/** @brief Will kill the singleton instance */
|
||||||
|
static void kill();
|
||||||
|
|
||||||
|
/** @brief Logs debug infos, only been written when severity level VERBOSE is set */
|
||||||
|
void debug(const std::string &message);
|
||||||
|
|
||||||
|
/** @brief Logs an info message */
|
||||||
|
void info(const std::string &message);
|
||||||
|
|
||||||
|
/** @brief Logs a warning message */
|
||||||
|
void warn(const std::string &message);
|
||||||
|
|
||||||
|
/** @brief Logs an error message */
|
||||||
|
void error(const std::string &message);
|
||||||
|
|
||||||
|
/** @drief Severity setter */
|
||||||
|
void setLogSeverity(LogSeverity log_severity);
|
||||||
|
|
||||||
|
/** @brief Detach a still attached stream from logger */
|
||||||
|
void attachStream(LogStream *pStream, unsigned int severity);
|
||||||
|
|
||||||
|
/** @brief Detach a still attached stream from logger */
|
||||||
|
void detatchStream(LogStream *pStream, unsigned int severity);
|
||||||
|
|
||||||
|
private:
|
||||||
|
/** @brief Constructor
|
||||||
|
* @param name Name for logfile, keep this empty to use std::cout and std::cerr
|
||||||
|
* @param severity Severity of logger
|
||||||
|
*/
|
||||||
|
DefaultLogger(const std::string &name, LogSeverity severity);
|
||||||
|
|
||||||
|
/** @brief Destructor */
|
||||||
|
~DefaultLogger();
|
||||||
|
|
||||||
|
/** @brief Writes message into a file */
|
||||||
|
void writeToStreams(const std::string &message, ErrorSeverity ErrorSev );
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Aliases for stream container
|
||||||
|
typedef std::vector<LogStreamInfo*> StreamArray;
|
||||||
|
typedef std::vector<LogStreamInfo*>::iterator StreamIt;
|
||||||
|
typedef std::vector<LogStreamInfo*>::const_iterator ConstStreamIt;
|
||||||
|
|
||||||
|
//! only logging instance
|
||||||
|
static DefaultLogger *m_pLogger;
|
||||||
|
//! Logger severity
|
||||||
|
LogSeverity m_Severity;
|
||||||
|
//! Attached streams
|
||||||
|
StreamArray m_StreamArray;
|
||||||
|
//! Array with default streams
|
||||||
|
std::vector<LogStream*> m_Streams;
|
||||||
|
};
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
} // Namespace Assimp
|
|
@ -0,0 +1,66 @@
|
||||||
|
#ifndef ASSIMP_FILELOGSTREAM_H_INC
|
||||||
|
#define ASSIMP_FILELOGSTREAM_H_INC
|
||||||
|
|
||||||
|
#include "LogStream.h"
|
||||||
|
#include "IOStream.h"
|
||||||
|
|
||||||
|
namespace Assimp
|
||||||
|
{
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
/** @class FileLogStream
|
||||||
|
* @brief Logstream to write into a file.
|
||||||
|
*/
|
||||||
|
class FileLogStream :
|
||||||
|
public LogStream
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
FileLogStream( const std::string &strFileName );
|
||||||
|
~FileLogStream();
|
||||||
|
void write( const std::string &message );
|
||||||
|
|
||||||
|
private:
|
||||||
|
IOStream *m_pStream;
|
||||||
|
};
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Constructor
|
||||||
|
inline FileLogStream::FileLogStream( const std::string &strFileName ) :
|
||||||
|
m_pStream(NULL)
|
||||||
|
{
|
||||||
|
if ( strFileName.empty() )
|
||||||
|
return;
|
||||||
|
|
||||||
|
DefaultIOSystem FileSystem;
|
||||||
|
const std::string mode = "w";
|
||||||
|
m_pStream = FileSystem.Open( strFileName, mode );
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Destructor
|
||||||
|
inline FileLogStream::~FileLogStream()
|
||||||
|
{
|
||||||
|
if (NULL != m_pStream)
|
||||||
|
{
|
||||||
|
DefaultIOSystem FileSystem;
|
||||||
|
FileSystem.Close( m_pStream );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Write method
|
||||||
|
inline void FileLogStream::write( const std::string &message )
|
||||||
|
{
|
||||||
|
if (m_pStream != NULL)
|
||||||
|
{
|
||||||
|
size_t size = m_pStream->Write(message.c_str(), sizeof(char),
|
||||||
|
message.size());
|
||||||
|
int i=0;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
} // Namespace Assimp
|
||||||
|
|
||||||
|
#endif
|
|
@ -7,7 +7,7 @@
|
||||||
#include "../include/aiScene.h"
|
#include "../include/aiScene.h"
|
||||||
#include "aiAssert.h"
|
#include "aiAssert.h"
|
||||||
#include "MaterialSystem.h"
|
#include "MaterialSystem.h"
|
||||||
|
#include "DefaultLogger.h"
|
||||||
#include <boost/scoped_ptr.hpp>
|
#include <boost/scoped_ptr.hpp>
|
||||||
#include <boost/format.hpp>
|
#include <boost/format.hpp>
|
||||||
|
|
||||||
|
@ -26,7 +26,8 @@ ObjFileImporter::ObjFileImporter() :
|
||||||
m_pRootObject(NULL),
|
m_pRootObject(NULL),
|
||||||
m_strAbsPath("\\")
|
m_strAbsPath("\\")
|
||||||
{
|
{
|
||||||
// empty
|
DefaultLogger::create( "test.log", DefaultLogger::VERBOSE );
|
||||||
|
DefaultLogger::get()->info("Start logging");
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
@ -39,6 +40,8 @@ ObjFileImporter::~ObjFileImporter()
|
||||||
delete m_pRootObject;
|
delete m_pRootObject;
|
||||||
m_pRootObject = NULL;
|
m_pRootObject = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DefaultLogger::kill();
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
@ -48,6 +51,7 @@ bool ObjFileImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler) c
|
||||||
if (pFile.empty())
|
if (pFile.empty())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
DefaultLogger::get()->info("ObjFileImporter::CanRead");
|
||||||
string::size_type pos = pFile.find_last_of(".");
|
string::size_type pos = pFile.find_last_of(".");
|
||||||
if (string::npos == pos)
|
if (string::npos == pos)
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -0,0 +1,59 @@
|
||||||
|
#ifndef AI_WIN32DEBUGLOGSTREAM_H_INC
|
||||||
|
#define AI_WIN32DEBUGLOGSTREAM_H_INC
|
||||||
|
|
||||||
|
#include "LogStream.h"
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#include "Windows.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace Assimp
|
||||||
|
{
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
/** @class Win32DebugLogStream
|
||||||
|
* @brief Logs into the debug stream from win32.
|
||||||
|
*/
|
||||||
|
class Win32DebugLogStream :
|
||||||
|
public LogStream
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/** @brief Default constructor */
|
||||||
|
Win32DebugLogStream();
|
||||||
|
|
||||||
|
/** @brief Destructor */
|
||||||
|
~Win32DebugLogStream();
|
||||||
|
|
||||||
|
/** @brief Writer */
|
||||||
|
void write(const std::string &messgae);
|
||||||
|
};
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Default constructor
|
||||||
|
inline Win32DebugLogStream::Win32DebugLogStream()
|
||||||
|
{
|
||||||
|
// empty
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Default constructor
|
||||||
|
inline Win32DebugLogStream::~Win32DebugLogStream()
|
||||||
|
{
|
||||||
|
// empty
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Write method
|
||||||
|
inline void Win32DebugLogStream::write(const std::string &message)
|
||||||
|
{
|
||||||
|
OutputDebugString( message.c_str() );
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
} // Namespace Assimp
|
||||||
|
|
||||||
|
#endif
|
|
@ -1,6 +1,8 @@
|
||||||
#ifndef AI_LOGSTREAM_H_INC
|
#ifndef AI_LOGSTREAM_H_INC
|
||||||
#define AI_LOGSTREAM_H_INC
|
#define AI_LOGSTREAM_H_INC
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
namespace Assimp
|
namespace Assimp
|
||||||
{
|
{
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|
|
@ -235,6 +235,18 @@
|
||||||
</File>
|
</File>
|
||||||
</Filter>
|
</Filter>
|
||||||
</Filter>
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Logger"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\include\Logger.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\include\LogStream.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter
|
<Filter
|
||||||
Name="headers"
|
Name="headers"
|
||||||
|
@ -415,6 +427,22 @@
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
</Filter>
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Logger"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\code\DefaultLogger.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\code\FileLogStream.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\code\Win32DebugLogStream.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter
|
<Filter
|
||||||
Name="sources"
|
Name="sources"
|
||||||
|
@ -563,6 +591,14 @@
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
</Filter>
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Logger"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\code\DefaultLogger.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
</Filter>
|
</Filter>
|
||||||
</Files>
|
</Files>
|
||||||
<Globals>
|
<Globals>
|
||||||
|
|
Loading…
Reference in New Issue