X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Ffilelogger.cpp;h=b99b9e5bbd05dabc9689aaa3b67ec0d6bea1d2bf;hb=091e6e8bd9686f680fa72ab0844c7a2473233215;hp=8bd28dde8f925191531f0ea0374da75a07affedb;hpb=d0d36795e807cf72295c6e73813e0c2daa0a71e7;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/filelogger.cpp b/src/filelogger.cpp index 8bd28dde8..b99b9e5bb 100644 --- a/src/filelogger.cpp +++ b/src/filelogger.cpp @@ -2,8 +2,8 @@ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * - * InspIRCd: (C) 2002-2007 InspIRCd Development Team - * See: http://www.inspircd.org/wiki/index.php/Credits + * InspIRCd: (C) 2002-2009 InspIRCd Development Team + * See: http://wiki.inspircd.org/Credits * * This program is free but copyrighted software; see * the file COPYING for details. @@ -11,92 +11,51 @@ * --------------------------------------------------- */ +/* $Core */ + #include "inspircd.h" -#include #include #include "socketengine.h" #include "inspircd_se_config.h" #include "filelogger.h" -FileLogger::FileLogger(InspIRCd* Instance, FILE* logfile) -: ServerInstance(Instance), log(logfile), writeops(0) +FileLogStream::FileLogStream(InspIRCd *Instance, int loglevel, FileWriter *fw) + : LogStream(Instance, loglevel), f(fw) { - if (log) - { - Instance->SE->NonBlocking(fileno(log)); - SetFd(fileno(log)); - buffer.clear(); - } + ServerInstance->Logs->AddLoggerRef(f); } -bool FileLogger::Readable() +FileLogStream::~FileLogStream() { - return false; -} - -void FileLogger::HandleEvent(EventType et, int errornum) -{ - WriteLogLine(""); - if (log) - ServerInstance->SE->DelFd(this); + /* FileWriter is managed externally now */ + ServerInstance->Logs->DelLoggerRef(f); } -void FileLogger::WriteLogLine(const std::string &line) +void FileLogStream::OnLog(int loglevel, const std::string &type, const std::string &text) { - if (line.length()) - buffer.append(line); + static char TIMESTR[26]; + static time_t LAST = 0; + + /* sanity check, just in case */ + if (!ServerInstance->Config) + return; - if (log) + /* If we were given -debug we output all messages, regardless of configured loglevel */ + if ((loglevel < this->loglvl) && !ServerInstance->Config->forcedebug) { - int written = fprintf(log,"%s",buffer.c_str()); -#ifdef WINDOWS - buffer.clear(); -#else - if ((written >= 0) && (written < (int)buffer.length())) - { - buffer.erase(0, buffer.length()); - ServerInstance->SE->AddFd(this); - } - else if (written == -1) - { - if (errno == EAGAIN) - ServerInstance->SE->AddFd(this); - } - else - { - /* Wrote the whole buffer, and no need for write callback */ - buffer.clear(); - } -#endif - if (writeops++ % 20) - { - fflush(log); - } + return; } -} -void FileLogger::Close() -{ - if (log) + if (ServerInstance->Time() != LAST) { - ServerInstance->SE->Blocking(fileno(log)); - - if (buffer.size()) - fprintf(log,"%s",buffer.c_str()); + time_t local = ServerInstance->Time(); + struct tm *timeinfo = localtime(&local); -#ifndef WINDOWS - ServerInstance->SE->DelFd(this); -#endif - - fflush(log); - fclose(log); + strlcpy(TIMESTR,asctime(timeinfo),26); + TIMESTR[24] = ':'; + LAST = ServerInstance->Time(); } - buffer.clear(); + std::string out = std::string(TIMESTR) + " " + text.c_str() + "\n"; + this->f->WriteLogLine(out); } - -FileLogger::~FileLogger() -{ - this->Close(); -} -