summaryrefslogtreecommitdiff
path: root/src/utils/logger.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils/logger.cpp')
-rw-r--r--src/utils/logger.cpp215
1 files changed, 215 insertions, 0 deletions
diff --git a/src/utils/logger.cpp b/src/utils/logger.cpp
new file mode 100644
index 00000000..5010ed66
--- /dev/null
+++ b/src/utils/logger.cpp
@@ -0,0 +1,215 @@
+/*
+ * The Mana World Server
+ * Copyright 2004 The Mana World Development Team
+ *
+ * This file is part of The Mana World.
+ *
+ * The Mana World is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or any later version.
+ *
+ * The Mana World 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 General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with The Mana World; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * $Id$
+ */
+
+
+#include <ctime>
+#include <iomanip>
+#include <iostream>
+
+#ifdef WIN32
+#include <windows.h>
+#endif
+
+#include "logger.h"
+
+
+namespace tmwserv
+{
+namespace utils
+{
+
+
+/**
+ * Default constructor.
+ */
+Logger::Logger(void)
+ throw()
+{
+ // NOOP
+}
+
+
+/**
+ * Destructor.
+ */
+Logger::~Logger(void)
+ throw()
+{
+ // the destructor of std::ofstream takes care of closing the file
+ // if it is still open :)
+}
+
+
+/**
+ * Set the log file.
+ */
+void
+Logger::setLogFile(const std::string& logFile)
+{
+ // close the current log file.
+ if (mLogFile.is_open()) {
+ mLogFile.close();
+ }
+
+ // open the file for output and remove the former file contents.
+ mLogFile.open(logFile.c_str(), std::ios::trunc);
+
+ if (!mLogFile.is_open()) {
+ std::string msg("unable to open ");
+ msg += logFile;
+ msg += " for writing.";
+
+ throw std::ios::failure(msg);
+ }
+ else {
+ // by default the streams do not throw any exception
+ // let std::ios::failbit and std::ios::badbit throw exceptions.
+ mLogFile.exceptions(std::ios::failbit | std::ios::badbit);
+ }
+}
+
+
+/**
+ * Add/remove the timestamp.
+ */
+void
+Logger::setTimestamp(bool flag)
+ throw()
+{
+ mHasTimestamp = flag;
+}
+
+
+/**
+ * Log a generic message.
+ */
+void
+Logger::log(const std::string& msg)
+{
+ log((mLogFile.is_open() ? mLogFile : std::cout), msg);
+}
+
+
+/**
+ * Log a debug message.
+ */
+void
+Logger::debug(const std::string& msg)
+{
+ log((mLogFile.is_open() ? mLogFile : std::cout), msg, "[DBG]");
+}
+
+
+/**
+ * Log an info message.
+ */
+void
+Logger::info(const std::string& msg)
+{
+ log((mLogFile.is_open() ? mLogFile : std::cout), msg, "[INF]");
+}
+
+
+/**
+ * Log a warn message.
+ */
+void
+Logger::warn(const std::string& msg)
+{
+ log((mLogFile.is_open() ? mLogFile : std::cerr), msg, "[WRN]");
+}
+
+
+/**
+ * Log an error message.
+ */
+void
+Logger::error(const std::string& msg)
+{
+ log((mLogFile.is_open() ? mLogFile : std::cerr), msg, "[ERR]");
+}
+
+
+/**
+ * Log a fatal error message.
+ */
+void
+Logger::fatal(const std::string& msg)
+{
+ log((mLogFile.is_open() ? mLogFile : std::cerr), msg, "[FTL]");
+
+#ifdef WIN32
+ MessageBox(NULL, msg.c_str(), "Fatal error", MB_ICONERROR | MB_OK);
+#endif
+}
+
+
+/**
+ * Log a generic message.
+ */
+void
+Logger::log(std::ostream& os,
+ const std::string& msg,
+ const std::string& prefix)
+{
+ if (mHasTimestamp) {
+ os << getCurrentTime() << " ";
+ }
+
+ if (prefix != "") {
+ os << prefix << " ";
+ }
+
+ os << msg << std::endl;
+}
+
+
+/**
+ * Get the current time.
+ */
+std::string
+Logger::getCurrentTime(void)
+{
+ time_t now;
+ tm local;
+
+ // get current time_t value
+ time(&now);
+
+ // convert time_t to tm struct to break the time into individual
+ // constituents
+ local = *(localtime(&now));
+
+ // stringify the time, the format is: [hh:mm:ss]
+ using namespace std;
+ ostringstream os;
+ os << "[" << setw(2) << setfill('0') << local.tm_hour
+ << ":" << setw(2) << setfill('0') << local.tm_min
+ << ":" << setw(2) << setfill('0') << local.tm_sec
+ << "]";
+
+ return os.str();
+}
+
+
+} // namespace utils
+} // namespace tmwserv