RESTinio
ostream_logger.hpp
Go to the documentation of this file.
1 /*
2  restinio
3 */
4 
5 /*!
6  Ready to use logger implementation for using with std::ostream.
7 */
8 
9 #pragma once
10 
11 #include <restinio/null_mutex.hpp>
12 
13 #include <restinio/impl/include_fmtlib.hpp>
14 
15 #include <string>
16 #include <iostream>
17 #include <chrono>
18 #include <mutex>
19 
20 namespace restinio
21 {
22 
23 //
24 // ostream_logger_t
25 //
26 
27 //! Logger for std::ostream.
28 /*!
29  \note It is not efficient.
30 */
31 template < typename Lock >
33 {
34  public:
35  ostream_logger_t( const ostream_logger_t & ) = delete;
36  ostream_logger_t & operator = ( const ostream_logger_t & ) = delete;
37 
38  ostream_logger_t() noexcept
39  : m_out{ &std::cout }
40  {}
41 
42  ostream_logger_t( std::ostream & out ) noexcept
43  : m_out{ &out }
44  {}
45 
46  template< typename Message_Builder >
47  void
48  trace( Message_Builder && msg_builder )
49  {
50  log_message( "TRACE", msg_builder() );
51  }
52 
53  template< typename Message_Builder >
54  void
55  info( Message_Builder && msg_builder )
56  {
57  log_message( " INFO", msg_builder() );
58  }
59 
60  template< typename Message_Builder >
61  void
62  warn( Message_Builder && msg_builder )
63  {
64  log_message( " WARN", msg_builder() );
65  }
66 
67  template< typename Message_Builder >
68  void
69  error( Message_Builder && msg_builder )
70  {
71  log_message( "ERROR", msg_builder() );
72  }
73 
74  private:
75  void
76  log_message( const char * tag, const std::string & msg )
77  {
78  std::lock_guard< Lock > lock{ m_lock };
79 
80  namespace stdchrono = std::chrono;
81 
82  auto now = stdchrono::system_clock::now();
83  auto ms = stdchrono::duration_cast<
86  stdchrono::seconds >( ms ).count();
87 
88  ( *m_out )
89  << fmt::format(
90  "[{:%Y-%m-%d %H:%M:%S}.{:03d}] {}: {}",
92  static_cast< int >( ms.count() % 1000u ),
93  tag,
94  msg )
95  << std::endl;
96  }
97 
98  Lock m_lock;
100 };
101 
104 
105 } /* namespace restinio */
Logger for std::ostream.
void trace(Message_Builder &&msg_builder)
ostream_logger_t(std::ostream &out) noexcept
void log_message(const char *tag, const std::string &msg)
ostream_logger_t & operator=(const ostream_logger_t &)=delete
ostream_logger_t(const ostream_logger_t &)=delete
void error(Message_Builder &&msg_builder)
void info(Message_Builder &&msg_builder)
void warn(Message_Builder &&msg_builder)
std::enable_if< std::is_same< Parameter_Container, query_string_params_t >::value||std::is_same< Parameter_Container, router::route_params_t >::value, optional_t< Value_Type > >::type opt_value(const Parameter_Container &params, string_view_t key)
Gets the value of a parameter specified by key wrapped in optional_t<Value_Type> if parameter exists ...
Definition: value_or.hpp:64