Skip to content

sakateka/ttail

Repository files navigation

ttail - Timed Tail

English | Русский

Π’Ρ‹ΡΠΎΠΊΠΎΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΈ эффСктивная ΠΏΠΎ памяти ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° для отслСТивания Π»ΠΎΠ³ΠΎΠ², которая ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ Π»ΠΎΠ³ΠΎΠ² Π½Π° основС Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠΊ, Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ количСства строк. ИдСально ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°Π½Π½Ρ‹Ρ… Π»ΠΎΠ³ΠΎΠ² Π½Π° основС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

ВозмоТности

  • ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ: ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ Π»ΠΎΠ³ΠΎΠ² Π·Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΠΊ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, послСдниС 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 - Π›ΠΎΠ³ΠΈ доступа Apache
  • nginx - Π›ΠΎΠ³ΠΈ доступа Nginx (Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ)
  • nginx_iso - Nginx с Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΌΠ΅Ρ‚ΠΊΠ°ΠΌΠΈ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ ISO

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ

  • java - Π›ΠΎΠ³ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Java (2023-12-25 10:30:45)
  • java_iso - Java с Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΌΠ΅Ρ‚ΠΊΠ°ΠΌΠΈ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ ISO (2023-12-25T10:30:45)
  • python - Π€ΠΎΡ€ΠΌΠ°Ρ‚ логирования Python
  • go - Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π»ΠΎΠ³ΠΎΠ² Go (2023/12/25 10:30:45)
  • rails - Π›ΠΎΠ³ΠΈ Ruby on Rails
  • django - Π›ΠΎΠ³ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Django

ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ ΠΈ оркСстрация

  • docker - Π›ΠΎΠ³ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² Docker (Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΊΠΈ Π² UTC)
  • docker_local - Docker с Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ часовым поясом
  • kubernetes - Π›ΠΎΠ³ΠΈ ΠΏΠΎΠ΄ΠΎΠ² Kubernetes

Π‘Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…

  • mysql - Π›ΠΎΠ³ΠΈ ошибок MySQL
  • mysql_general - ΠžΠ±Ρ‰ΠΈΠ΅ Π»ΠΎΠ³ΠΈ запросов MySQL
  • postgresql - Π›ΠΎΠ³ΠΈ PostgreSQL
  • elasticsearch - Π›ΠΎΠ³ΠΈ 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: РСализация Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ поиска Π½Π° основС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ

ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ

  1. Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΏΠΎ памяти:

    • ΠœΠ½ΠΎΠ³ΠΎΡ€Π°Π·ΠΎΠ²Ρ‹Π΅ Π±ΡƒΡ„Π΅Ρ€Ρ‹ для ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠΉ памяти
    • НастраиваСмыС Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ Π±ΡƒΡ„Π΅Ρ€ΠΎΠ² для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… сцСнариСв использования
    • Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ Ρ€Π°Π·Π±ΠΎΡ€ строк Π±Π΅Π· Π½Π΅Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ копирования
  2. ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ поиска:

    • Π‘ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск для Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ²
    • Π˜Π½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π±ΡƒΡ„Π΅Ρ€Π°
    • МинимальноС количСство ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°
  3. Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ процСссора:

    • ΠšΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ скомпилированных рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ
    • ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ со строками
    • УмСньшСниС Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Ρ… расходов Π½Π° Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

ВСстированиС

ЗапуститС ΠΏΠΎΠ»Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ тСстов:

# Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ всС тСсты
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 ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ошибки:

  • Π€Π°ΠΉΠ» Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½: Π§Π΅Ρ‚ΠΊΠΎΠ΅ сообщСниС ΠΎΠ± ошибкС
  • Π’Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΊΠΈ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Ρ‹: ВозвращаСтся ΠΊ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ всСго Ρ„Π°ΠΉΠ»Π°
  • НСвСрный Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΊΠΈ: ΠŸΡ€ΠΎΠΏΡƒΡΠΊΠ°Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹Π΅ записи
  • Π‘ΠΎΠ»ΡŒΡˆΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹: ЭффСктивная ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ

УчастиС Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅

  1. Π‘Π΄Π΅Π»Π°ΠΉΡ‚Π΅ Ρ„ΠΎΡ€ΠΊ рСпозитория
  2. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π²Π΅Ρ‚ΠΊΡƒ для Π½ΠΎΠ²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ
  3. Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ тСсты для Π½ΠΎΠ²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ
  4. Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ всС тСсты проходят
  5. ΠžΡ‚ΠΏΡ€Π°Π²ΡŒΡ‚Π΅ 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.

Π–ΡƒΡ€Π½Π°Π» ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ

v2.0.0 (ΠœΠΎΠ΄Π΅Ρ€Π½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Π°Ρ)

  • Полная рСорганизация ΠΊΠΎΠ΄Π° Π² спСциализированныС ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹
  • 25+ встроСнных Ρ‚ΠΈΠΏΠΎΠ² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² Π»ΠΎΠ³ΠΎΠ² (Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π½Π΅ Π½ΡƒΠΆΠ΅Π½)
  • Π—Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ
  • ΠŸΠΎΠ²Ρ‹ΡˆΠ΅Π½Π½Π°Ρ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ использования памяти
  • ВсСстороннСС тСстовоС ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅
  • ΠžΠ±Ρ€Π°Ρ‚Π½ΠΎ совмСстимый API
  • Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Π½Π°Ρ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок
  • Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Π½Π°Ρ докумСнтация

v1.0.0 (ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Π°Ρ)

  • Базовая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ отслСТивания ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° TSKV
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ„Π°ΠΉΠ»Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ

About

timed tail

Topics

Resources

Stars

Watchers

Forks

Packages

No packages published

Contributors 2

  •  
  •