mirror of
https://github.com/systemd/systemd.git
synced 2026-08-07 08:30:57 +00:00
log: Add ratelimit argument to ratelimit log macros
Allows configuring the ratelimit per logging statement.
This commit is contained in:
@@ -375,15 +375,12 @@ typedef struct LogRateLimit {
|
||||
RateLimit ratelimit;
|
||||
} LogRateLimit;
|
||||
|
||||
#define log_ratelimit_internal(_level, _error, _format, _file, _line, _func, ...) \
|
||||
#define log_ratelimit_internal(_level, _error, _ratelimit, _format, _file, _line, _func, ...) \
|
||||
({ \
|
||||
int _log_ratelimit_error = (_error); \
|
||||
int _log_ratelimit_level = (_level); \
|
||||
static LogRateLimit _log_ratelimit = { \
|
||||
.ratelimit = { \
|
||||
.interval = 1 * USEC_PER_SEC, \
|
||||
.burst = 1, \
|
||||
}, \
|
||||
.ratelimit = (_ratelimit), \
|
||||
}; \
|
||||
unsigned _num_dropped_errors = ratelimit_num_dropped(&_log_ratelimit.ratelimit); \
|
||||
if (_log_ratelimit_error != _log_ratelimit.error || _log_ratelimit_level != _log_ratelimit.level) { \
|
||||
@@ -398,14 +395,14 @@ typedef struct LogRateLimit {
|
||||
_log_ratelimit_error; \
|
||||
})
|
||||
|
||||
#define log_ratelimit_full_errno(level, error, format, ...) \
|
||||
#define log_ratelimit_full_errno(level, error, _ratelimit, format, ...) \
|
||||
({ \
|
||||
int _level = (level), _e = (error); \
|
||||
_e = (log_get_max_level() >= LOG_PRI(_level)) \
|
||||
? log_ratelimit_internal(_level, _e, format, PROJECT_FILE, __LINE__, __func__, ##__VA_ARGS__) \
|
||||
? log_ratelimit_internal(_level, _e, _ratelimit, format, PROJECT_FILE, __LINE__, __func__, ##__VA_ARGS__) \
|
||||
: -ERRNO_VALUE(_e); \
|
||||
_e < 0 ? _e : -ESTRPIPE; \
|
||||
})
|
||||
|
||||
#define log_ratelimit_full(level, format, ...) \
|
||||
log_ratelimit_full_errno(level, 0, format, ##__VA_ARGS__)
|
||||
#define log_ratelimit_full(level, _ratelimit, format, ...) \
|
||||
log_ratelimit_full_errno(level, 0, _ratelimit, format, ##__VA_ARGS__)
|
||||
|
||||
@@ -83,6 +83,8 @@
|
||||
|
||||
#define IDLE_TIMEOUT_USEC (30*USEC_PER_SEC)
|
||||
|
||||
#define FAILED_TO_WRITE_ENTRY_RATELIMIT ((RateLimit) { .interval = 1 * USEC_PER_SEC, .burst = 1 })
|
||||
|
||||
static int determine_path_usage(
|
||||
Server *s,
|
||||
const char *path,
|
||||
@@ -874,14 +876,18 @@ static void write_to_journal(Server *s, uid_t uid, struct iovec *iovec, size_t n
|
||||
}
|
||||
|
||||
if (vacuumed || !shall_try_append_again(f->file, r)) {
|
||||
log_ratelimit_full_errno(LOG_ERR, r, "Failed to write entry (%zu items, %zu bytes), ignoring: %m", n, IOVEC_TOTAL_SIZE(iovec, n));
|
||||
log_ratelimit_full_errno(LOG_ERR, r, FAILED_TO_WRITE_ENTRY_RATELIMIT,
|
||||
"Failed to write entry (%zu items, %zu bytes), ignoring: %m",
|
||||
n, IOVEC_TOTAL_SIZE(iovec, n));
|
||||
return;
|
||||
}
|
||||
|
||||
if (r == -E2BIG)
|
||||
log_debug("Journal file %s is full, rotating to a new file", f->file->path);
|
||||
else
|
||||
log_ratelimit_full_errno(LOG_INFO, r, "Failed to write entry to %s (%zu items, %zu bytes), rotating before retrying: %m", f->file->path, n, IOVEC_TOTAL_SIZE(iovec, n));
|
||||
log_ratelimit_full_errno(LOG_INFO, r, FAILED_TO_WRITE_ENTRY_RATELIMIT,
|
||||
"Failed to write entry to %s (%zu items, %zu bytes), rotating before retrying: %m",
|
||||
f->file->path, n, IOVEC_TOTAL_SIZE(iovec, n));
|
||||
|
||||
server_rotate(s);
|
||||
server_vacuum(s, false);
|
||||
@@ -893,7 +899,9 @@ static void write_to_journal(Server *s, uid_t uid, struct iovec *iovec, size_t n
|
||||
log_debug("Retrying write.");
|
||||
r = journal_file_append_entry(f->file, &ts, NULL, iovec, n, &s->seqnum, NULL, NULL);
|
||||
if (r < 0)
|
||||
log_ratelimit_full_errno(LOG_ERR, r, "Failed to write entry to %s (%zu items, %zu bytes) despite vacuuming, ignoring: %m", f->file->path, n, IOVEC_TOTAL_SIZE(iovec, n));
|
||||
log_ratelimit_full_errno(LOG_ERR, r, FAILED_TO_WRITE_ENTRY_RATELIMIT,
|
||||
"Failed to write entry to %s (%zu items, %zu bytes) despite vacuuming, ignoring: %m",
|
||||
f->file->path, n, IOVEC_TOTAL_SIZE(iovec, n));
|
||||
else
|
||||
server_schedule_sync(s, priority);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user