Ответ
Для мониторинга логов в реальном времени я в основном использую утилиту tail
с флагом -f
.
Основные инструменты командной строки:
tail -f /path/to/app.log
: Основная команда для отслеживания новых записей в лог-файле в реальном времени.tail -n 200 -f app.log
: Показывает последние 200 строк и продолжает отслеживать новые.tail -f app.log | grep 'ERROR'
: Очень полезная комбинация для фильтрации только строк с ошибками.
Помимо tail
, я также использую:
less +F /path/to/app.log
: Похоже наtail -f
, но позволяет легко переключаться в режим поиска и навигации (нажавCtrl+C
) и обратно (нажавShift+F
).journalctl -u my-app.service -f
: Если приложение управляется черезsystemd
, это стандартный способ просмотра его логов.
Программная реализация в Go
В Go можно реализовать подобную логику для чтения конца файла. Это может быть полезно для создания собственных инструментов мониторинга. Вот упрощенный пример:
// Внимание: это упрощенный пример. В реальном коде нужно
// аккуратно обрабатывать границы строк, чтобы не выводить 'обрывки'.
file, err := os.Open("app.log")
if err != nil {
log.Fatal(err)
}
defer file.Close()
// Перемещаемся в конец файла
stat, _ := file.Stat()
offset := stat.Size()
// В цикле проверяем, не увеличился ли размер файла
for {
time.Sleep(time.Second)
newStat, _ := file.Stat()
if newStat.Size() > offset {
// Читаем новые данные
buf := make([]byte, newStat.Size()-offset)
_, err := file.ReadAt(buf, offset)
if err == nil {
fmt.Print(string(buf))
}
offset = newStat.Size()
}
}