let's Logger::Stream working again. :-)
parent
49225e318c
commit
67fb168d2e
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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 (...)
|
||||
|
|
Loading…
Reference in New Issue