let's Logger::Stream working again. :-)

JSON-90
Lars Rohwedder 2018-06-21 12:31:00 +02:00
parent 49225e318c
commit 67fb168d2e
3 changed files with 94 additions and 72 deletions

View File

@ -6,6 +6,7 @@
#include <cstdlib>
#include <mutex>
#include <thread>
#include <sstream>
#include <sys/time.h>
#ifdef LOGGER_ENABLE_SYSLOG
@ -14,10 +15,6 @@ extern "C" {
}
#endif // LOGGER_ENABLE_SYSLOG
#ifdef DEBUG_ENABLED
#include <sstream>
#endif // DEBUG_ENABLED
using Lock = std::lock_guard<std::recursive_mutex>;
@ -39,11 +36,11 @@ namespace LoggerS // namespace containing all data for the Logger singleton. HA
void openfile();
void opensyslog();
void start(const std::string& program_name)
void start(const std::string& program_name, const std::string& filename = std::string())
{
ident = program_name;
// TODO: use $TEMP, $TMP etc.
filename = "/tmp/log-" + program_name + ".log";
LoggerS::filename = filename.empty() ? "/tmp/log-" + program_name + ".log" : filename;
opensyslog();
openfile();
initialized = true;
@ -92,14 +89,16 @@ namespace LoggerS // namespace containing all data for the Logger singleton. HA
} // end of namespace LoggerS
void Logger::start(const std::string& program_name)
void Logger::start(const std::string& program_name, const std::string& filename)
{
if(LoggerS::initialized==false)
{
LoggerS::start(program_name);
LoggerS::start(program_name, filename);
}
::getLogger().debug("Logger has been started.");
}
std::string Logger::gmtime(time_t t)
{
char buf[24]; // long enough to hold YYYYY-MM-DD.hh:mm:ss" (y10k-safe!)
@ -143,22 +142,34 @@ const std::string& Logger::getPrefix() const
}
Logger::Target Logger::getTarget()
Logger::Target Logger::getDefaultTarget()
{
return LoggerS::target;
}
void Logger::setTarget(Target t)
void Logger::setDefaultTarget(Target t)
{
LoggerS::target = t;
}
Logger::Severity Logger::getDefaultLevel()
{
return LoggerS::loglevel;
}
void Logger::setDefaultLevel(Severity s)
{
LoggerS::loglevel = s;
}
Logger::Logger(const std::string& my_prefix, Severity my_loglevel)
: prefix(my_prefix + ":")
{
setLevel(my_loglevel);
setLevel(my_loglevel == Severity::Inherited ? getDefaultLevel() : my_loglevel);
start(my_prefix); // if not yet initialized.
}
@ -322,53 +333,58 @@ void LoggerS::log(Logger::Severity s, const std::string& logline)
}
#ifdef DEBUG_ENABLED
Logger::Stream::Stream(Logger* l) : L(l) , parent(0)
Logger::Stream::Stream(Logger* parent, Severity _sev)
: L(parent), sev(_sev)
{}
Logger::Stream::Stream(Stream& S, const std::string& str)
: L(0) , parent(&S), s(str)
{}
Logger::Stream::~Stream()
{
if(parent)
{
parent->s.append(s);
}
if(L)
{
L->debugInternal(s);
L->log(sev, s);
}
}
template<class T>
Logger::Stream operator<<(Logger::Stream s, const T& t)
const Logger::Stream& operator<<(const Logger::Stream& stream, const T& t)
{
std::stringstream ss;
ss << t;
return Logger::Stream(s, ss.str());
stream.s.append( ss.str());
return stream;
}
Logger::Stream operator<<(Logger::Stream s, const char*const t)
const Logger::Stream& operator<<(const Logger::Stream& stream, const char*const t)
{
return Logger::Stream(s, t);
stream.s.append( t );
return stream;
}
template Logger::Stream operator<<(Logger::Stream, const int&);
template Logger::Stream operator<<(Logger::Stream, const unsigned&);
template Logger::Stream operator<<(Logger::Stream, const std::string&);
template Logger::Stream operator<<(Logger::Stream, const double&);
Logger::operator Logger::Stream()
template<>
const Logger::Stream& operator<<(const Logger::Stream& stream, const bool& b)
{
return Stream(this);
stream.s.append( b ? "true" : "false");
return stream;
}
#endif // DEBUG_ENABLED
template const Logger::Stream& operator<<(const Logger::Stream&, const int&);
template const Logger::Stream& operator<<(const Logger::Stream&, const long&);
template const Logger::Stream& operator<<(const Logger::Stream&, const unsigned&);
template const Logger::Stream& operator<<(const Logger::Stream&, const unsigned long&);
template const Logger::Stream& operator<<(const Logger::Stream&, const std::string&);
template const Logger::Stream& operator<<(const Logger::Stream&, const double&);
template const Logger::Stream& operator<<(const Logger::Stream&, const void*const&);
template const Logger::Stream& operator<<(const Logger::Stream&, void*const&);
template const Logger::Stream& operator<<(const Logger::Stream&, const std::thread::id&);
Logger::Stream&& operator<<(Logger& parent, Logger::Severity sev)
{
return std::move(Logger::Stream(&parent, sev));
}
// End of file

