/* * The Mana Server * Copyright (C) 2004 The Mana World Development Team * * This file is part of The Mana Server. * * The Mana Server 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 Server 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 Server. If not, see . */ #include "logger.h" #include #include #include #include #ifdef WIN32 #include #endif namespace utils { static std::ofstream mLogFile; /**< Log file. */ bool Logger::mHasTimestamp = true; /**< Timestamp flag. */ bool Logger::mTeeMode = false; /**< Tee mode flag. */ Logger::Level Logger::mVerbosity = Logger::Info; /**< Verbosity level. */ /** * Gets the current time. * * @return the current time as string. */ static std::string getCurrentTime() { 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(); } void Logger::output(std::ostream &os, const std::string &msg, const char *prefix) { if (mHasTimestamp) { os << getCurrentTime() << ' '; } if (prefix) { os << prefix << ' '; } os << msg << std::endl; } 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()) { throw std::ios::failure("unable to open " + logFile + "for writing"); } 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); } } void Logger::output(const std::string &msg, Level atVerbosity) { static const char *prefixes[] = { "[FTL]", "[ERR]", "[WRN]", "[INF]", "[DBG]" }; if (mVerbosity >= atVerbosity) { bool open = mLogFile.is_open(); if (open) { output(mLogFile, msg, prefixes[atVerbosity]); } if (!open || mTeeMode) { output(atVerbosity <= Warn ? std::cerr : std::cout, msg, prefixes[atVerbosity]); } } } } // namespace utils