Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Tetragramm
GitHub Repository: Tetragramm/opencv
Path: blob/master/modules/core/src/logger.cpp
16337 views
1
// This file is part of OpenCV project.
2
// It is subject to the license terms in the LICENSE file found in the top-level directory
3
// of this distribution and at http://opencv.org/license.html.
4
5
#include "precomp.hpp"
6
7
#include <opencv2/core/utils/configuration.private.hpp>
8
#include <opencv2/core/utils/logger.hpp>
9
10
#include <sstream>
11
#include <iostream>
12
#include <fstream>
13
14
#ifdef __ANDROID__
15
# include <android/log.h>
16
#endif
17
18
namespace cv {
19
namespace utils {
20
namespace logging {
21
22
static LogLevel parseLogLevelConfiguration()
23
{
24
static cv::String param_log_level = utils::getConfigurationParameterString("OPENCV_LOG_LEVEL",
25
#if defined NDEBUG
26
"WARNING"
27
#else
28
"INFO"
29
#endif
30
);
31
if (param_log_level == "DISABLED" || param_log_level == "disabled" ||
32
param_log_level == "0" || param_log_level == "OFF" || param_log_level == "off")
33
return LOG_LEVEL_SILENT;
34
if (param_log_level == "FATAL" || param_log_level == "fatal")
35
return LOG_LEVEL_FATAL;
36
if (param_log_level == "ERROR" || param_log_level == "error")
37
return LOG_LEVEL_ERROR;
38
if (param_log_level == "WARNING" || param_log_level == "warning" ||
39
param_log_level == "WARNINGS" || param_log_level == "warnings" ||
40
param_log_level == "WARN" || param_log_level == "warn")
41
return LOG_LEVEL_WARNING;
42
if (param_log_level == "INFO" || param_log_level == "info")
43
return LOG_LEVEL_INFO;
44
if (param_log_level == "DEBUG" || param_log_level == "debug")
45
return LOG_LEVEL_DEBUG;
46
if (param_log_level == "VERBOSE" || param_log_level == "verbose")
47
return LOG_LEVEL_VERBOSE;
48
std::cerr << "ERROR: Unexpected logging level value: " << param_log_level << std::endl;
49
return LOG_LEVEL_INFO;
50
}
51
52
static LogLevel& getLogLevelVariable()
53
{
54
static LogLevel g_logLevel = parseLogLevelConfiguration();
55
return g_logLevel;
56
}
57
58
LogLevel setLogLevel(LogLevel logLevel)
59
{
60
LogLevel old = getLogLevelVariable();
61
getLogLevelVariable() = logLevel;
62
return old;
63
}
64
65
LogLevel getLogLevel()
66
{
67
return getLogLevelVariable();
68
}
69
70
namespace internal {
71
72
void writeLogMessage(LogLevel logLevel, const char* message)
73
{
74
const int threadID = cv::utils::getThreadID();
75
std::ostringstream ss;
76
switch (logLevel)
77
{
78
case LOG_LEVEL_FATAL: ss << "[FATAL:" << threadID << "] " << message << std::endl; break;
79
case LOG_LEVEL_ERROR: ss << "[ERROR:" << threadID << "] " << message << std::endl; break;
80
case LOG_LEVEL_WARNING: ss << "[ WARN:" << threadID << "] " << message << std::endl; break;
81
case LOG_LEVEL_INFO: ss << "[ INFO:" << threadID << "] " << message << std::endl; break;
82
case LOG_LEVEL_DEBUG: ss << "[DEBUG:" << threadID << "] " << message << std::endl; break;
83
case LOG_LEVEL_VERBOSE: ss << message << std::endl; break;
84
default:
85
return;
86
}
87
#ifdef __ANDROID__
88
int android_logLevel = ANDROID_LOG_INFO;
89
switch (logLevel)
90
{
91
case LOG_LEVEL_FATAL: android_logLevel = ANDROID_LOG_FATAL; break;
92
case LOG_LEVEL_ERROR: android_logLevel = ANDROID_LOG_ERROR; break;
93
case LOG_LEVEL_WARNING: android_logLevel = ANDROID_LOG_WARN; break;
94
case LOG_LEVEL_INFO: android_logLevel = ANDROID_LOG_INFO; break;
95
case LOG_LEVEL_DEBUG: android_logLevel = ANDROID_LOG_DEBUG; break;
96
case LOG_LEVEL_VERBOSE: android_logLevel = ANDROID_LOG_VERBOSE; break;
97
default:
98
break;
99
}
100
__android_log_print(android_logLevel, "OpenCV/" CV_VERSION, "%s", ss.str().c_str());
101
#endif
102
std::ostream* out = (logLevel <= LOG_LEVEL_WARNING) ? &std::cerr : &std::cout;
103
(*out) << ss.str();
104
if (logLevel <= LOG_LEVEL_WARNING)
105
(*out) << std::flush;
106
}
107
108
} // namespace
109
110
}}} // namespace
111
112