94 lines
4.1 KiB
C
94 lines
4.1 KiB
C
|
//
|
||
|
// Copyright (c) 2010-2011 Matthew Jack and Doug Binks
|
||
|
//
|
||
|
// This software is provided 'as-is', without any express or implied
|
||
|
// warranty. In no event will the authors be held liable for any damages
|
||
|
// arising from the use of this software.
|
||
|
// Permission is granted to anyone to use this software for any purpose,
|
||
|
// including commercial applications, and to alter it and redistribute it
|
||
|
// freely, subject to the following restrictions:
|
||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||
|
// claim that you wrote the original software. If you use this software
|
||
|
// in a product, an acknowledgment in the product documentation would be
|
||
|
// appreciated but is not required.
|
||
|
// 2. Altered source versions must be plainly marked as such, and must not be
|
||
|
// misrepresented as being the original software.
|
||
|
// 3. This notice may not be removed or altered from any source distribution.
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
#ifndef ILOGSYSTEM_INCLUDED
|
||
|
#define ILOGSYSTEM_INCLUDED
|
||
|
|
||
|
// I'm not sure if testing the log system makes much sense
|
||
|
// Might be room for a super-verbose debugging log level
|
||
|
// This might genuinely be worth multithreaded
|
||
|
// Differing file/console later. Console buffer later.
|
||
|
// note that eLV_ is probably the thing to grep for, if we insist it must be specified.
|
||
|
|
||
|
// Add a way to set a callback function that can be used to generate prefixes - in this case frame and time
|
||
|
// a flush might be a useful addition, or two modes, one of which will always flush, and some catch on exit() that will ensure it gets output?
|
||
|
|
||
|
// The log system is an exception to orthogonality in that it can be passed into UnitTest methods that exist in all other systems.
|
||
|
// Without it, we could not report where our systems were going wrong in a consistent manner. This is part of the reason why ILogSystem
|
||
|
// does _not_ have a proper UnitTest method and instead relies upon external examination.
|
||
|
|
||
|
//#include "Settings.h"
|
||
|
#include "ISystem.h"
|
||
|
#include <stdarg.h> // Only simple definitions
|
||
|
|
||
|
static const int LOGSYSTEM_MAX_BUFFER = 4096;
|
||
|
|
||
|
enum ELogVerbosity
|
||
|
{
|
||
|
eLV_NEVER, // Never output, always ignore
|
||
|
eLV_ERRORS, // Only output when broken
|
||
|
eLV_WARNINGS, // ... and output when suspicious
|
||
|
eLV_EVENTS, // ... and output events considered "highest-level" for this system
|
||
|
eLV_COMMENTS, // ... and output everything else that we're doing
|
||
|
};
|
||
|
|
||
|
struct ILogSystem : public ISystem
|
||
|
{
|
||
|
public:
|
||
|
//// ISystem methods
|
||
|
//virtual SErrorDescriptor UnitTest(ILogSystem *pLog) = 0; // Unit testing a logger is awkward - we delegate it
|
||
|
|
||
|
//// New methods
|
||
|
virtual ~ILogSystem() {};
|
||
|
|
||
|
typedef const ELogVerbosity * const TVerbosityPeeker;
|
||
|
|
||
|
virtual ELogVerbosity GetVerbosity() const = 0; // Get currently set verbosity level
|
||
|
virtual void SetVerbosity(ELogVerbosity eVerbosity) = 0; // Set verbosity level. Defaults to eLV_EVENTS
|
||
|
virtual TVerbosityPeeker GetVerbosityPeeker() const = 0; // Get a pointer to the current verbosity level to store and use for fast "peek" with no function call
|
||
|
// Remains valid for the lifetime of the log instance
|
||
|
|
||
|
// Log a message with given minimum verbosity level and printf syntax
|
||
|
virtual void Log(ELogVerbosity eVerbosity, const char * format, ...) = 0;
|
||
|
// Log a message with given minimum verbosity level taking a va_list - used when wrapping this logging and re-exposing as printf syntax
|
||
|
// Argument order is chosen to make it harder to accidentally call the variadic version
|
||
|
virtual void LogVa(va_list args, ELogVerbosity eVerbosity, const char * format) = 0;
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
// Allow avoiding debug code, allow compiling it out, etc.
|
||
|
// Note there are apparently some variations for varaiadic macros - GCC etc.
|
||
|
|
||
|
#ifndef PN_LOG_LEVEL
|
||
|
#define PN_LOG_LEVEL eLV_COMMENTS
|
||
|
#endif
|
||
|
|
||
|
#define PN_LOG(env,level,format,...) \
|
||
|
if ( (level) <= PN_LOG_LEVEL ) {(env)->sys->pLogSystem->Log((level),(format),__VA_ARGS__);}
|
||
|
|
||
|
#define PN_LOG_EXT(env,level,code_block,format,...) \
|
||
|
if ( (level) <= PN_LOG_LEVEL ) \
|
||
|
{ \
|
||
|
code_block ; \
|
||
|
(env)->sys->pLogSystem->Log((level),(format),__VA_ARGS__); \
|
||
|
}
|
||
|
|
||
|
|
||
|
#endif //ILOGSYSTEM_INCLUDED
|