Apache Log4cxx  Version 1.6.0
Loading...
Searching...
No Matches
asyncbuffer.h
Go to the documentation of this file.
1/*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18#ifndef LOG4CXX_ASYNC_BUFFER_H
19#define LOG4CXX_ASYNC_BUFFER_H
20
22#include <functional>
23#include <vector>
24
25namespace LOG4CXX_NS
26{
27
28namespace helpers
29{
30
36class LOG4CXX_EXPORT AsyncBuffer
37{
38public:
42
46
50
55 template<typename T>
56 AsyncBuffer& operator<<(const T& value)
57 {
58 append([value](LogCharMessageBuffer& msgBuf)
59 {
60 msgBuf << value;
61 });
62 return *this;
63 }
64
65#ifdef __cpp_init_captures // C++ >= 14
70 template<typename T>
71 AsyncBuffer& operator<<(const T&& rvalue)
72 {
73 append([value = std::move(rvalue)](LogCharMessageBuffer& msgBuf)
74 {
75 msgBuf << value;
76 });
77 return *this;
78 }
79#endif
83 bool empty() const;
84
88 void renderMessage(LogCharMessageBuffer& msg);
89
93 void clear();
94
95private:
96 AsyncBuffer(const AsyncBuffer&) = delete;
97 AsyncBuffer& operator=(const AsyncBuffer&) = delete;
98
99 LOG4CXX_DECLARE_PRIVATE_MEMBER_PTR(Private, m_priv)
100 using MessageBufferAppender = std::function<void(LogCharMessageBuffer&)>;
101
105 void append(const MessageBufferAppender& f);
106};
107
108} // namespace helpers
109} // namespace LOG4CXX_NS
110
114
115#if !defined(LOG4CXX_THRESHOLD) || LOG4CXX_THRESHOLD <= 10000
135#define LOG4CXX_DEBUG_ASYNC(logger, message) do { \
136 if (LOG4CXX_UNLIKELY(::LOG4CXX_NS::Logger::isDebugEnabledFor(logger))) {\
137 ::LOG4CXX_NS::helpers::AsyncBuffer buf; \
138 logger->addDebugEvent(std::move(buf << message), LOG4CXX_LOCATION); }} while (0)
139#else
140#define LOG4CXX_DEBUG_ASYNC(logger, message)
141#endif
142
143#if !defined(LOG4CXX_THRESHOLD) || LOG4CXX_THRESHOLD <= 5000
155#define LOG4CXX_TRACE_ASYNC(logger, message) do { \
156 if (LOG4CXX_UNLIKELY(::LOG4CXX_NS::Logger::isTraceEnabledFor(logger))) {\
157 ::LOG4CXX_NS::helpers::AsyncBuffer buf; \
158 logger->addTraceEvent(std::move(buf << message), LOG4CXX_LOCATION); }} while (0)
159#else
160#define LOG4CXX_TRACE_ASYNC(logger, message)
161#endif
162
163#if !defined(LOG4CXX_THRESHOLD) || LOG4CXX_THRESHOLD <= 20000
180#define LOG4CXX_INFO_ASYNC(logger, message) do { \
181 if (::LOG4CXX_NS::Logger::isInfoEnabledFor(logger)) {\
182 ::LOG4CXX_NS::helpers::AsyncBuffer buf;\
183 logger->addInfoEvent(std::move(buf << message), LOG4CXX_LOCATION);\
184 }} while (0)
185
186#endif
187
188#else
189#define LOG4CXX_INFO_ASYNC(logger, message)
190#endif
191
192#if !defined(LOG4CXX_THRESHOLD) || LOG4CXX_THRESHOLD <= 30000
207#define LOG4CXX_WARN_ASYNC(logger, message) do { \
208 if (::LOG4CXX_NS::Logger::isWarnEnabledFor(logger)) {\
209 ::LOG4CXX_NS::helpers::AsyncBuffer buf; \
210 logger->addWarnEvent(std::move(buf << message), LOG4CXX_LOCATION); }} while (0)
211#else
212#define LOG4CXX_WARN_ASYNC(logger, message)
213#endif
214
215#if !defined(LOG4CXX_THRESHOLD) || LOG4CXX_THRESHOLD <= 40000
230#define LOG4CXX_ERROR_ASYNC(logger, message) do { \
231 if (::LOG4CXX_NS::Logger::isErrorEnabledFor(logger)) {\
232 ::LOG4CXX_NS::helpers::AsyncBuffer buf; \
233 logger->addErrorEvent(std::move(buf << message), LOG4CXX_LOCATION); }} while (0)
234
242#define LOG4CXX_ASSERT_ASYNC(logger, condition, message) do { \
243 if (!(condition) && ::LOG4CXX_NS::Logger::isErrorEnabledFor(logger)) {\
244 ::LOG4CXX_NS::helpers::AsyncBuffer buf; \
245 LOG4CXX_STACKTRACE \
246 logger->addErrorEvent(std::move(buf << message), LOG4CXX_LOCATION); }} while (0)
247
248#else
249#define LOG4CXX_ERROR_ASYNC(logger, message)
250#define LOG4CXX_ASSERT_ASYNC(logger, condition, message)
251#endif
252
253#if !defined(LOG4CXX_THRESHOLD) || LOG4CXX_THRESHOLD <= 50000
265#define LOG4CXX_FATAL_ASYNC(logger, message) do { \
266 if (::LOG4CXX_NS::Logger::isFatalEnabledFor(logger)) {\
267 ::LOG4CXX_NS::helpers::AsyncBuffer buf; \
268 logger->addFatalEvent(std::move(buf << message), LOG4CXX_LOCATION); }} while (0)
269
270#else
271#define LOG4CXX_FATAL_ASYNC(logger, message)
272#endif
273
This class is used by the LOG4CXX_INFO_ASYNC and similar macros to support insertion operators.
Definition asyncbuffer.h:37
bool empty() const
Has no item been added to this?
~AsyncBuffer()
Release resources.
AsyncBuffer(AsyncBuffer &&other)
A new buffer with the content of other.
void renderMessage(LogCharMessageBuffer &msg)
Add text version of buffered values to msg.
AsyncBuffer()
An empty buffer.
AsyncBuffer & operator<<(const T &value)
Append a function to this buffer that will convert value to text.
Definition asyncbuffer.h:56
void clear()
Remove all message appenders.
log4cxx::helpers::UniCharMessageBuffer & operator<<(log4cxx::helpers::UniCharMessageBuffer &mb, const QString &msg)
Definition log4cxx-qt/messagebuffer.h:24