log.cpp
Go to the documentation of this file.
1 // -- BEGIN LICENSE BLOCK ----------------------------------------------
2 // Copyright 2021 Universal Robots A/S
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 
16 // All source code contained in and/or linked to in this message (the “Source Code”) is subject to the copyright of
17 // Universal Robots A/S and/or its licensors. THE SOURCE CODE IS PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 // OR IMPLIED, INCLUDING – BUT NOT LIMITED TO – WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
19 // NONINFRINGEMENT. USE OF THE SOURCE CODE IS AT YOUR OWN RISK AND UNIVERSAL ROBOTS A/S AND ITS LICENSORS SHALL, TO THE
20 // MAXIMUM EXTENT PERMITTED BY LAW, NOT BE LIABLE FOR ANY ERRORS OR MALICIOUS CODE IN THE SOURCE CODE, ANY THIRD-PARTY
21 // CLAIMS, OR ANY OTHER CLAIMS AND DAMAGES, INCLUDING INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL OR PUNITIVE DAMAGES,
22 // OR ANY LOSS OF PROFITS, EXPECTED SAVINGS, OR REVENUES, WHETHER INCURRED DIRECTLY OR INDIRECTLY, OR ANY LOSS OF DATA,
23 // USE, GOODWILL, OR OTHER INTANGIBLE LOSSES, RESULTING FROM YOUR USE OF THE SOURCE CODE. You may make copies of the
24 // Source Code for use in connection with a Universal Robots or UR+ product, provided that you include (i) an
25 // appropriate copyright notice (“© [the year in which you received the Source Code or the Source Code was first
26 // published, e.g. “2021”] Universal Robots A/S and/or its licensors”) along with the capitalized section of this notice
27 // in all copies of the Source Code. By using the Source Code, you agree to the above terms. For more information,
28 // please contact legal@universal-robots.com.
29 // -- END LICENSE BLOCK ------------------------------------------------
30 
31 #include "ur_client_library/log.h"
33 #include <cstdarg>
34 #include <cstdio>
35 
36 namespace urcl
37 {
38 class Logger
39 {
40 public:
42  {
44  log_handler_.reset(new DefaultLogHandler());
45  }
46 
48  {
49  if (log_handler_)
50  {
51  log_handler_.reset();
52  }
53  }
54 
55  void registerLogHandler(std::unique_ptr<LogHandler> loghandler)
56  {
57  log_handler_ = std::move(loghandler);
58  }
59 
61  {
62  log_handler_.reset(new DefaultLogHandler());
63  }
64 
65  void log(const char* file, int line, LogLevel level, const char* txt)
66  {
67  if (!log_handler_)
68  {
69  log_handler_.reset(new DefaultLogHandler());
70  }
71 
72  log_handler_->log(file, line, level, txt);
73  }
74 
75  void setLogLevel(LogLevel level)
76  {
77  log_level_ = level;
78  }
79 
81  {
82  return log_level_;
83  }
84 
85 private:
86  std::unique_ptr<LogHandler> log_handler_;
88 };
90 
91 void registerLogHandler(std::unique_ptr<LogHandler> loghandler)
92 {
93  g_logger.registerLogHandler(std::move(loghandler));
94 }
95 
97 {
98  g_logger.unregisterLogHandler();
99 }
100 
102 {
103  g_logger.setLogLevel(level);
104 }
105 
106 void log(const char* file, int line, LogLevel level, const char* fmt, ...)
107 {
108  if (level >= g_logger.getLogLevel())
109  {
110  size_t buffer_size = 1024;
111  std::unique_ptr<char[]> buffer;
112  buffer.reset(new char[buffer_size]);
113 
114  va_list args;
115  va_start(args, fmt);
116  va_list args_copy;
117  va_copy(args_copy, args);
118 
119  size_t characters = 1 + std::vsnprintf(buffer.get(), buffer_size, fmt, args);
120 
121  if (characters >= buffer_size)
122  {
123  buffer_size = characters + 1;
124  buffer.reset(new char[buffer_size]);
125  std::vsnprintf(buffer.get(), buffer_size, fmt, args_copy);
126  }
127 
128  va_end(args);
129  va_end(args_copy);
130 
131  g_logger.log(file, line, level, buffer.get());
132  }
133 }
134 
135 } // namespace urcl
Logger g_logger
Definition: log.cpp:89
LogLevel getLogLevel()
Definition: log.cpp:80
void log(const char *file, int line, LogLevel level, const char *txt)
Definition: log.cpp:65
LogHandler object for default handling of logging messages. This class is used when no other LogHandl...
LogLevel log_level_
Definition: log.cpp:87
void unregisterLogHandler()
Definition: log.cpp:60
void setLogLevel(LogLevel level)
Definition: log.cpp:75
~Logger()
Definition: log.cpp:47
std::unique_ptr< LogHandler > log_handler_
Definition: log.cpp:86
Logger()
Definition: log.cpp:41
LogLevel
Different log levels.
Definition: log.h:34
void registerLogHandler(std::unique_ptr< LogHandler > loghandler)
Definition: log.cpp:55


ur_client_library
Author(s): Thomas Timm Andersen, Simon Rasmussen, Felix Exner, Lea Steffen, Tristan Schnell
autogenerated on Tue Jul 4 2023 02:09:47