View File

@ -49,11 +49,12 @@ public:
enum Target
{
None = 0,
Console=1, Syslog=2, File=4 // may be ORed together
};
// shall be called before first log message.
static void start(const std::string& program_name);
static void start(const std::string& program_name, const std::string& filename = "");
// returns a string in YYYY-MM-DD.hh:mm:ss format of the given time_t t
static std::string gmtime(time_t t);
@ -103,58 +104,62 @@ public:
void setLevel(Severity s);
Severity getLevel() const;
static void setTarget(Target t);
static Target getTarget();
static void setDefaultLevel(Severity s);
static Severity getDefaultLevel();
static void setDefaultTarget(Target t);
static Target getDefaultTarget();
const std::string& getPrefix() const;
explicit Logger(const std::string& my_prefix, Severity my_severity);
// if no explicit severity is given it is taken from default's severity
explicit Logger(const std::string& my_prefix, Severity my_severity = Severity::Inherited);
explicit Logger(Logger& parent, const std::string& my_prefix, Severity my_severity = Severity::Inherited);
// non-copyable:
Logger(const Logger&) = delete;
void operator=(const Logger&) = delete;
#ifdef DEBUG_ENABLED
class Stream
{
Stream(Logger*);
Stream(Stream& parent, const std::string& msg);
Logger* L;
Stream* parent;
std::string s;
public:
Stream(Logger* _L, Logger::Severity _sev);
~Stream();
friend class Logger;
template<class T>
friend Logger::Stream operator<<(Logger::Stream, const T&);
friend Logger::Stream operator<<(Logger::Stream, const char*const);
Stream(const Stream&) = delete;
void operator=(const Stream&) = delete;
mutable std::string s;
private:
Logger* L;
const Logger::Severity sev;
};
operator Stream();
#else
template<class T>
Logger& operator<<(const T&) { return *this; }
#endif
;
private:
friend Logger& getLogger();
const std::string prefix;
Severity loglevel;
};
// creates a Stream, who collect data in pieces and logs it to the "parent" logger in its destructor with the given severity
Logger::Stream&& operator<<(Logger& parent, Logger::Severity sev);
#ifdef DEBUG_ENABLED
template<class T>
Logger::Stream operator<<(Logger::Stream, const T&);
Logger::Stream operator<<(Logger::Stream, const char*const);
#endif
const Logger::Stream& operator<<(const Logger::Stream&, const T&);
const Logger::Stream& operator<<(const Logger::Stream&, const char*const);
inline
const Logger::Stream& operator<<(const Logger::Stream& stream, char*const s)
{
return stream << const_cast<const char*>(s);
}
// clean up defines which may collide with other headers...
#undef PRINTF
#undef PRINTF3
#endif // LOGGER_HH

View File

@ -3,6 +3,7 @@
#include "prefix-config.hh"
#include "json-adapter.hh"
#include "daemonize.hh"
#include "logger.hh"
#include "nulllogger.hh"
#include <thread>
@ -61,7 +62,7 @@ try
("add-sharks", po::bool_switch(&add_sharks), "Add sharks to the JSON Adapter.")
#ifdef _WIN32
((STATUS_HANDLE), po::value<uintptr_t>(&status_handle)->default_value(0), "Status file handle, for internal use.")
#endif
#endif
;
po::variables_map vm;
@ -88,14 +89,14 @@ try
if(logfile.empty())
{
my_logfile = &nulllogger;
Logger::setDefaultTarget(Logger::Target::None);
}else if(logfile == "stderr")
{
my_logfile = &std::cerr;
Logger::setDefaultTarget(Logger::Target::Console);
}else{
real_logfile = std::make_shared<std::ofstream>( logfile, std::ios::app );
my_logfile = real_logfile.get();
Logger::setDefaultTarget(Logger::Target::File);
}
Logger::start("JsonAdapter", logfile);
if(add_sharks)
{
@ -104,8 +105,8 @@ try
if( debug_mode == false )
daemonize (!debug_mode, (const uintptr_t) status_handle);
JsonAdapter ja( my_logfile );
JsonAdapter ja;
ja.do_sync( do_sync)
.ignore_session_errors( ignore_missing_session)
;
@ -136,7 +137,7 @@ try
}while(ja.running());
}
ja.shutdown(nullptr);
ja.Log() << "Good bye. :-)" << std::endl;
ja.Log() << "Good bye. :-)";
JsonAdapter::global_shutdown();
}
catch (...)