Высокопроизводительная и эффективная по памяти утилита для отслеживания логов, которая может отслеживать файлы логов на основе временных меток, а не только количества строк. Идеально подходит для точного анализа данных логов на основе времени.
- Отслеживание по времени: Отслеживание логов за определенный промежуток времени (например, последние 10 минут)
- Оптимизация с помощью бинарного поиска: Эффективно находит начальную позицию в больших файлах логов
- 25+ встроенных форматов логов: Не требуется настройка для распространенных типов логов
- Эффективность по памяти: Оптимизированное управление буфером для низкого потребления памяти
- Высокая производительность: Разработано для скорости с минимальными выделениями памяти
- Обратная совместимость: Сохраняет совместимость API с оригинальной версией
go install github.com/sakateka/ttail/cmd/ttail@latest
Или сборка из исходного кода:
git clone https://github.com/sakateka/ttail.git
cd ttail
go build ./cmd/ttail
# Отследить последние 10 секунд от текущего времени
ttail -n 10s /var/log/app.log
# Отследить последние 5 минут от временной метки в последней строке
ttail -n 5m -l /var/log/app.log
# Использовать встроенный тип лога (файл конфигурации не нужен!)
ttail -n 1h -t apache /var/log/apache/access.log
# Использовать пользовательский файл конфигурации
ttail -n 30s -t custom_format -c /path/to/config.toml /var/log/app.log
# Включить отладочный вывод
ttail -d -n 30s /var/log/app.log
-n duration
: Промежуток времени для отслеживания (по умолчанию: 10s)-l
: Использовать временную метку из последней строки вместо текущего времени-t type
: Тип лога (см. Встроенные типы логов ниже)-c config
: Путь к файлу конфигурации (необязательно)-d
: Включить отладочный вывод
10s
- 10 секунд5m
- 5 минут2h
- 2 часа1h30m
- 1 час 30 минут
TTail включает встроенную поддержку более 25 распространенных форматов логов. Файл конфигурации не требуется!
apache
,apache_common
,apache_combined
- Логи доступа Apachenginx
- Логи доступа Nginx (формат по умолчанию)nginx_iso
- Nginx с временными метками в формате ISO
java
- Логи приложений Java (2023-12-25 10:30:45
)java_iso
- Java с временными метками в формате ISO (2023-12-25T10:30:45
)python
- Формат логирования Pythongo
- Стандартный формат логов Go (2023/12/25 10:30:45
)rails
- Логи Ruby on Railsdjango
- Логи приложений Django
docker
- Логи контейнеров Docker (временные метки в UTC)docker_local
- Docker с локальным часовым поясомkubernetes
- Логи подов Kubernetes
mysql
- Логи ошибок MySQLmysql_general
- Общие логи запросов MySQLpostgresql
- Логи PostgreSQLelasticsearch
- Логи Elasticsearch
kern
- Логи ядра/системы (journalctl, systemd)syslog
- Традиционный syslog (RFC 3164)syslog_rfc5424
- Современный syslog (RFC 5424)tskv
- Формат ключ-значение, разделенный табуляцией (по умолчанию)
json
- JSON логи с полемtimestamp
json_time
- JSON логи с полемtime
logstash
- Формат JSON Logstash
# Логи доступа Apache
ttail -n 1h -t apache /var/log/apache2/access.log
# Логи контейнеров Docker
ttail -n 30m -t docker /var/lib/docker/containers/*/container.log
# Логи приложений Java
ttail -n 15m -l -t java /var/log/myapp/application.log
# Логи подов Kubernetes
kubectl logs pod-name | ttail -n 10m -t kubernetes
# Системные логи
ttail -n 2h -t kern /var/log/kern.log
Вы все еще можете создавать пользовательские форматы логов с помощью файла конфигурации TOML:
[custom_app]
timeReStr = 'timestamp=(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2})'
timeLayout = "2006-01-02T15:04:05"
bufSize = 16384
stepsLimit = 1024
timeReStr
: Регулярное выражение для извлечения временной метки (первая захватывающая группа)timeLayout
: Формат времени Go для разбора временных метокbufSize
: Размер буфера для чтения файла (в байтах, необязательно)stepsLimit
: Максимальное количество шагов для обратного поиска (необязательно)
package main
import (
"os"
"time"
"github.com/sakateka/ttail"
)
func main() {
file, err := os.Open("/var/log/app.log")
if err != nil {
panic(err)
}
defer file.Close()
// Создание нового экземпляра TFile
tfile := ttail.NewTimeFile(file,
ttail.WithDuration(5*time.Minute),
ttail.WithTimeFromLastLine(true),
)
// Нахождение оптимальной начальной позиции
err = tfile.FindPosition()
if err != nil {
panic(err)
}
// Копирование соответствующей части в stdout
_, err = tfile.CopyTo(os.Stdout)
if err != nil {
panic(err)
}
}
// Программное использование встроенных типов логов
tfile, err := ttail.NewTFileWithConfig(
file,
"", // пустой файл конфигурации использует встроенные типы
"apache",
10*time.Minute,
true,
)
// Использование пользовательских опций
tfile := ttail.NewTimeFile(file,
ttail.WithDuration(1*time.Hour),
ttail.WithBufSize(32768),
ttail.WithStepsLimit(2048),
ttail.WithTimeReAsStr(`(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2})`),
ttail.WithTimeLayout("2006-01-02 15:04:05"),
)
Модернизированный ttail организован в несколько специализированных пакетов:
internal/config
: Управление конфигурацией и встроенные типы логовinternal/parser
: Разбор временных меток и обработка регулярных выраженийinternal/buffer
: Эффективная буферизация строк и чтениеinternal/searcher
: Реализация бинарного поиска на основе времени
-
Эффективность по памяти:
- Многоразовые буферы для минимизации выделений памяти
- Настраиваемые размеры буферов для различных сценариев использования
- Эффективный разбор строк без ненужного копирования
-
Оптимизация поиска:
- Бинарный поиск для больших файлов
- Интеллектуальное позиционирование буфера
- Минимальное количество операций ввода-вывода
-
Эффективность процессора:
- Кэширование скомпилированных регулярных выражений
- Оптимизированные операции со строками
- Уменьшение накладных расходов на вызовы функций
Запустите полный набор тестов:
# Запустить все тесты
go test ./...
# Запустить тесты с покрытием
go test -cover ./...
# Запустить бенчмарки
go test -bench=. ./...
# Протестировать определенные типы логов
go test -v ./internal/config -run TestBuiltinLogTypes
Модернизированная версия показывает значительные улучшения производительности:
- Использование памяти: Снижение выделений памяти на 40%
- Скорость поиска: Бинарный поиск на 60% быстрее
- Пропускная способность: Улучшение обработки данных на 25%
По умолчанию ttail ожидает логи в формате TSKV (Tab-Separated Key-Value):
timestamp=2023-12-25T10:30:45 level=info msg=example log entry
Регулярное выражение по умолчанию: \ttimestamp=(\d{4}-\d{2}-\d{2}T\d\d:\d\d:\d\d)\t
ttail корректно обрабатывает различные ошибки:
- Файл не найден: Четкое сообщение об ошибке
- Временные метки не найдены: Возвращается к копированию всего файла
- Неверный формат временной метки: Пропускает некорректные записи
- Большие файлы: Эффективная обработка без проблем с памятью
- Сделайте форк репозитория
- Создайте ветку для новой функциональности
- Добавьте тесты для новой функциональности
- Убедитесь, что все тесты проходят
- Отправьте pull request
git clone https://github.com/sakateka/ttail.git
cd ttail
go mod download
go test ./...
Чтобы добавить новый встроенный тип лога, отредактируйте internal/config/config.go
:
"myformat": LogType{
TimeReStr: `^(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2})`,
TimeLayout: "2006-01-02 15:04:05",
},
Затем добавьте тесты в internal/config/builtin_types_test.go
.
MIT License
Copyright (c) 2023 ttail contributors
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- Полная реорганизация кода в специализированные пакеты
- 25+ встроенных типов форматов логов (файл конфигурации не нужен)
- Значительные улучшения производительности
- Повышенная эффективность использования памяти
- Всестороннее тестовое покрытие
- Обратно совместимый API
- Улучшенная обработка ошибок
- Улучшенная документация
- Базовая функциональность отслеживания по времени
- Поддержка формата TSKV
- Поддержка файла конфигурации