websocketpp  0.3.0
C++/Boost Asio based websocket client/server library
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Pages
basic.hpp
1 /*
2  * Copyright (c) 2013, Peter Thorson. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  * * Redistributions of source code must retain the above copyright
7  * notice, this list of conditions and the following disclaimer.
8  * * Redistributions in binary form must reproduce the above copyright
9  * notice, this list of conditions and the following disclaimer in the
10  * documentation and/or other materials provided with the distribution.
11  * * Neither the name of the WebSocket++ Project nor the
12  * names of its contributors may be used to endorse or promote products
13  * derived from this software without specific prior written permission.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18  * ARE DISCLAIMED. IN NO EVENT SHALL PETER THORSON BE LIABLE FOR ANY
19  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  *
26  */
27 
28 #ifndef WEBSOCKETPP_LOGGER_BASIC_HPP
29 #define WEBSOCKETPP_LOGGER_BASIC_HPP
30 
31 /* Need a way to print a message to the log
32  *
33  * - timestamps
34  * - channels
35  * - thread safe
36  * - output to stdout or file
37  * - selective output channels, both compile time and runtime
38  * - named channels
39  * - ability to test whether a log message will be printed at compile time
40  *
41  */
42 
43 #include <ctime>
44 #include <iostream>
45 #include <iomanip>
46 
47 #include <websocketpp/common/cpp11.hpp>
48 #include <websocketpp/common/stdint.hpp>
49 #include <websocketpp/logger/levels.hpp>
50 
51 namespace websocketpp {
52 namespace log {
53 
55 template <typename concurrency, typename names>
56 class basic {
57 public:
58  basic<concurrency,names>(std::ostream * out = &std::cout)
59  : m_static_channels(0xffffffff)
60  , m_dynamic_channels(0)
61  , m_out(out) {}
62 
63  basic<concurrency,names>(level c, std::ostream * out = &std::cout)
64  : m_static_channels(c)
65  , m_dynamic_channels(0)
66  , m_out(out) {}
67 
68  void set_ostream(std::ostream * out = &std::cout) {
69  m_out = out;
70  }
71 
72  void set_channels(level channels) {
73  if (channels == names::none) {
74  clear_channels(names::all);
75  return;
76  }
77 
78  scoped_lock_type lock(m_lock);
79  m_dynamic_channels |= (channels & m_static_channels);
80  }
81 
82  void clear_channels(level channels) {
83  scoped_lock_type lock(m_lock);
84  m_dynamic_channels &= ~channels;
85  }
86 
87  void write(level channel, std::string const & msg) {
88  scoped_lock_type lock(m_lock);
89  if (!this->dynamic_test(channel)) { return; }
90  *m_out << "[" << timestamp << "] "
91  << "[" << names::channel_name(channel) << "] "
92  << msg << "\n";
93  m_out->flush();
94  }
95 
96  void write(level channel, char const * msg) {
97  scoped_lock_type lock(m_lock);
98  if (!this->dynamic_test(channel)) { return; }
99  *m_out << "[" << timestamp << "] "
100  << "[" << names::channel_name(channel) << "] "
101  << msg << "\n";
102  m_out->flush();
103  }
104 
105  _WEBSOCKETPP_CONSTEXPR_TOKEN_ bool static_test(level channel) const {
106  return ((channel & m_static_channels) != 0);
107  }
108 
109  bool dynamic_test(level channel) {
110  return ((channel & m_dynamic_channels) != 0);
111  }
112 private:
113  typedef typename concurrency::scoped_lock_type scoped_lock_type;
114  typedef typename concurrency::mutex_type mutex_type;
115 
116  // The timestamp does not include the time zone, because on Windows with the
117  // default registry settings, the time zone would be written out in full,
118  // which would be obnoxiously verbose.
119  //
120  // TODO: find a workaround for this or make this format user settable
121  static std::ostream & timestamp(std::ostream & os) {
122  std::time_t t = std::time(NULL);
123  std::tm* lt = std::localtime(&t);
124  #ifdef _WEBSOCKETPP_CPP11_CHRONO_
125  return os << std::put_time(lt,"%Y-%m-%d %H:%M:%S");
126  #else // Falls back to strftime, which requires a temporary copy of the string.
127  char buffer[20];
128  std::strftime(buffer,sizeof(buffer),"%Y-%m-%d %H:%M:%S",lt);
129  return os << buffer;
130  #endif
131  }
132 
133  mutex_type m_lock;
134 
135  level const m_static_channels;
136  level m_dynamic_channels;
137  std::ostream * m_out;
138 };
139 
140 } // log
141 } // websocketpp
142 
143 #endif // WEBSOCKETPP_LOGGER_BASIC_HPP
Basic logger that outputs to an ostream.
Definition: basic.hpp:56
Namespace for the WebSocket++ project.
Definition: base64.hpp:41