Как получить все строки журнала между двумя диапазонами дат в Linux

это не редкость (или, по крайней мере, не неизвестно), когда ядро ​​выполняет системные вызовы ... но сначала вам нужно сделать немного хакерство, чтобы вы могли передавать виртуальные адреса ядра в качестве аргументов (как минимум - есть другие препятствия и ловушки, которые делают это тем, чего вам следует избегать, если вы можете ... например, не рекомендуется делать это из обработчик прерывания). эта статья в блоге дает разумное объяснение.

2
03.05.2018, 22:22
2 ответа

Если ваша система использует systemd, то journalctlимеет параметры для диапазонов времени и дат для вывода из журналов.

Изman journalctl:

-S, --since=, -U, --until= Start showing entries on or newer than the specified date, or on or older than the specified date, respectively. Date specifications should be of the format "2012-10-30 18:17:16". If the time part is omitted, "00:00:00" is assumed. If only the seconds component is omitted, ":00" is assumed. If the date component is omitted, the current day is assumed. Alternatively the strings "yesterday", "today", "tomorrow" are understood, which refer to 00:00:00 of the day before the current day, the current day, or the day after the current day, respectively. "now" refers to the current time. Finally, relative times may be specified, prefixed with "-" or "+", referring to times before or after the current time, respectively. For complete time and date specification, see systemd.time(7). Note that --output=short-full prints timestamps that follow precisely this format.

Объедините это с опцией --userи некоторыми grep, чтобы отфильтровать системные сообщения, чтобы уменьшить беспорядок. Если ваша система не использует systemd или сообщения вашей программы не перехватываются journald, то вам может понадобиться что-то еще.

2
27.01.2020, 22:02

Предполагая упрощенную «временную» среду (без преобразования часовых поясов, без перехода на летнее время ), вы можете указать awk диапазоны дат в секундах -начиная с -эпохи -, а затем иметь awk конвертировать каждую дату в секунды -с -эпохи -и печатать только строки в этом диапазоне:

awk -v from=$(date -d "2018-04-04 11:40:45" +%s) \
    -v   to=$(date -d "2018-04-04 11:40:47" +%s) \
 '{ "date -d \""$1 " "$2"\" +%s" | getline s; 
    if (from <= s && s <= to) print;
  }' < input
2018-04-04 11:40:46 INFO  RestAssuredService:184 - some thing.......

Это не особенно эффективно, так как вызывает dateдля каждой строки; его можно улучшить для поиска в кэше, если это станет проблемой.

1
27.01.2020, 22:02

Теги

Похожие вопросы