Log.cc 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. // Copyright: All Rights Reserved
  2. // Author: egametang@gmail.com (tanghai)
  3. #include <fstream>
  4. #include <iostream>
  5. #include <string>
  6. #include <boost/make_shared.hpp>
  7. #include <boost/scoped_ptr.hpp>
  8. #include <boost/date_time/posix_time/posix_time.hpp>
  9. #include <boost/log/common.hpp>
  10. #include <boost/log/expressions.hpp>
  11. #include <boost/log/attributes.hpp>
  12. #include <boost/log/sinks.hpp>
  13. #include <boost/log/sources/logger.hpp>
  14. #include <boost/log/utility/empty_deleter.hpp>
  15. #include <boost/log/utility/manipulators/add_value.hpp>
  16. #include <boost/log/attributes/scoped_attribute.hpp>
  17. #include <boost/log/support/date_time.hpp>
  18. #include "Log/Log.h"
  19. #include "Base/Exception.h"
  20. using namespace boost::log;
  21. namespace Egametang {
  22. std::string FileName(std::string s)
  23. {
  24. boost::filesystem::path path(s);
  25. return path.filename().string();
  26. }
  27. boost::scoped_ptr< boost::log::sources::severity_logger<SeverityLevel> > Log::slog;
  28. void Log::Init(std::string fileName)
  29. {
  30. slog.reset(new boost::log::sources::severity_logger<SeverityLevel>());
  31. auto core = core::get();
  32. typedef sinks::synchronous_sink<sinks::text_ostream_backend> text_sink;
  33. auto pSink = boost::make_shared<text_sink>();
  34. std::string logFileName = FileName(fileName) + ".log";
  35. auto logStream = boost::make_shared<std::ofstream>(logFileName.c_str());
  36. if (!logStream->good())
  37. {
  38. throw std::runtime_error("Failed to open a log file");
  39. }
  40. pSink->locked_backend()->add_stream(logStream);
  41. pSink->locked_backend()->add_stream(
  42. boost::shared_ptr<std::ostream>(&std::clog, boost::log::empty_deleter()));
  43. pSink->set_formatter(
  44. expressions::format("[%1%][%2%][%3%]%4%")
  45. % expressions::attr< unsigned int >("RecordID")
  46. % expressions::format_date_time< boost::posix_time::ptime >("TimeStamp", "%Y-%m-%d %H:%M:%S.%f")
  47. % expressions::attr<attributes::current_thread_id::value_type>("ThreadID")
  48. % expressions::smessage
  49. );
  50. core->add_global_attribute("RecordID", attributes::counter<unsigned int>(1));
  51. core->add_global_attribute("TimeStamp", attributes::local_clock());
  52. core->add_global_attribute("ThreadID", attributes::current_thread_id());
  53. core->add_sink(pSink);
  54. }
  55. boost::log::sources::severity_logger<SeverityLevel>& Log::GetSLog()
  56. {
  57. if (!slog.get())
  58. {
  59. throw Exception() << ErrInfo("use log please Init in main function");
  60. }
  61. return *slog;
  62. }
  63. } // Egametang