[PATCH 2/2] libcamera: log: add logTargetCros for ChromeOS logs
Harvey Yang
chenghaoyang at chromium.org
Mon Oct 14 10:13:55 CEST 2024
From: Han-Lin Chen <hanlinchen at chromium.org>
ChromeOS logging requires that the logs export to both syslog and
std::cerr. Add a logTargetCros for the specific case.
Signed-off-by: Han-Lin Chen <hanlinchen at chromium.org>
Co-developed-by: Harvey Yang <chenghaoyang at chromium.org>
Signed-off-by: Harvey Yang <chenghaoyang at chromium.org>
---
include/libcamera/logging.h | 1 +
src/libcamera/base/log.cpp | 61 +++++++++++++++++++++++++++++++------
2 files changed, 53 insertions(+), 9 deletions(-)
diff --git a/include/libcamera/logging.h b/include/libcamera/logging.h
index e1c6341ce..b88acf23b 100644
--- a/include/libcamera/logging.h
+++ b/include/libcamera/logging.h
@@ -16,6 +16,7 @@ enum LoggingTarget {
LoggingTargetSyslog,
LoggingTargetFile,
LoggingTargetStream,
+ LoggingTargetCros,
};
int logSetFile(const char *path, bool color = false);
diff --git a/src/libcamera/base/log.cpp b/src/libcamera/base/log.cpp
index 3a656b8f0..930e2329e 100644
--- a/src/libcamera/base/log.cpp
+++ b/src/libcamera/base/log.cpp
@@ -107,6 +107,7 @@ class LogOutput
public:
LogOutput(const char *path, bool color);
LogOutput(std::ostream *stream, bool color);
+ LogOutput(bool color);
LogOutput();
~LogOutput();
@@ -144,6 +145,19 @@ LogOutput::LogOutput(std::ostream *stream, bool color)
{
}
+/**
+ * \brief Construct a log output to both std:err and syslog
+ * \param[in] color True to output colored messages
+ *
+ * Currently this is only needed for CrOS. Therefore, the target is set to
+ * `LoggingTargetCros`.
+ */
+LogOutput::LogOutput(bool color)
+ : stream_(&std::cerr), target_(LoggingTargetCros), color_(color)
+{
+ openlog("libcamera", LOG_PID, 0);
+}
+
/**
* \brief Construct a log output to syslog
*/
@@ -160,6 +174,7 @@ LogOutput::~LogOutput()
delete stream_;
break;
case LoggingTargetSyslog:
+ case LoggingTargetCros:
closelog();
break;
default:
@@ -230,17 +245,26 @@ void LogOutput::write(const LogMessage &msg)
severityColor = kColorBrightWhite;
}
+ bool toStream = false;
+ bool toSyslog = false;
+
switch (target_) {
case LoggingTargetSyslog:
- str = std::string(log_severity_name(severity)) + " "
- + msg.category().name() + " " + msg.fileInfo() + " ";
- if (!msg.prefix().empty())
- str += msg.prefix() + ": ";
- str += msg.msg();
- writeSyslog(severity, str);
+ toSyslog = true;
break;
case LoggingTargetStream:
case LoggingTargetFile:
+ toStream = true;
+ break;
+ case LoggingTargetCros:
+ toSyslog = true;
+ toStream = true;
+ break;
+ default:
+ break;
+ }
+
+ if (toStream) {
str = "[" + utils::time_point_to_string(msg.timestamp()) + "] ["
+ std::to_string(Thread::currentId()) + "] "
+ severityColor + log_severity_name(severity) + " "
@@ -250,9 +274,15 @@ void LogOutput::write(const LogMessage &msg)
str += prefixColor + msg.prefix() + ": ";
str += resetColor + msg.msg();
writeStream(str);
- break;
- default:
- break;
+ }
+
+ if (toSyslog) {
+ str = std::string(log_severity_name(severity)) + " "
+ + msg.category().name() + " " + msg.fileInfo() + " ";
+ if (!msg.prefix().empty())
+ str += msg.prefix() + ": ";
+ str += msg.msg();
+ writeSyslog(severity, str);
}
}
@@ -270,6 +300,10 @@ void LogOutput::write(const std::string &str)
case LoggingTargetFile:
writeStream(str);
break;
+ case LoggingTargetCros:
+ writeSyslog(LogDebug, str);
+ writeStream(str);
+ break;
default:
break;
}
@@ -549,6 +583,9 @@ int Logger::logSetTarget(enum LoggingTarget target)
case LoggingTargetNone:
std::atomic_store(&output_, std::shared_ptr<LogOutput>());
break;
+ case LoggingTargetCros:
+ std::atomic_store(&output_, std::make_shared<LogOutput>(true));
+ break;
default:
return -EINVAL;
}
@@ -586,6 +623,12 @@ void Logger::logSetLevel(const char *category, const char *level)
*/
Logger::Logger()
{
+#if defined(OS_CHROMEOS)
+ logSetTarget(LoggingTargetCros);
+ parseLogLevels();
+ return;
+#endif
+
bool color = !utils::secure_getenv("LIBCAMERA_LOG_NO_COLOR");
logSetStream(&std::cerr, color);
--
2.47.0.rc1.288.g06298d1525-goog
More information about the libcamera-devel
mailing list