Index: /trunk/nv/logger.hh
===================================================================
--- /trunk/nv/logger.hh	(revision 47)
+++ /trunk/nv/logger.hh	(revision 48)
@@ -37,4 +37,8 @@
 		virtual void log( log_level level, const std::string& message ) = 0;
 		/**
+         * Optional timestamp string
+		 */
+		const char* timestamp() const;
+		/**
 		 * Enforcement of virtual destructor.
 		 */
@@ -122,7 +126,15 @@
 	public:
 		/**
+		 * Log sink constructor
+		 */
+		log_console_sink( bool coloring = true );
+		/**
 		 * Logging function.
 		 */
 		virtual void log( log_level level, const std::string& message );
+
+	private:
+		void* m_handle;
+		bool  m_color;
 	};
 
Index: /trunk/src/logger.cc
===================================================================
--- /trunk/src/logger.cc	(revision 47)
+++ /trunk/src/logger.cc	(revision 48)
@@ -9,5 +9,11 @@
 #include <algorithm>
 #include <fstream>
+#include <ctime>
+#include <cstdio>
 #include <nv/exception.hh>
+#if NV_PLATFORM == NV_WINDOWS
+#define WIN32_LEAN_AND_MEAN
+#include <Windows.h>
+#endif
 
 using namespace nv;
@@ -29,6 +35,55 @@
 };
 
+// log level names
+const char *log_level_names_pad[] =
+{
+	"NONE    ",
+	"FATAL   ",
+	"CRITICAL",
+	"ERROR   ",
+	"WARNING ",
+	"NOTICE  ",
+	"INFO    ",
+	"INFO    ",
+	"DEBUG   ",
+	"DEBUG2  ",
+	"TRACE   "
+};
+
 // helper macro to access log_level_names
 #define NV_LOG_LEVEL_NAME(level) (log_level_names[ (level) / 10 ])
+#define NV_LOG_LEVEL_NAME_PAD(level) (log_level_names_pad[ (level) / 10 ])
+
+#if NV_PLATFORM == NV_WINDOWS 
+unsigned short log_color[] =
+{
+	FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY,
+	FOREGROUND_RED | FOREGROUND_INTENSITY,
+	FOREGROUND_RED | FOREGROUND_INTENSITY,
+	FOREGROUND_RED,
+	FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY,
+	FOREGROUND_GREEN | FOREGROUND_INTENSITY,
+	FOREGROUND_GREEN,
+	FOREGROUND_GREEN,
+	FOREGROUND_INTENSITY,
+	FOREGROUND_INTENSITY,
+	FOREGROUND_INTENSITY
+};
+#else
+const char *log_color[] =
+{
+	"\33[37;1m",
+	"\33[31;1m",
+	"\33[31;1m",
+	"\33[31m",
+	"\33[33;1m",
+	"\33[32;1m",
+	"\33[32m",
+	"\33[32m",
+	"\33[30;1m",
+	"\33[30;1m",
+	"\33[30;1m"
+};
+#endif
 
 // log function
@@ -105,5 +160,23 @@
 void log_console_sink::log( log_level level, const std::string& message )
 {
-	std::cout << "[" << NV_LOG_LEVEL_NAME(level) << "] " << message << std::endl;
+	if (m_color) 
+	{
+#if NV_PLATFORM == NV_WINDOWS 
+		SetConsoleTextAttribute( m_handle, FOREGROUND_INTENSITY );
+		std::cout << timestamp() << " [";
+		SetConsoleTextAttribute( m_handle, log_color[ (level) / 10 ] );
+		std::cout << NV_LOG_LEVEL_NAME_PAD(level);
+		SetConsoleTextAttribute( m_handle, FOREGROUND_INTENSITY );
+		std::cout << "] ";
+		SetConsoleTextAttribute( m_handle, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE );
+		std::cout << message << std::endl;
+#else
+		std::cout << "\33[30;1m" << timestamp() << " [" << log_color[ (level) / 10 ] << NV_LOG_LEVEL_NAME_PAD(level) << "\33[30;1m] \33[37;1m" << message << std::endl;
+#endif
+	}
+	else
+	{
+	std::cout << timestamp() << " [" << NV_LOG_LEVEL_NAME_PAD(level) << "] " << message << std::endl;
+	}
 }
 
@@ -115,10 +188,10 @@
 	{
 		// write and flush using std::endl
-		*m_stream << "[" << NV_LOG_LEVEL_NAME(level) << "] " << message << std::endl;
+		*m_stream << timestamp() << " [" << NV_LOG_LEVEL_NAME(level) << "] " << message << std::endl;
 	}
 	else
 	{
 		// write and end with "\n" (no flush)
-		*m_stream << "[" << NV_LOG_LEVEL_NAME(level) << "] " << message << "\n";
+		*m_stream << timestamp() << " [" << NV_LOG_LEVEL_NAME(level) << "] " << message << "\n";
 	}
 }
@@ -149,2 +222,28 @@
 	delete m_stream;
 }
+
+nv::log_console_sink::log_console_sink( bool coloring )
+	: m_color( coloring )
+{
+#if NV_PLATFORM == NV_WINDOWS 
+	m_handle = GetStdHandle( STD_OUTPUT_HANDLE );
+#endif
+}
+
+const char* nv::log_sink::timestamp() const
+{
+	std::clock_t time = std::clock();
+	unsigned int secs = (unsigned int)(time / CLOCKS_PER_SEC);
+	unsigned int mm   = (unsigned int)(time*100 / CLOCKS_PER_SEC) % 100;
+	unsigned int h    = (unsigned int)(secs / (60*60));
+	unsigned int m    = (unsigned int)(secs / 60) % 60;
+	unsigned int s    = secs % 60;
+	static char buffer[128];
+#if NV_PLATFORM == NV_WINDOWS 
+	sprintf_s( buffer, 128, "%02d:%02d:%02d.%02d", h, m, s, mm );
+#else
+	sprintf( buffer, "%02d:%02d:%02d.%02d", h, m, s, mm );
+#endif
+	buffer[11] = '\0';
+	return buffer;
+}
