+#include "porting.h"
+#include "settings.h"
+#include "config.h"
+#include "exceptions.h"
+#include "util/numeric.h"
+#include "log.h"
+
+#include <sstream>
+#include <iostream>
+#include <algorithm>
+#include <cerrno>
+#include <cstring>
+
+class LevelTarget : public LogTarget {
+public:
+ LevelTarget(Logger &logger, LogLevel level, bool raw = false) :
+ m_logger(logger),
+ m_level(level),
+ m_raw(raw)
+ {}
+
+ virtual bool hasOutput() override {
+ return m_logger.hasOutput(m_level);
+ }
+
+ virtual void log(const std::string &buf) override {
+ if (!m_raw) {
+ m_logger.log(m_level, buf);
+ } else {
+ m_logger.logRaw(m_level, buf);
+ }
+ }
+
+private:
+ Logger &m_logger;
+ LogLevel m_level;
+ bool m_raw;
+};
+
+////
+//// Globals
+////
+
+Logger g_logger;
+
+#ifdef __ANDROID__
+AndroidLogOutput stdout_output;
+AndroidLogOutput stderr_output;
+#else
+StreamLogOutput stdout_output(std::cout);
+StreamLogOutput stderr_output(std::cerr);
+#endif
+
+LevelTarget none_target_raw(g_logger, LL_NONE, true);
+LevelTarget none_target(g_logger, LL_NONE);
+LevelTarget error_target(g_logger, LL_ERROR);
+LevelTarget warning_target(g_logger, LL_WARNING);
+LevelTarget action_target(g_logger, LL_ACTION);
+LevelTarget info_target(g_logger, LL_INFO);
+LevelTarget verbose_target(g_logger, LL_VERBOSE);
+LevelTarget trace_target(g_logger, LL_TRACE);
+
+thread_local LogStream dstream(none_target);
+thread_local LogStream rawstream(none_target_raw);
+thread_local LogStream errorstream(error_target);
+thread_local LogStream warningstream(warning_target);
+thread_local LogStream actionstream(action_target);
+thread_local LogStream infostream(info_target);
+thread_local LogStream verbosestream(verbose_target);
+thread_local LogStream tracestream(trace_target);
+thread_local LogStream derr_con(verbose_target);
+thread_local LogStream dout_con(trace_target);