|
CX Framework
Cross-platform C utility framework
|
Macros | |
| #define | logStrOnce(level, str) _logStr_##level(LOG_##level, LOG_CHANNEL, LOG_SiteOnce, 0, str) |
| #define | logStrEveryN(level, n, str) _logStr_##level(LOG_##level, LOG_CHANNEL, LOG_SiteEveryN, (n), str) |
| #define | logStrEveryT(level, interval, str) _logStr_##level(LOG_##level, LOG_CHANNEL, LOG_SiteEveryT, (interval), str) |
| #define | logFmtOnce(level, fmt, ...) _logFmtArgs(level, LOG_CHANNEL, LOG_SiteOnce, 0, fmt, __VA_ARGS__) |
| #define | logFmtEveryN(level, n, fmt, ...) _logFmtArgs(level, LOG_CHANNEL, LOG_SiteEveryN, (n), fmt, __VA_ARGS__) |
| #define | logFmtEveryT(level, interval, fmt, ...) _logFmtArgs(level, LOG_CHANNEL, LOG_SiteEveryT, (interval), fmt, __VA_ARGS__) |
Variants that emit only some of the times their call site is reached. The state lives in the call site's own LogSite, so no registry, allocation, or key derivation is involved and two call sites never share a budget – not even two identical messages in the same function.
The level check happens first. A gate is only consumed when something is actually listening at that level on that channel, so a logStrOnce() in startup code does not spend its single emission on a message logged before any destination was registered.
The counters are not serialized. Two threads reaching a logStrEveryN() site at once can both pass; making a rate limit exact needs a lock per call site, which costs more than the handful of messages it saves. Treat the counts as approximate.
| #define logFmtEveryN | ( | level, | |
| n, | |||
| fmt, | |||
| ... | |||
| ) | _logFmtArgs(level, LOG_CHANNEL, LOG_SiteEveryN, (n), fmt, __VA_ARGS__) |
void logFmtEveryN(level, n, fmt, ...)
Log a formatted message every Nth time this call site is reached
| level | Log level without LOG_ prefix |
| n | Emit on every Nth arrival; values below 1 are treated as 1 |
| fmt | Format string |
| ... | Format arguments wrapped in stvar() #define _SL(s) Inline ASCII string literal with compile-time embedded length (STR_LEN8). Content must be < 200 bytes... Definition strliteral.h:207 |
| #define logFmtEveryT | ( | level, | |
| interval, | |||
| fmt, | |||
| ... | |||
| ) | _logFmtArgs(level, LOG_CHANNEL, LOG_SiteEveryT, (interval), fmt, __VA_ARGS__) |
void logFmtEveryT(level, interval, fmt, ...)
Log a formatted message at most once per interval
| #define logFmtOnce | ( | level, | |
| fmt, | |||
| ... | |||
| ) | _logFmtArgs(level, LOG_CHANNEL, LOG_SiteOnce, 0, fmt, __VA_ARGS__) |
void logFmtOnce(level, fmt, ...)
Log a formatted message the first time this call site is reached, and never again
| level | Log level without LOG_ prefix |
| fmt | Format string |
| ... | Format arguments wrapped in stvar() |
| #define logStrEveryN | ( | level, | |
| n, | |||
| str | |||
| ) | _logStr_##level(LOG_##level, LOG_CHANNEL, LOG_SiteEveryN, (n), str) |
void logStrEveryN(level, n, str)
Log a string message every Nth time this call site is reached, starting with the first
| level | Log level without LOG_ prefix |
| n | Emit on every Nth arrival; values below 1 are treated as 1 |
| str | String or string reference to log |
| #define logStrEveryT | ( | level, | |
| interval, | |||
| str | |||
| ) | _logStr_##level(LOG_##level, LOG_CHANNEL, LOG_SiteEveryT, (interval), str) |
void logStrEveryT(level, interval, str)
Log a string message at most once per interval, starting with the first arrival
| level | Log level without LOG_ prefix |
| interval | Minimum time between emissions, in cx time units (e.g. timeS(10)) |
| str | String or string reference to log |
| #define logStrOnce | ( | level, | |
| str | |||
| ) | _logStr_##level(LOG_##level, LOG_CHANNEL, LOG_SiteOnce, 0, str) |
Log a string message the first time this call site is reached, and never again
| level | Log level without LOG_ prefix |
| str | String or string reference to log |