Как вы отслеживаете логи работающего приложения в реальном времени? Какие инструменты для этого используете?

Ответ

Для мониторинга логов в реальном времени я в основном использую утилиту 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()
    }
}