Skip to content

Commit 481f1e8

Browse files
committed
Small updates to Logger
* Use std::string_view as format instead of char* + fmt::string_view * Use u8string() instead of string() in formatter for fs::path * Move some definitions from .h to .cpp * Add comments for functions * Reformat code
1 parent 0cdbe8b commit 481f1e8

File tree

4 files changed

+114
-71
lines changed

4 files changed

+114
-71
lines changed

src/celengine/dsodb.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ bool DSODatabase::load(std::istream& in, const fs::path& resourcePath)
230230
const Hash* objParams = objParamsValue.getHash();
231231
if (objParams == nullptr)
232232
{
233-
GetLogger()->error("Error parsing deep sky catalog entry {}\n", objName.c_str());
233+
GetLogger()->error("Error parsing deep sky catalog entry {}\n", objName);
234234
return false;
235235
}
236236

src/celestia/celestiacore.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2698,7 +2698,7 @@ void CelestiaCore::fatalError(const string& msg, bool visual)
26982698
if (visual)
26992699
flash(msg);
27002700
else
2701-
GetLogger()->error(msg.c_str());
2701+
GetLogger()->error(msg);
27022702
}
27032703
else
27042704
{

src/celutil/logger.cpp

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,48 +9,74 @@
99
// as published by the Free Software Foundation; either version 2
1010
// of the License, or (at your option) any later version.
1111

12+
#include <cstdlib>
1213
#include <iostream>
14+
#include <memory>
1315

1416
#ifdef _MSC_VER
15-
#include <windows.h>
17+
# include <windows.h>
1618
#endif
17-
#include <fmt/ostream.h>
1819
#include "logger.h"
1920

21+
#include <fmt/ostream.h>
22+
2023
namespace celestia::util
2124
{
2225

23-
Logger* Logger::g_logger = nullptr;
26+
namespace
27+
{
28+
std::unique_ptr<Logger> globalLogger = nullptr;
29+
}
2430

25-
Logger* GetLogger()
31+
Logger *
32+
GetLogger()
2633
{
27-
return Logger::g_logger;
34+
return globalLogger.get();
2835
}
2936

30-
Logger* CreateLogger(Level level)
37+
Logger *
38+
CreateLogger(Level level)
3139
{
3240
return CreateLogger(level, std::clog, std::cerr);
3341
}
3442

35-
Logger* CreateLogger(Level level, Logger::Stream &log, Logger::Stream &err)
43+
Logger *
44+
CreateLogger(Level level, Logger::Stream &log, Logger::Stream &err)
3645
{
37-
if (Logger::g_logger == nullptr)
38-
Logger::g_logger = new Logger(level, log, err);
39-
return Logger::g_logger;
46+
if (globalLogger == nullptr)
47+
{
48+
globalLogger = std::make_unique<Logger>(level, log, err);
49+
std::atexit(DestroyLogger);
50+
}
51+
return globalLogger.get();
4052
}
4153

42-
void DestroyLogger()
54+
void
55+
DestroyLogger()
4356
{
44-
delete Logger::g_logger;
57+
globalLogger = nullptr;
4558
}
4659

4760
Logger::Logger() :
48-
m_log(std::clog),
49-
m_err(std::cerr)
61+
Logger(Level::Info, std::clog, std::cerr)
62+
{
63+
}
64+
65+
Logger::Logger(Level level, Stream &log, Stream &err) :
66+
m_log(log),
67+
m_err(err),
68+
m_level(level)
69+
{
70+
}
71+
72+
void
73+
Logger::setLevel(Level level)
5074
{
75+
m_level = level;
5176
}
5277

53-
void Logger::vlog(Level level, fmt::string_view format, fmt::format_args args) const
78+
void
79+
Logger::vlog(Level level, std::string_view format, fmt::format_args args) const
5480
{
5581
#ifdef _MSC_VER
5682
if (level == Level::Debug && IsDebuggerPresent())

src/celutil/logger.h

Lines changed: 71 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// logger.h
22
//
3-
// Copyright (C) 2021, Celestia Development Team
3+
// Copyright (C) 2021-present, Celestia Development Team
44
//
55
// Logging functions.
66
//
@@ -11,20 +11,17 @@
1111

1212
#pragma once
1313

14+
#include <celcompat/filesystem.h>
15+
#include <fmt/format.h>
1416
#include <iosfwd>
1517
#include <string>
18+
#include <string_view>
1619

17-
#include <fmt/format.h>
18-
19-
#include <celcompat/filesystem.h>
20-
21-
template <>
22-
struct fmt::formatter<fs::path> : formatter<std::string>
20+
template<> struct fmt::formatter<fs::path> : formatter<std::string>
2321
{
24-
template <typename FormatContext>
25-
auto format(const fs::path &path, FormatContext &ctx)
22+
template<typename FormatContext> auto format(const fs::path &path, FormatContext &ctx)
2623
{
27-
return formatter<std::string>::format(path.string(), ctx);
24+
return formatter<std::string>::format(path.u8string(), ctx);
2825
}
2926
};
3027

@@ -42,91 +39,111 @@ enum class Level
4239

4340
class Logger
4441
{
45-
public:
42+
public:
4643
using Stream = std::basic_ostream<char>;
4744

45+
/** Create a default logger with Info verbocity writing to std::clog and std::cerr */
4846
Logger();
49-
Logger(Level level, Stream &log, Stream &err) :
50-
m_log(log),
51-
m_err(err),
52-
m_level(level)
53-
{}
5447

55-
void setLevel(Level level)
56-
{
57-
m_level = level;
58-
}
48+
/**
49+
* Create a logger with custom verbocity and output streams
50+
* @param level verbosibility level
51+
* @param log stream used to output normal messages
52+
* @param err stream used to output errors, warnings and debug messages
53+
*/
54+
Logger(Level level, Stream &log, Stream &err);
5955

60-
template <typename... Args> inline void
61-
debug(const char *format, const Args&... args) const;
56+
/**
57+
* Set verbocity level
58+
*
59+
* @param level verbosibility level
60+
*/
61+
void setLevel(Level level);
6262

63-
template <typename... Args> inline void
64-
info(const char *format, const Args&... args) const;
63+
template<typename... Args>
64+
inline void debug(std::string_view format, const Args &...args) const;
6565

66-
template <typename... Args> inline void
67-
verbose(const char *format, const Args&... args) const;
66+
template<typename... Args>
67+
inline void info(std::string_view format, const Args &...args) const;
6868

69-
template <typename... Args> inline void
70-
warn(const char *format, const Args&... args) const;
69+
template<typename... Args>
70+
inline void verbose(std::string_view format, const Args &...args) const;
7171

72-
template <typename... Args> inline void
73-
error(const char *format, const Args&... args) const;
72+
template<typename... Args>
73+
inline void warn(std::string_view format, const Args &...args) const;
7474

75-
template <typename... Args> void
76-
log(Level, const char *format, const Args&... args) const;
75+
template<typename... Args>
76+
inline void error(std::string_view format, const Args &...args) const;
7777

78-
static Logger* g_logger;
78+
template<typename... Args>
79+
void log(Level, std::string_view format, const Args &...args) const;
7980

80-
private:
81-
void vlog(Level level, fmt::string_view format, fmt::format_args args) const;
81+
private:
82+
void vlog(Level level, std::string_view format, fmt::format_args args) const;
8283

8384
Stream &m_log;
8485
Stream &m_err;
85-
Level m_level { Level::Info };
86+
Level m_level;
8687
};
8788

88-
template <typename... Args> void
89-
Logger::log(Level level, const char *format, const Args&... args) const
89+
template<typename... Args> void
90+
Logger::log(Level level, std::string_view format, const Args &...args) const
9091
{
9192
if (level <= m_level)
92-
vlog(level, fmt::string_view(format), fmt::make_format_args(args...));
93+
vlog(level, format, fmt::make_format_args(args...));
9394
}
9495

95-
template <typename... Args> void
96-
Logger::debug(const char *format, const Args&... args) const
96+
template<typename... Args> void
97+
Logger::debug(std::string_view format, const Args &...args) const
9798
{
9899
log(Level::Debug, format, args...);
99100
}
100101

101-
template <typename... Args> inline void
102-
Logger::info(const char *format, const Args&... args) const
102+
template<typename... Args> inline void
103+
Logger::info(std::string_view format, const Args &...args) const
103104
{
104105
log(Level::Info, format, args...);
105106
}
106107

107-
template <typename... Args> inline void
108-
Logger::verbose(const char *format, const Args&... args) const
108+
template<typename... Args> inline void
109+
Logger::verbose(std::string_view format, const Args &...args) const
109110
{
110111
log(Level::Verbose, format, args...);
111112
}
112113

113-
template <typename... Args> inline void
114-
Logger::warn(const char *format, const Args&... args) const
114+
template<typename... Args> inline void
115+
Logger::warn(std::string_view format, const Args &...args) const
115116
{
116117
log(Level::Warning, format, args...);
117118
}
118119

119-
template <typename... Args> inline void
120-
Logger::error(const char *format, const Args&... args) const
120+
template<typename... Args> inline void
121+
Logger::error(std::string_view format, const Args &...args) const
121122
{
122123
log(Level::Error, format, args...);
123124
}
124125

125-
Logger* GetLogger();
126-
Logger* CreateLogger(Level level = Level::Info);
127-
Logger* CreateLogger(Level level,
128-
Logger::Stream &log,
129-
Logger::Stream &err);
126+
/** Return a pointer to the default global Logger instance */
127+
Logger *GetLogger();
128+
129+
/**
130+
* Initiliaze the default global Logger instance writing to std::clog and std::cerr
131+
*
132+
* @param level verbosibility level
133+
* @return pointer to the default global Logger instance
134+
*/
135+
Logger *CreateLogger(Level level = Level::Info);
136+
137+
/**
138+
* Initiliaze the default global Logger instance writing to custom streams
139+
*
140+
* @param level verbosibility level
141+
* @param log stream used to output normal messages
142+
* @param err stream used to output errors, warnings and debug messages
143+
*/
144+
Logger *CreateLogger(Level level, Logger::Stream &log, Logger::Stream &err);
145+
146+
/** Destroy the default global Logger instance */
130147
void DestroyLogger();
131148

132149
} // end namespace celestia::util

0 commit comments

Comments
 (0)