-
Notifications
You must be signed in to change notification settings - Fork 43
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add logging of per-context variables to logging system and network st…
…ack (#1507) * Minor code cleanups related to OLPEDGE-2893 Relates-to: OLPEDGE-2893 Signed-off-by: Hertlein, Ulrich <[email protected]> * Add per-thread context values to logging system This change adds a per-thread logging context to the logging system, which can be set by the user and will then be logged from all threads and tasks created with that context. This is useful to correlate requests from the client to any network requests made based on that request. The logging formatter must be set up by including a `MessageFormatter::ElementType::ContextValue` with the 'format' set to the context key to use. Resolves: OLPEDGE-2893 Signed-off-by: Hertlein, Ulrich <[email protected]> * Store+track log context for Curl network stack When a network requests is created, the current log context is captured and subsequently made active whenever this request is processed. Resolves: OLPEDGE-2893 Signed-off-by: Hertlein, Ulrich <[email protected]> --------- Signed-off-by: Hertlein, Ulrich <[email protected]> Co-authored-by: Hertlein, Ulrich <[email protected]>
- Loading branch information
Showing
12 changed files
with
368 additions
and
25 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,81 @@ | ||
/* | ||
* Copyright (C) 2019-2024 HERE Europe B.V. | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* https://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
* License-Filename: LICENSE | ||
*/ | ||
|
||
#pragma once | ||
|
||
#include <olp/core/CoreApi.h> | ||
|
||
#include <functional> | ||
#include <memory> | ||
#include <string> | ||
#include <unordered_map> | ||
|
||
/** | ||
* @brief The LogContext object stores per-thread key/value pairs that can be | ||
* picked up in log messages using the | ||
* 'olp::logging::MessageFormatter::ElementType::ContextValue' logging element. | ||
*/ | ||
namespace olp { | ||
namespace logging { | ||
/// A context key/value map. The keys are required to be const and immutable. | ||
using LogContext = std::unordered_map<std::string, std::string>; | ||
|
||
/// A function that sets the current log context. | ||
using LogContextSetter = std::function<void(std::shared_ptr<const LogContext>)>; | ||
|
||
/// A function that gets the current log context. | ||
using LogContextGetter = std::function<std::shared_ptr<const LogContext>()>; | ||
|
||
/** | ||
* Sets the getter and setter for the log context. | ||
* | ||
* @param[in] getter The log context getter, or the default getter if | ||
* nullptr. | ||
* @param[in] setter The log context setter, or the default setter if | ||
* nullptr. | ||
*/ | ||
CORE_API void SetLogContextGetterSetter(LogContextGetter getter, | ||
LogContextSetter setter); | ||
|
||
/// Gets the current thread context. | ||
CORE_API std::shared_ptr<const LogContext> GetContext(); | ||
|
||
/// Gets a value from the current thread context. | ||
CORE_API const std::string& GetContextValue(const std::string& key); | ||
|
||
/** | ||
* @brief The ScopedLogContext class takes ownership of a log context | ||
* and makes it active on construction and restores the previous context on | ||
* destruction. | ||
* | ||
* Passing 'nullptr' is the same as passing an empty LogContext. | ||
* | ||
* @see MessageFormatter::ElementType::Context | ||
*/ | ||
class CORE_API ScopedLogContext final { | ||
public: | ||
ScopedLogContext(const std::shared_ptr<const LogContext>& context); | ||
~ScopedLogContext(); | ||
|
||
private: | ||
std::shared_ptr<const LogContext> context_; | ||
std::shared_ptr<const LogContext> prev_context_; | ||
}; | ||
} // namespace logging | ||
} // namespace olp |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
/* | ||
* Copyright (C) 2019-2024 HERE Europe B.V. | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* https://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
* License-Filename: LICENSE | ||
*/ | ||
|
||
#include <olp/core/logging/LogContext.h> | ||
|
||
#include <cassert> | ||
|
||
namespace olp { | ||
namespace logging { | ||
namespace { | ||
thread_local std::shared_ptr<const LogContext> tls_logContext; | ||
|
||
LogContextSetter s_defaultLogContextSetter = | ||
[](std::shared_ptr<const LogContext> context) { | ||
tls_logContext = std::move(context); | ||
}; | ||
|
||
LogContextSetter s_logContextSetter = s_defaultLogContextSetter; | ||
|
||
LogContextGetter s_defaultLogContextGetter = []() { return tls_logContext; }; | ||
LogContextGetter s_logContextGetter = s_defaultLogContextGetter; | ||
|
||
} // namespace | ||
|
||
void SetLogContextGetterSetter(LogContextGetter getter, | ||
LogContextSetter setter) { | ||
s_logContextGetter = getter ? std::move(getter) : s_defaultLogContextGetter; | ||
s_logContextSetter = setter ? std::move(setter) : s_defaultLogContextSetter; | ||
} | ||
|
||
std::shared_ptr<const LogContext> GetContext() { | ||
assert(s_logContextGetter && "Invalid LogContext getter"); | ||
return s_logContextGetter(); | ||
} | ||
|
||
const std::string& GetContextValue(const std::string& key) { | ||
static std::string s_empty = ""; | ||
auto ctx = GetContext(); | ||
if (!ctx || key.empty()) | ||
return s_empty; | ||
|
||
auto it = ctx->find(key); | ||
if (it == ctx->end()) | ||
return s_empty; | ||
|
||
return it->second; | ||
} | ||
|
||
ScopedLogContext::ScopedLogContext( | ||
const std::shared_ptr<const LogContext>& context) | ||
: context_(context) { | ||
prev_context_ = GetContext(); | ||
assert(s_logContextSetter && "Invalid LogContext setter"); | ||
s_logContextSetter(context_); | ||
} | ||
|
||
ScopedLogContext::~ScopedLogContext() { | ||
assert(s_logContextSetter && "Invalid LogContext setter"); | ||
s_logContextSetter(std::move(prev_context_)); | ||
} | ||
|
||
} // namespace logging | ||
} // namespace olp |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.