prettier logger

This commit is contained in:
2025-12-22 14:06:40 +01:00
parent d35be78720
commit d4c7ffdfc1
8 changed files with 44 additions and 30 deletions

View File

@@ -1,7 +1,7 @@
#ifndef LOG_HPP
#define LOG_HPP
#define log _log // comment to disable logging
#define log(level, fmt, ...) _log(level, std::source_location::current(), fmt, ##__VA_ARGS__) // comment to disable logging
// #define LOG_FILE_LOCATION "linuxSmartie.log.gz"
#ifdef log
@@ -9,6 +9,7 @@
#include <chrono>
#include <mutex>
#include <print>
#include <source_location>
#include <string_view>
#ifdef LOG_FILE_LOCATION
@@ -16,13 +17,26 @@
inline std::mutex fmtx; // file logging mutex
#endif
// #define FUNC_NAME pFname(std::source_location::current().function_name())
inline std::mutex cmtx; // console logging mutex
enum class LOG { INF, WRN, ERR, DBG, START };
inline std::string_view pFname(std::string_view full) {
if (auto pos = full.find(' '); pos != std::string_view::npos)
full.remove_prefix(pos + 1);
if (auto pos = full.rfind('('); pos != std::string_view::npos)
full.remove_suffix(full.size() - pos);
return full;
}
template <typename... Args>
inline void _log(LOG level, std::string_view tag, std::format_string<Args...> str, Args&&... args) {
inline void _log(LOG level, const std::source_location& loc, std::format_string<Args...> str, Args&&... args) {
constexpr std::string_view reset = "\033[0m";
constexpr std::string_view pattern = "[{}{}{}] ";
std::string_view tag = pFname(loc.function_name());
std::string_view color = "";
switch (level) {

View File

@@ -43,13 +43,13 @@ struct Sensors {
};
void sighandler(int) {
log(LOG::WRN, "Signal", "got SIGINT/SIGTERM, exiting...");
log(LOG::WRN, "got SIGINT/SIGTERM, exiting...");
sem::main.release();
sem::display.release();
}
void hassThread(std::stop_token st, Sensors* s) {
log(LOG::INF, "Thread", "Starting hass_thread");
log(LOG::INF, "Thread started");
HomeAssistant pc_power("home.drath.win", "sensor.gniazdko_komputer_moc");
pc_power.connect();
@@ -66,7 +66,7 @@ void hassThread(std::stop_token st, Sensors* s) {
}
void sensorsThread(std::stop_token st, Sensors* s) {
log(LOG::INF, "Thread", "Starting sensors_thread, poll interval {} ms", LCD_INTERVAL_MS);
log(LOG::INF, "Thread started, poll interval {} ms", LCD_INTERVAL_MS);
cpu::detectHwmon(&s->cpu, "0000:00:18.3");
gpu::detectHwmon(&s->gpu, "0000:0b:00.0");
sys::detectHwmon(&s->sys, "nct6775.656");
@@ -87,14 +87,14 @@ void sensorsThread(std::stop_token st, Sensors* s) {
gpu::update(&s->gpu);
}
// log(LOG::DBG, "Sensors", "took {} microseconds", std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::steady_clock::now() - start).count());
// log(LOG::DBG, "took {} microseconds", std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::steady_clock::now() - start).count());
sem::display.release(); // unlocks display loop
std::this_thread::sleep_until(start + std::chrono::milliseconds(LCD_INTERVAL_MS));
}
}
void displayThread(std::stop_token st, Sensors* s) {
log(LOG::INF, "Thread", "Starting display_thread");
log(LOG::INF, "Thread started");
// init internal variables of LCDDisplay class
LCDDisplay lcd(LCD_PORT);
@@ -165,7 +165,7 @@ void displayThread(std::stop_token st, Sensors* s) {
}
int main() {
log(LOG::START, "LINUXSMARTIE", "============================= PROGRAM START ============================="); // to make logs clearer
log(LOG::START, "============================= PROGRAM START ============================="); // to make logs clearer
std::signal(SIGINT, sighandler);
std::signal(SIGTERM, sighandler);

View File

@@ -40,11 +40,11 @@ LCDDisplay::~LCDDisplay() {
}
void LCDDisplay::open(bool reopen) {
log(LOG::INF, "LCDDisplay", "Opening serial port at \"{}\"", _dev);
log(LOG::INF, "Opening serial port at \"{}\"", _dev);
if (_lcd < 0 || reopen)
_lcd = ::open(_dev.c_str(), O_RDWR | O_NOCTTY | O_NONBLOCK); // ::open calls the global open() instead of LCDDisplay::open()
if (_lcd < 0) {
log(LOG::ERR, "LCDDisplay", "Error opening serial port \"{}\"", _dev); // err
log(LOG::ERR, "Error opening serial port \"{}\"", _dev); // err
exit(_lcd);
}
}
@@ -52,7 +52,7 @@ void LCDDisplay::open(bool reopen) {
void LCDDisplay::close() {
if (_lcd >= 0) {
::close(_lcd);
log(LOG::INF, "LCDDisplay", "Closed LCD port");
log(LOG::INF, "Closed LCD port");
}
_lcd = -1;
}
@@ -60,7 +60,7 @@ void LCDDisplay::close() {
void LCDDisplay::write(const uint8_t* cmdbuf, uint8_t len) {
int rc = ::write(_lcd, cmdbuf, len);
if(rc < 0) {
log(LOG::ERR, "LCDDisplay::write", "failed to execute ::write, lost access to port?");
log(LOG::ERR, "failed to execute ::write, lost access to port?");
this->open(true);
}
}
@@ -71,20 +71,20 @@ void LCDDisplay::clear() {
}
void LCDDisplay::setContrast(uint8_t contrast) {
log(LOG::INF, "LCDDisplay::setContrast", "Set contrast to {}", contrast);
log(LOG::INF, "Set contrast to {}", contrast);
const uint8_t cmdbuf[] = {254, 80, contrast};
this->write(cmdbuf, sizeof(cmdbuf));
}
void LCDDisplay::setBacklight(bool enabled) {
log(LOG::INF, "LCDDisplay::setBacklight", "Set backlight to {}", enabled);
log(LOG::INF, "Set backlight to {}", enabled);
const uint8_t cmdbuf[] = {254, (uint8_t)(enabled ? 66 : 70), 255};
this->write(cmdbuf, enabled ? 3 : 2);
}
/* still doesnt work? */
void LCDDisplay::setBacklight(uint8_t brightness) {
log(LOG::INF, "LCDDisplay::setBacklight", "Set backlight brightness to {}", brightness);
log(LOG::INF, "Set backlight brightness to {}", brightness);
const uint8_t cmdbuf[] = {254, (uint8_t)(brightness ? 66 : 70), 255, brightness}; // 3rd char is timer, 4th is brightness
this->write(cmdbuf, brightness ? 4 : 2);
}

View File

@@ -13,12 +13,12 @@ void detectHwmon(cpuSensors* target, const std::string& pci) {
try {
target->hwmon = getFirstDir(path);
} catch (...) {
log(LOG::ERR, "cpu::detectHwmon", "NO CPU HWMON KERNEL MODULE DETECTED");
log(LOG::ERR, "NO CPU HWMON KERNEL MODULE DETECTED");
return;
}
target->zenpower = false; // we were using readFileToStr to figure this out, we dont f/w it anymore, find another way (see if hwmon/in1_input exists?)
log(LOG::INF, "cpu::detectHwmon", "Detected module \"{}\" in path \"{}\"", target->zenpower ? "zenpower" : "k10temp", target->hwmon);
log(LOG::INF, "Detected module \"{}\" in path \"{}\"", target->zenpower ? "zenpower" : "k10temp", target->hwmon);
}
void update(cpuSensors* c) {

View File

@@ -12,11 +12,11 @@ namespace gpu {
/* takes pointer to a target gpu::sensors struct and updates its hwmon path and detects gpu_metrics */
void detectHwmon(gpuSensors* target, const std::string& pci) {
target->hwmon = getFirstDir("/sys/bus/pci/devices/" + pci + "/hwmon");
log(LOG::INF, "gpu::detectHwmon", "Detected path \"{}\"", target->hwmon);
log(LOG::INF, "Detected path \"{}\"", target->hwmon);
if (FILE* file = fopen((target->hwmon + REL_METRICS_PATH).c_str(), "r")) {
fclose(file);
log(LOG::INF, "gpu::detectHwmon", "found gpu_metrics");
log(LOG::INF, "found gpu_metrics");
target->hasGpuMetrics = true;
}
}
@@ -86,7 +86,7 @@ void updateFromMetrics(gpuSensors* g) {
/* werid hardware i probably dont like, maybe fallback to reading from fs? */
default: {
log(LOG::WRN, "gpu::updateFromMetrics", "Unsupported gpu_metrics_v{}_{}", header->format_revision, header->content_revision);
log(LOG::WRN, "Unsupported gpu_metrics_v{}_{}", header->format_revision, header->content_revision);
break;
}
}

View File

@@ -19,7 +19,7 @@ void HomeAssistant::event_handler(struct lws* wsi, enum lws_callback_reasons rea
ArduinoJson::JsonDocument json;
switch (reason) {
case LWS_CALLBACK_CLIENT_CONNECTION_ERROR: {
log(LOG::ERR, "HomeAssistant::event_handler", "websocket conn error: {}", in ? in : "(null)");
log(LOG::ERR, "websocket conn error: {}", in ? in : "(null)");
return;
}
@@ -36,7 +36,7 @@ void HomeAssistant::event_handler(struct lws* wsi, enum lws_callback_reasons rea
}
if (ha_type == "auth_ok") {
log(LOG::INF, "HomeAssistant::event_handler", "subscribing to entity \"{}\"", entity);
log(LOG::INF, "subscribing to entity \"{}\"", entity);
json.clear();
json["id"] = id++;
json["type"] = "subscribe_entities";
@@ -47,7 +47,7 @@ void HomeAssistant::event_handler(struct lws* wsi, enum lws_callback_reasons rea
if (ha_type == "result") {
if (json["success"].as<std::string>() == "false")
log(LOG::ERR, "HomeAssistant::event_handler", "api said success was \"false\" on message id {}", id - 1);
log(LOG::ERR, "api said success was \"false\" on message id {}", id - 1);
break;
}
@@ -56,17 +56,17 @@ void HomeAssistant::event_handler(struct lws* wsi, enum lws_callback_reasons rea
break;
}
log(LOG::WRN, "HomeAssistant::event_handler", "unhandled event: {}", (char*)in);
log(LOG::WRN, "unhandled event: {}", (char*)in);
break;
}
case LWS_CALLBACK_CLIENT_ESTABLISHED: {
log(LOG::INF, "HomeAssistant::event_handler", "Websocket connected");
log(LOG::INF, "Websocket connected");
break;
}
case LWS_CALLBACK_CLIENT_CLOSED: {
log(LOG::INF, "HomeAssistant::event_handler", "Websocket closed");
log(LOG::INF, "Websocket closed");
return;
}
@@ -125,7 +125,7 @@ int HomeAssistant::connect() {
context = lws_create_context(&info);
if (!context) {
log(LOG::ERR, "HomeAssistant::connect", "error creating context");
log(LOG::ERR, "error creating context");
return -1;
}
@@ -142,7 +142,7 @@ int HomeAssistant::connect() {
websock = lws_client_connect_via_info(&i);
if (!websock) {
log(LOG::ERR, "HomeAssistant::connect", "error creating lws client");
log(LOG::ERR, "error creating lws client");
return -1;
}
return 0;

View File

@@ -68,7 +68,7 @@ void sys::detectHwmon(sysSensors* s, const std::string& platform) {
try {
s->hwmon = getFirstDir("/sys/devices/platform/" + platform + "/hwmon");
} catch (...) {
log(LOG::ERR, "sys::detectHwmon", "Can't open sys hwmon. Module loaded? Kernel params added?");
log(LOG::ERR, "Can't open sys hwmon. Module loaded? Kernel params added?");
return;
}
}

View File

@@ -45,7 +45,7 @@ std::string pBytes(double bytes, bool isKbytes) {
ssize_t readFile(const char* path, char* buffer, size_t maxlen) {
int fd = open(path, O_RDONLY | O_CLOEXEC);
if (fd < 0) {
log(LOG::ERR, "readFile2", "Error reading {}", path);
log(LOG::ERR, "Error reading {}", path);
return 0;
}
ssize_t len = read(fd, buffer, maxlen - 1);