Initial commit
This commit is contained in:
269
Include/ZUtil/ZLog.hpp
Normal file
269
Include/ZUtil/ZLog.hpp
Normal file
@@ -0,0 +1,269 @@
|
||||
/*
|
||||
ZLog.hpp
|
||||
Author: James Russell
|
||||
|
||||
Purpose:
|
||||
|
||||
Logging utility. The logging class cannot be instantiated, but instead is utilized through
|
||||
static public method calls. The logging system must be initialized before use and can be
|
||||
shutdown at any time. Any logging calls placed after the system has been shutdown amount
|
||||
to a no-op.
|
||||
|
||||
The logging system is thread-safe.
|
||||
|
||||
License:
|
||||
|
||||
TODO
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _ZLOG_HPP
|
||||
#define _ZLOG_HPP
|
||||
|
||||
#include <ZSTL/ZPair.hpp>
|
||||
#include <ZSTL/ZString.hpp>
|
||||
|
||||
#include <ZUtil/ZMutex.hpp>
|
||||
#include <ZUtil/ZSmartPointer.hpp>
|
||||
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
|
||||
//Typedef to define a log file handle
|
||||
typedef size_t ZLogFile;
|
||||
|
||||
//Logging type enumeration used to specify which level of log is being performed
|
||||
enum ZLogType
|
||||
{
|
||||
LOG_ERROR, //Used when an error condition has occurred
|
||||
LOG_WARNING, //Used when a recoverable error condition has occurred
|
||||
LOG_INFO, //Used when significant events have occurred
|
||||
LOG_SPAM, //Used for insignificant events and process flow notification
|
||||
LOG_SIZE
|
||||
};
|
||||
|
||||
//Overall Logging Levels
|
||||
#define ZLOG_LEVEL_NONE 0
|
||||
#define ZLOG_LEVEL_ERROR 1
|
||||
#define ZLOG_LEVEL_WARNING 2
|
||||
#define ZLOG_LEVEL_INFO 3
|
||||
#define ZLOG_LEVEL_SPAM 4
|
||||
|
||||
//If the log level is not defined by the user, then ensure all logging is handled
|
||||
#ifndef ZLOG_LEVEL
|
||||
#define ZLOG_LEVEL ZLOG_LEVEL_SPAM
|
||||
#endif
|
||||
|
||||
//Define used to enumerate the default log file
|
||||
#define ZLOGFILE_DEFAULT 0
|
||||
|
||||
#if defined(_MSC_VER) || defined(__GNUC__) || defined(__SUNPRO_CC) //C99 style variadic macros
|
||||
|
||||
#define SystemLogError(...) ZLog::Printf(LOG_ERROR, ZLOGFILE_DEFAULT, 0, 0, __FUNCTION__, __VA_ARGS__)
|
||||
#define SystemLogWarning(...) ZLog::Printf(LOG_WARNING, ZLOGFILE_DEFAULT, 0, 0, __FUNCTION__, __VA_ARGS__)
|
||||
#define SystemLogInfo(...) ZLog::Printf(LOG_INFO, ZLOGFILE_DEFAULT, 0, 0, __FUNCTION__, __VA_ARGS__)
|
||||
#define SystemLogSpam(...) ZLog::Printf(LOG_SPAM, ZLOGFILE_DEFAULT, 0, 0, __FUNCTION__, __VA_ARGS__)
|
||||
|
||||
#if ZLOG_LEVEL < ZLOG_LEVEL_SPAM
|
||||
#undef SystemLogSpam
|
||||
#define SystemLogSpam(...)
|
||||
#endif
|
||||
#if ZLOG_LEVEL < ZLOG_LEVEL_INFO
|
||||
#undef SystemLogInfo
|
||||
#define SystemLogInfo(...)
|
||||
#endif
|
||||
#if ZLOG_LEVEL < ZLOG_LEVEL_WARNING
|
||||
#undef SystemLogWarning
|
||||
#define SystemLogWarning(...)
|
||||
#endif
|
||||
#if ZLOG_LEVEL < ZLOG_LEVEL_ERROR
|
||||
#undef SystemLogError
|
||||
#define SystemLogError(...)
|
||||
#endif
|
||||
#if (ZLOG_LEVEL < ZLOG_LEVEL_NONE) || (ZLOG_LEVEL > ZLOG_LEVEL_SPAM)
|
||||
#error ZLOG_LEVEL Set to Invalid Value!
|
||||
#endif
|
||||
|
||||
#else //Not C99-style variadic macro
|
||||
|
||||
#error Define variadic macro flavor for your compiler in ZLog.hpp
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
Logging delegate. Called when a log entry has been made.
|
||||
*/
|
||||
class ZLogDelegate
|
||||
{
|
||||
public:
|
||||
virtual ~ZLogDelegate() { }
|
||||
/*
|
||||
virtual public ZLogDelegate::Execute
|
||||
|
||||
Delegate execute method. This is called whenever a logging entry has been made.
|
||||
|
||||
@param _type - the type of logging entry
|
||||
@param _file - the log file written to
|
||||
@param _logEntry - the logging entry made
|
||||
@return (void)
|
||||
*/
|
||||
virtual void Execute(ZLogType _type, ZLogFile _file, const ZString& _logEntry) = 0;
|
||||
};
|
||||
|
||||
/*
|
||||
ZEngine logging class.
|
||||
*/
|
||||
class ZLog
|
||||
{
|
||||
private:
|
||||
//Mutex for logging system
|
||||
static ZMutex LogLock;
|
||||
|
||||
//Boolean indicating the logging system is activated
|
||||
static bool bIsInitialized;
|
||||
|
||||
//Array of logging output streams (second pair parameter indicates active / suspended)
|
||||
static ZArray< ZPair<std::ofstream*, bool> > LogFiles;
|
||||
|
||||
//Array of logging delegates
|
||||
static ZArray< ZPtr<ZLogDelegate> > Delegates;
|
||||
|
||||
//Root path for logging
|
||||
static ZString LogFileRoot;
|
||||
|
||||
//Maintained Tick Count
|
||||
static uint64_t *UserTick;
|
||||
|
||||
//Maintained Update Frame Count
|
||||
static uint64_t *UserUpdate;
|
||||
|
||||
//Tick Estimate when NULL is passed in as Tick
|
||||
static uint64_t TickEstimate;
|
||||
|
||||
//Update Frame estimate when NULL is passed in as Update tick
|
||||
static uint64_t UpdateFrameEstimate;
|
||||
|
||||
//Private Constructor
|
||||
ZLog() { }
|
||||
|
||||
//Private Copy Constructor
|
||||
ZLog(const ZLog& _other) { URFP(_other); }
|
||||
|
||||
//Private Destructor
|
||||
~ZLog() { }
|
||||
|
||||
public:
|
||||
|
||||
/////////////////////////////////
|
||||
/* Initialization and Shutdown */
|
||||
/////////////////////////////////
|
||||
|
||||
/*
|
||||
static public ZFileSystem::Init
|
||||
|
||||
Initialization method for ZLog. Until this is called, all logging calls return immediately.
|
||||
|
||||
@param _logFileRoot - the directory to place log files in
|
||||
@param _defaultLogFile - log file name for the 'default' log file (NULL log file)
|
||||
@param _ticks - pointer to a value that will be updated with tick count (NULL to use parameter value only)
|
||||
@param _update - pointer to a value that will be updated with update frame count (NULL to use parameter value only)
|
||||
@return (void)
|
||||
*/
|
||||
static void Init(const ZString& _logFileRoot, const ZString& _defaultLogFile, uint64_t* _ticks = NULL, uint64_t* _update = NULL);
|
||||
|
||||
/*
|
||||
static public ZFileSystem::Shutdown
|
||||
|
||||
Shutdown method for ZLog. Closes out the opened log files and flushes the output buffers. After
|
||||
this is called, all logging operations return immediately.
|
||||
|
||||
@return (void)
|
||||
*/
|
||||
static void Shutdown();
|
||||
|
||||
///////////////////////////////
|
||||
/* Logging System Operations */
|
||||
///////////////////////////////
|
||||
|
||||
/*
|
||||
static public ZFileSystem::AddLoggingDelegate
|
||||
|
||||
Adds a logging delegate to the system which is called whenever logging takes
|
||||
place.
|
||||
|
||||
@param _delegate - the logging delegate to call when logging takes place
|
||||
@return (void)
|
||||
*/
|
||||
static void AddLoggingDelegate(ZPtr<ZLogDelegate> _delegate);
|
||||
|
||||
/*
|
||||
static public ZFileSystem::CreateLogFile
|
||||
|
||||
Creates a log file for use in the system.
|
||||
|
||||
@param _fileName - the name to use for the log file
|
||||
@return (ZLOG_FILE) - the created log file (will be NULL if could not create)
|
||||
*/
|
||||
static ZLogFile CreateLogFile(const ZString& _fileName);
|
||||
|
||||
/*
|
||||
public static ZLog::Resume
|
||||
|
||||
Resumes logging operations on a given log file.
|
||||
|
||||
@param _logFile - the file to suspend logging operations on
|
||||
@return (void)
|
||||
*/
|
||||
static void Resume(ZLogFile _logFile);
|
||||
|
||||
/*
|
||||
public static ZLog::SuspendLogging
|
||||
|
||||
Suspends logging operations on a given log file.
|
||||
|
||||
@param _logFile - the file to suspend logging operations on
|
||||
@return (void)
|
||||
*/
|
||||
static void Suspend(ZLogFile _logFile);
|
||||
|
||||
/////////////////////
|
||||
/* Logging Methods */
|
||||
/////////////////////
|
||||
|
||||
/*
|
||||
static public ZFileSystem::Printf
|
||||
|
||||
Varardic logging function, which writes the given string out to the log file. This version takes varargs in the
|
||||
same way as printf. This logging function has a limit on the length of the output string of 4096 characters - excess
|
||||
characters will be truncated.
|
||||
|
||||
@param _type - the logging type
|
||||
@param _file - the file to write to (if ZLOG_DEFAULT, uses the default file)
|
||||
@param _ticks - the tick count at which the log file is written
|
||||
@param _updateFrame - the update 'frame' during which the log is written
|
||||
@param _str - the string to write to the log file
|
||||
@param ... - the variable arguments to provide to format _str
|
||||
@param args - parsed va_list
|
||||
@return (void)
|
||||
*/
|
||||
static void Printf(ZLogType _type, ZLogFile _file, uint64_t _ticks, uint32_t _updateFrame, const char *_function, const char *_str, ...);
|
||||
|
||||
/*
|
||||
static public ZFileSystem::WriteLine
|
||||
|
||||
Writes a string out to the given log file.
|
||||
|
||||
@param _type - the logging type
|
||||
@param _file - the file to write to (if ZLOG_DEFAULT, uses the default file)
|
||||
@param _ticks - the tick count at which the log file is written
|
||||
@param _updateFrame - the update 'frame' during which the log is written
|
||||
@param _renderFrame - the render 'frame' during which the log is written
|
||||
@param _str - the string to write to the log file
|
||||
@return (void)
|
||||
*/
|
||||
static void WriteLine(ZLogType _type, ZLogFile _file, uint64_t _ticks, uint32_t _updateFrame, const char* _str);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
Reference in New Issue
Block a user