Log.cc 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. // Copyright: All Rights Reserved
  2. // Author: egametang@gmail.com (tanghai)
  3. #include <fstream>
  4. #include <iostream>
  5. #include <memory>
  6. #include <boost/date_time/posix_time/posix_time_types.hpp>
  7. #include <boost/log/common.hpp>
  8. #include <boost/log/filters.hpp>
  9. #include <boost/log/formatters.hpp>
  10. #include <boost/log/attributes.hpp>
  11. #include <boost/log/sinks/text_multifile_backend.hpp>
  12. #include <boost/log/attributes/current_thread_id.hpp>
  13. #include <boost/date_time/posix_time/posix_time_types.hpp>
  14. #include <boost/log/sinks/sync_frontend.hpp>
  15. #include <boost/log/sinks/text_ostream_backend.hpp>
  16. #include <gflags/gflags.h>
  17. #include "Log/Log.h"
  18. DEFINE_bool(logtoconsole, false, "log messages go to stderr instead of logfiles");
  19. using namespace boost::log;
  20. namespace Egametang {
  21. std::string FileName(const char* s)
  22. {
  23. boost::filesystem::path path(s);
  24. return path.filename().string();
  25. }
  26. bool ELog::isInit = false;
  27. sources::severity_logger<SeverityLevel> ELog::slog;
  28. void ELog::Init(const char* fileName)
  29. {
  30. if (isInit)
  31. {
  32. return;
  33. }
  34. isInit = true;
  35. auto core = core::get();
  36. typedef sinks::synchronous_sink<sinks::text_ostream_backend> text_sink;
  37. auto pSink = std::make_shared<text_sink>();
  38. std::string logFileName = FileName(fileName) + ".log";
  39. auto logStream = std::make_shared<std::ofstream>(logFileName.c_str());
  40. if (!logStream->good())
  41. {
  42. throw std::runtime_error("Failed to open a log file");
  43. }
  44. pSink->locked_backend()->add_stream(logStream);
  45. // 是否输出到标准错误
  46. if (FLAGS_logtoconsole)
  47. {
  48. pSink->locked_backend()->add_stream(
  49. std::shared_ptr<std::ostream>(&std::clog, boost::log::empty_deleter()));
  50. }
  51. pSink->locked_backend()->set_formatter(
  52. formatters::format("[%1%][%2%][%3%]%4%")
  53. % formatters::attr<unsigned int>("Line #", keywords::format = "%08x")
  54. % formatters::date_time<boost::posix_time::ptime>("TimeStamp")
  55. % formatters::attr<boost::thread::id>("ThreadID", keywords::format = "%05d")
  56. % formatters::message()
  57. );
  58. pSink->set_filter(boost::log::filters::attr<SeverityLevel>("Severity", std::nothrow) >= INFO);
  59. core->add_global_attribute("Line #", std::make_shared<attributes::counter<unsigned int>>());
  60. core->add_global_attribute("TimeStamp", std::make_shared<attributes::local_clock>());
  61. core->add_global_attribute("ThreadID", std::make_shared<attributes::current_thread_id>());
  62. core->add_sink(pSink);
  63. }
  64. boost::log::sources::severity_logger<SeverityLevel>& ELog::GetSLog()
  65. {
  66. return slog;
  67. }
  68. } // Egametang