NeoN
A framework for CFD software
Loading...
Searching...
No Matches
logging.hpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2025 NeoN authors
2//
3// SPDX-License-Identifier: MIT
4
5#pragma once
6
7#include <chrono>
8#include <source_location>
9#include <format>
10#include <memory>
11#include <string>
12#include <string_view>
13
14
16{
17
18
28
30{
32 File
33};
34
35/* @brief A class to represent a LogEvent
36 *
37 */
39{
40
41public:
42
43 LogEvent(std::source_location location, Level level, std::string_view message)
45 {
46 creationTS = std::chrono::steady_clock::now();
47 };
48
49 std::source_location location; // where log message was created
50
51 Level level; // the level the event represents e.g. Trace, Debug, ...
52
53 std::string message; // log message
54
55 std::chrono::time_point<std::chrono::steady_clock> creationTS; // store time of constructor call
56
57 /* @brief convert event to a json string */
58 std::string toJson(std::string_view delim)
59 {
60 auto duration = std::chrono::duration_cast<std::chrono::nanoseconds>(
61 std::chrono::steady_clock::now() - creationTS
62 );
63
64 return std::format(
65 "{{\n\"message\": \"{}\",\n\"sourceLocation\": \"{}:{}\",\n\"timeStarted\": "
66 "\"{}\",\n\"duration\": \"{}\"\n}}{}",
67 message,
68 location.file_name(),
69 location.line(),
70 creationTS.time_since_epoch(),
71 duration,
72 delim
73 );
74 }
75};
76
78
79void logImpl(std::string sv, Level level, std::string logName = "NeoN");
80
81/*@brief convenience function to call spdlogs info with std::format */
82template<typename... Args>
83void info(std::string formatString, Args... args)
84{
85 logImpl(std::vformat(formatString, std::make_format_args(args...)), Level::Info);
86}
87
88/*@brief convenience function to call spdlogs warn with std::format */
89template<typename... Args>
90void warn(std::string formatString, Args... args)
91{
92 logImpl(std::vformat(formatString, std::make_format_args(args...)), Level::Warning);
93}
94
95
96/* @class A base class to build additional loggers
97 */
99{
100
101 Target target_;
102
103public:
104
105 BaseLogger() : target_(Target::Console) {};
106
107 BaseLogger(Target target) : target_(target) {};
108
109 virtual ~BaseLogger() = default;
110
111 virtual void log(std::string) const = 0;
112
113 Target getTarget() const { return target_; };
114};
115
116/*@brief convenience function to call log on logger with std::format */
117inline void log(std::shared_ptr<BaseLogger> logger, LogEvent& event, std::string_view delim = ",")
118{
119 if (logger != nullptr)
120 {
121 // console output
122 auto formattedMessage =
123 logger->getTarget() == Target::Console ? event.message : event.toJson(delim);
124
125 logger->log(formattedMessage);
126 }
127}
128
129
130/* @class A class for fine-grained logging
131 */
132class Logger : public BaseLogger
133{
134
135public:
136
137 Logger(std::string name, Level level, Target target);
138
140
141 void log(std::string sv) const override;
142
143private:
144
145 // name of the logger in the spdlog registry
146 std::string name_;
147
148 Level level_;
149};
150
151/*@brief a Logging Mixin class that allows to attach logger to certain classes*/
153{
154
155private:
156
157 std::shared_ptr<BaseLogger> logger_;
158
159public:
160
161 void setLogger(const std::shared_ptr<BaseLogger> logger);
162
163 std::shared_ptr<const BaseLogger> getLogger() const;
164};
165
166template<typename CallClass>
167void setLogger(CallClass& cls, std::shared_ptr<BaseLogger> logger)
168{
169 cls.setLogger(logger);
170}
171}
virtual ~BaseLogger()=default
BaseLogger(Target target)
Definition logging.hpp:107
Target getTarget() const
Definition logging.hpp:113
virtual void log(std::string) const =0
std::string toJson(std::string_view delim)
Definition logging.hpp:58
std::source_location location
Definition logging.hpp:49
std::chrono::time_point< std::chrono::steady_clock > creationTS
Definition logging.hpp:55
LogEvent(std::source_location location, Level level, std::string_view message)
Definition logging.hpp:43
Logger(std::string name, Level level, Target target)
void log(std::string sv) const override
void setLogger(const std::shared_ptr< BaseLogger > logger)
std::shared_ptr< const BaseLogger > getLogger() const
void setLogger(CallClass &cls, std::shared_ptr< BaseLogger > logger)
Definition logging.hpp:167
void log(std::shared_ptr< BaseLogger > logger, LogEvent &event, std::string_view delim=",")
Definition logging.hpp:117
void setNeonDefaultPattern()
void info(std::string formatString, Args... args)
Definition logging.hpp:83
void warn(std::string formatString, Args... args)
Definition logging.hpp:90
void logImpl(std::string sv, Level level, std::string logName="NeoN")
const std::string & name(const NeoN::Document &doc)
Retrieves the name of a Document.