Log.cc 2.5 KB

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