Облачные журналы ведут себя странно
У меня есть два файла журнала с многострочными инструкциями журнала. Оба они имеют одинаковый формат даты и времени в начале каждого оператора журнала. Конфигурация выглядит так:
state_file = /var/lib/awslogs/agent-state
[/opt/logdir/log1.0]
datetime_format = %Y-%m-%d %H:%M:%S
file = /opt/logdir/log1.0
log_stream_name = /opt/logdir/logs/log1.0
initial_position = start_of_file
multi_line_start_pattern = {datetime_format}
log_group_name = my.log.group
[/opt/logdir/log2-console.log]
datetime_format = %Y-%m-%d %H:%M:%S
file = /opt/logdir/log2-console.log
log_stream_name = /opt/logdir/log2-console.log
initial_position = start_of_file
multi_line_start_pattern = {datetime_format}
log_group_name = my.log.group
Агент журналов cloudwatch правильно отправляет журналы log1.0 в мою группу журналов в cloudwatch, однако не отправляет файлы журналов для log2-console.log.
awslogs.log говорит:
2016-11-15 08:11:41,308 - cwlogs.push.batch - WARNING - 3593 - Thread-4 - Skip event: {'timestamp': 1479196444000, 'start_position': 42330916L, 'end_position': 42331504L}, reason: timestamp is more than 2 hours in future.
2016-11-15 08:11:41,308 - cwlogs.push.batch - WARNING - 3593 - Thread-4 - Skip event: {'timestamp': 1479196451000, 'start_position': 42331504L, 'end_position': 42332092L}, reason: timestamp is more than 2 hours in future.
Хотя время сервера правильное. Также странным является то, что номера строк, упомянутые в start_position и end_position, не существуют в реальном загружаемом файле журнала.
Кто-нибудь еще испытывает эту проблему?
3 ответа
Я смог это исправить.
Состояние awslogs было нарушено. Состояние хранится в базе данных sqlite в /var/awslogs/state/agent-state. Вы можете получить к нему доступ через
sudo sqlite3 /var/awslogs/state/agent-state
Для доступа к записи необходим sudo.
Список всех потоков с
select * from stream_state;
Найдите ваш поток журналов и запишите source_id, который является частью структуры данных json в столбце v.
Затем перечислите все записи с этим source_id (в моем случае это было 7675f84405fcb8fe5b6bb14eaa0c4bfd) в таблице push_state
select * from push_state where k="7675f84405fcb8fe5b6bb14eaa0c4bfd";
Результирующая запись имеет структуру данных json в столбце v, который содержит batch_timestamp. И этот batch_timestamp кажется неправильным. Это было в прошлом, и любые более новые (более 2 часов) записи в журнале больше не обрабатывались.
Решение состоит в том, чтобы обновить эту запись. Скопируйте столбец v, замените batch_timestamp на текущую временную отметку и обновите что-то вроде
update push_state set v='... insert new value here ...' where k='7675f84405fcb8fe5b6bb14eaa0c4bfd';
Перезапустите сервис с
sudo /etc/init.d/awslogs restart
Я надеюсь, что это работает для вас!
У нас была та же проблема, и следующие шаги устранили проблему.
Если группы журналов не обновляются с последними событиями: выполните следующие действия:
- Остановил сервис awslogs
- Удаленный файл /var/awslogs/state/agent-state
Обновлена конфигурация /var/awslogs/etc/awslogs.conf из hostaname в ID экземпляра, например:
log_stream_name = {hostname} to log_stream_name = {instance_id}
- Запущен сервис awslogs.
Мне удалось решить эту проблему на Amazon Linux с помощью:
- sudo yum переустановите awslogs
- перезапуск службы sudo
Этот метод сохранил мои конфигурационные файлы в /var/awslogs/, хотя вы можете сделать их резервную копию перед переустановкой.
Примечание. При устранении неполадок я также удалил Log Group
через Консоль AWS. Перезапуск полностью перезагружал все исторические журналы, но на текущей отметке времени, которая имеет меньшее значение. Я не уверен, было ли удаление группы журналов необходимым для работы этого метода. Возможно, вы захотите посмотреть на настройку initial_position config в end_of_file
до перезагрузки.
Я нашел причину. Часовой пояс в моем контейнере докеров не соответствует часовому поясу моего хост-компьютера. После установки согласованности двух часовых поясов проблема решена.