Hazelcast C++ Client
Hazelcast C++ Client Library
All Classes Functions Variables Enumerations Enumerator Pages
logger.cpp
1 #include <iomanip>
2 #include <iostream>
3 #include <mutex>
4 #include <sstream>
5 #include <chrono>
6 #include <ctime>
7 #include <thread>
8 
9 #include "hazelcast/logger.h"
10 #include "hazelcast/client/hazelcast_client.h"
11 
12 namespace hazelcast {
13 
14 std::ostream& operator<<(std::ostream &os, logger::level lvl) {
15  switch (lvl) {
16  case logger::level::severe:
17  os << "SEVERE";
18  break;
19  case logger::level::warning:
20  os << "WARNING";
21  break;
22  case logger::level::info:
23  os << "INFO";
24  break;
25  case logger::level::fine:
26  os << "FINE";
27  break;
28  case logger::level::finer:
29  os << "FINER";
30  break;
31  case logger::level::finest:
32  os << "FINEST";
33  break;
34  default:
35  os << static_cast<int>(lvl);
36  break;
37  }
38  return os;
39 }
40 
41 logger::logger(std::string instance_name, std::string cluster_name, level level, handler_type handler)
42  : instance_name_{ std::move(instance_name) }
43  , cluster_name_{ std::move(cluster_name) }
44  , level_{ level }
45  , handler_{ std::move(handler) }
46 {}
47 
48 bool logger::enabled(level lvl) noexcept {
49  return lvl >= level_;
50 }
51 
52 void logger::log(level lvl, const std::string &msg) noexcept {
53  handler_(instance_name_, cluster_name_, lvl, msg);
54 }
55 
56 namespace {
57 
58 std::tm time_t_to_localtime(const std::time_t &t) {
59  std::tm lt;
60 
61 #if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64)
62  ::localtime_s(&lt, &t);
63 #else
64  ::localtime_r(&t, &lt);
65 #endif
66 
67  return lt;
68 }
69 
70 }
71 
72 void logger::default_handler(const std::string &instance_name,
73  const std::string &cluster_name,
74  level lvl,
75  const std::string &msg) noexcept {
76 
77  auto tp = std::chrono::system_clock::now();
78  auto t = std::chrono::system_clock::to_time_t(tp);
79  auto local_t = time_t_to_localtime(t);
80 
81  auto dur = tp.time_since_epoch();
82  auto sec = std::chrono::duration_cast<std::chrono::seconds>(dur);
83 
84  auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(dur - sec).count();
85 
86  std::ostringstream sstrm;
87 
88  char time_buffer[80];
89  std::strftime(time_buffer, sizeof(time_buffer), "%d/%m/%Y %H:%M:%S.", &local_t);
90  sstrm << time_buffer
91  << std::setfill('0') << std::setw(3) << ms << ' '
92  << lvl << ": [" << std::this_thread::get_id() << "] "
93  << instance_name << '[' << cluster_name << "] ["
94  << client::version() << "] "
95  << msg
96  << '\n';
97 
98  {
99  static std::mutex cout_lock;
100  std::lock_guard<std::mutex> g(cout_lock);
101  std::cout << sstrm.str() << std::flush;
102  }
103 }
104 
105 
106 } // namespace hazelcast