Open guojun08512 opened 6 days ago
The code you've shared seems fine at first glance. Callstack suggests something else is happening in code not shown here.
enum SYSLOGTRG : int {
DEFAULT,
ENABLE,
DISABLE,
};
auto Logger::IsLogBufferEmpty() -> bool { return log_buffer_.size_approx() == 0; }
auto Logger::SysLogEnable(SyslogType type) -> bool {
#ifdef _WIN32
init_syslog();
#endif
closelog();
switch (type) {
case APPLICATION:
openlog(nullptr, LOG_PID, LOG_LOCAL4);
break;
case SERVICE:
openlog(nullptr, LOG_PID, LOG_LOCAL3);
break;
case IO_DEVICES:
openlog(nullptr, LOG_PID, LOG_LOCAL0);
break;
case COMMUNICATION_BUS:
openlog(nullptr, LOG_PID, LOG_LOCAL1);
break;
case SAFETY_SYSTEMS:
openlog(nullptr, LOG_PID, LOG_LOCAL2);
break;
case RUNTIME:
openlog(nullptr, LOG_PID, LOG_LOCAL5);
break;
case SYSTEM_MAINTENANCE:
openlog(nullptr, LOG_PID, LOG_LOCAL6);
break;
case TEMPORARY_DEBUGGING:
openlog(nullptr, LOG_PID, LOG_LOCAL7);
break;
}
const LogEvent lev{"", nullptr, "", 0, SlogLevel::DEBUG, "", ENABLE};
log_buffer_.enqueue(lev);
return true;
}
void Logger::SysLogDisable() {
const LogEvent lev{"", nullptr, "", 0, SlogLevel::DEBUG, "", DISABLE};
log_buffer_.enqueue(lev);
closelog();
}
void Logger::Log(SlogLevel level, const std::string &tag, const std::string &file, int line,
const std::string &formatted) {
const LogEvent lev{
formatted, nullptr, file, line, level, tag,
};
log_buffer_.enqueue(lev);
}
void Logger::Worker() {
while (!stop_worker_) {
while (log_buffer_.size_approx() > 0) {
if (stop_worker_) {
break;
}
static std::atomic<bool> syslog{false};
LogEvent lev{"", nullptr, "", 0, SlogLevel::DEBUG, ""};
auto ret = log_buffer_.try_dequeue(lev);
if (!ret) {
continue;
}
switch (lev.syslog_triger) {
case ENABLE:
syslog.store(true);
continue;
case DISABLE:
syslog.store(false);
continue;
}
if (!quiet_ && lev.level >= default_level_) {
LogToStdout(lev);
}
if (syslog && lev.level >= default_level_) {
LogToSyslog(lev);
}
}
}
}
Logger::Logger() {
SysLogEnable(TEMPORARY_DEBUGGING);
std::thread worker_thread(&Logger::Worker, this);
worker_thread.detach();
}
void Logger::ResetLogBuffer() {
while (!IsLogBufferEmpty()) {
LogEvent lev{"", nullptr, "", 0, SlogLevel::DEBUG, ""};
auto ret = log_buffer_.try_dequeue(lev);
if (!ret) {
continue;
}
if (lev.level >= default_level_) {
LogToSyslog(lev);
}
}
}
Logger::~Logger() { // NOLINT(bugprone-exception-escape)
stop_worker_ = true;
ResetLogBuffer();
}
code:
panic info: