2023-06-14 16:52:36 +10:00
|
|
|
/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation
|
|
|
|
|
*
|
|
|
|
|
* SPDX-License-Identifier: Apache-2.0 */
|
2014-09-08 18:01:24 +06:00
|
|
|
|
2021-10-24 14:19:19 +02:00
|
|
|
#include "util/log.h"
|
|
|
|
|
#include "util/math.h"
|
|
|
|
|
#include "util/string.h"
|
2025-06-12 02:19:57 +02:00
|
|
|
#include "util/time.h"
|
2014-09-08 18:01:24 +06:00
|
|
|
|
2024-12-26 17:53:59 +01:00
|
|
|
#include <cstdio>
|
2014-11-16 01:12:19 +05:00
|
|
|
#ifdef _MSC_VER
|
|
|
|
|
# define snprintf _snprintf
|
|
|
|
|
#endif
|
|
|
|
|
|
2014-09-08 18:01:24 +06:00
|
|
|
CCL_NAMESPACE_BEGIN
|
|
|
|
|
|
2025-07-10 19:44:14 +02:00
|
|
|
LogLevel LOG_LEVEL = LOG_LEVEL_INFO_IMPORTANT;
|
2025-06-12 02:19:57 +02:00
|
|
|
static LogFunction LOG_FUNCTION;
|
|
|
|
|
static double LOG_START_TIME = time_dt();
|
|
|
|
|
|
|
|
|
|
const char *log_level_to_string(const LogLevel level)
|
|
|
|
|
{
|
|
|
|
|
switch (level) {
|
2025-07-10 19:44:14 +02:00
|
|
|
case LOG_LEVEL_FATAL:
|
|
|
|
|
case LOG_LEVEL_DFATAL:
|
2025-06-12 02:19:57 +02:00
|
|
|
return "FATAL";
|
2025-07-10 19:44:14 +02:00
|
|
|
case LOG_LEVEL_ERROR:
|
|
|
|
|
case LOG_LEVEL_DERROR:
|
2025-06-12 02:19:57 +02:00
|
|
|
return "ERROR";
|
2025-07-10 19:44:14 +02:00
|
|
|
case LOG_LEVEL_WARNING:
|
|
|
|
|
case LOG_LEVEL_DWARNING:
|
2025-06-12 02:19:57 +02:00
|
|
|
return "WARNING";
|
2025-07-10 19:44:14 +02:00
|
|
|
case LOG_LEVEL_INFO_IMPORTANT:
|
|
|
|
|
case LOG_LEVEL_INFO:
|
2025-06-12 02:19:57 +02:00
|
|
|
return "INFO";
|
2025-07-10 19:44:14 +02:00
|
|
|
case LOG_LEVEL_DEBUG:
|
2025-06-12 02:19:57 +02:00
|
|
|
return "DEBUG";
|
2025-08-18 20:22:44 +02:00
|
|
|
case LOG_LEVEL_TRACE:
|
|
|
|
|
return "TRACE";
|
2025-07-10 19:44:14 +02:00
|
|
|
case LOG_LEVEL_UNKNOWN:
|
2025-06-12 02:19:57 +02:00
|
|
|
return "UNKNOWN";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return "";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
LogLevel log_string_to_level(const string &str)
|
2019-06-28 15:42:58 +02:00
|
|
|
{
|
2025-06-12 02:19:57 +02:00
|
|
|
const std::string str_lower = string_to_lower(str);
|
2019-06-28 15:42:58 +02:00
|
|
|
|
2025-06-12 02:19:57 +02:00
|
|
|
if (str_lower == "fatal") {
|
2025-07-10 19:44:14 +02:00
|
|
|
return LOG_LEVEL_FATAL;
|
2025-06-12 02:19:57 +02:00
|
|
|
}
|
|
|
|
|
if (str_lower == "error") {
|
2025-07-10 19:44:14 +02:00
|
|
|
return LOG_LEVEL_ERROR;
|
2019-06-28 15:42:58 +02:00
|
|
|
}
|
2025-06-12 02:19:57 +02:00
|
|
|
if (str_lower == "warning") {
|
2025-07-10 19:44:14 +02:00
|
|
|
return LOG_LEVEL_WARNING;
|
2025-06-12 02:19:57 +02:00
|
|
|
}
|
|
|
|
|
if (str_lower == "info") {
|
2025-07-10 19:44:14 +02:00
|
|
|
return LOG_LEVEL_INFO;
|
2025-06-12 02:19:57 +02:00
|
|
|
}
|
|
|
|
|
if (str_lower == "debug") {
|
2025-07-10 19:44:14 +02:00
|
|
|
return LOG_LEVEL_DEBUG;
|
2025-06-12 02:19:57 +02:00
|
|
|
}
|
2025-08-18 20:22:44 +02:00
|
|
|
if (str_lower == "trace") {
|
|
|
|
|
return LOG_LEVEL_TRACE;
|
|
|
|
|
}
|
2025-07-10 19:44:14 +02:00
|
|
|
return LOG_LEVEL_UNKNOWN;
|
2025-06-12 02:19:57 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void log_init(const LogFunction func)
|
|
|
|
|
{
|
|
|
|
|
LOG_FUNCTION = func;
|
|
|
|
|
LOG_START_TIME = time_dt();
|
2019-06-28 15:42:58 +02:00
|
|
|
}
|
|
|
|
|
|
2025-06-12 02:19:57 +02:00
|
|
|
void log_level_set(const LogLevel level)
|
2014-11-16 01:12:19 +05:00
|
|
|
{
|
2025-06-12 02:19:57 +02:00
|
|
|
LOG_LEVEL = level;
|
|
|
|
|
}
|
2014-12-12 16:01:30 +05:00
|
|
|
|
2025-06-12 02:19:57 +02:00
|
|
|
void log_level_set(const std::string &level)
|
|
|
|
|
{
|
|
|
|
|
const LogLevel new_level = log_string_to_level(level);
|
2025-07-10 19:44:14 +02:00
|
|
|
if (new_level == LOG_LEVEL_UNKNOWN) {
|
|
|
|
|
LOG_ERROR << "Unknown log level specified: " << level;
|
2025-06-12 02:19:57 +02:00
|
|
|
return;
|
2019-06-28 15:42:58 +02:00
|
|
|
}
|
2025-06-12 02:19:57 +02:00
|
|
|
LOG_LEVEL = new_level;
|
2014-11-16 01:12:19 +05:00
|
|
|
}
|
|
|
|
|
|
2025-06-12 02:19:57 +02:00
|
|
|
static void log_default(const LogLevel level, const std::string &time_str, const char *msg)
|
2014-11-16 01:12:19 +05:00
|
|
|
{
|
2025-07-10 19:44:14 +02:00
|
|
|
if (level >= LOG_LEVEL_INFO) {
|
2025-06-12 02:19:57 +02:00
|
|
|
printf("%s | %s\n", time_str.c_str(), msg);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
fflush(stdout);
|
|
|
|
|
fprintf(stderr, "%s | %s: %s\n", time_str.c_str(), log_level_to_string(level), msg);
|
2019-06-28 15:42:58 +02:00
|
|
|
}
|
2014-11-16 01:12:19 +05:00
|
|
|
}
|
|
|
|
|
|
2025-06-12 02:19:57 +02:00
|
|
|
void _log_message(const LogLevel level, const char *file_line, const char *func, const char *msg)
|
2014-11-16 01:12:19 +05:00
|
|
|
{
|
2025-06-12 02:19:57 +02:00
|
|
|
assert(level <= LOG_LEVEL);
|
|
|
|
|
|
|
|
|
|
if (LOG_FUNCTION) {
|
|
|
|
|
LOG_FUNCTION(level, file_line, func, msg);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const std::string time_str = time_human_readable_from_seconds(time_dt() - LOG_START_TIME);
|
|
|
|
|
|
|
|
|
|
if (strchr(msg, '\n') == nullptr) {
|
|
|
|
|
log_default(level, time_str, msg);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
vector<string> lines;
|
|
|
|
|
string_split(lines, msg, "\n", false);
|
|
|
|
|
for (const string &line : lines) {
|
|
|
|
|
log_default(level, time_str, line.c_str());
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-10 19:44:14 +02:00
|
|
|
if (level == LOG_LEVEL_FATAL || level == LOG_LEVEL_DFATAL) {
|
2025-06-12 02:19:57 +02:00
|
|
|
abort();
|
|
|
|
|
}
|
2014-11-16 01:12:19 +05:00
|
|
|
}
|
|
|
|
|
|
2017-02-20 13:02:11 +01:00
|
|
|
std::ostream &operator<<(std::ostream &os, const int2 &value)
|
|
|
|
|
{
|
|
|
|
|
os << "(" << value.x << ", " << value.y << ")";
|
|
|
|
|
return os;
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-08 18:01:24 +06:00
|
|
|
std::ostream &operator<<(std::ostream &os, const float3 &value)
|
|
|
|
|
{
|
|
|
|
|
os << "(" << value.x << ", " << value.y << ", " << value.z << ")";
|
|
|
|
|
return os;
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-29 12:20:56 +01:00
|
|
|
std::ostream &operator<<(std::ostream &os, const float4 &value)
|
|
|
|
|
{
|
|
|
|
|
os << "(" << value.x << ", " << value.y << ", " << value.z << ", " << value.w << ")";
|
|
|
|
|
return os;
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-08 18:01:24 +06:00
|
|
|
CCL_NAMESPACE_END
|