TAIL TALES

April 15, 2025 ยท View on GitHub

A TUI log viewer written in Rust

Screenshot of TAIL TALES Screenshot of TAIL TALES

Objetives

To easy inspect existing logs or streaming logs, with some filters, marking of messages and easy finding information in the logs.

Use

  • Can set default command or file to open: tt
  • Can read exisitng files, checks for changes: tt /var/log/messages
  • Can be used as pipe destination: journalctl -f | tt
  • Can execute commands and show stdout / stderr: tt !journalctl -f -- AS bash does not like use of ! in commands there is an alternative format: tt -- journalctl -f. Another option is tt \!journalctl -f.

Commands

All keybindings are transalted to internal commands. It's possible to execute commands directly entering command mode (: by default).

CommandDescription
quitExit the application
clearRefresh the screen, usefull when its damaged because of non controlled ANSI characters
commandOpens command mode with a new command (not enough with mode command as that woudl not clear the current command)
execExecutes a command, as wl-copy, xdg-open.. or any helper. With placeholders you can pass the original line or urlencoded
search_nextSearch for the next occurrence
search_prevSearch for the previous occurrence
vmove Move vertically, positive down, negative up
hmove Move horizontally, positive right, negative left
vgoto Goto to specific line number
clear_recordsClear all records
warning <msg...>Display a warning message
toggle_mark Toggle a mark on the current line. Its a data for the record with that color as mark, and will be used at render.
move_to_next_markMove to the next marked line
move_to_prev_markMove to the previous marked line
settingsOpen the xdg program with the local settings file. If the file does not exist yet it is created with the default settings.
mode Switch between different modes: normal, command, search or filter
toggle_detailsToggle the display of details

Keybindings

KeyCommand
:command
|mode filter
fmode filter
/mode search
nsearch_next
shift-nsearch_prev
control-delclear_records
control-lrefresh_screen
F1exec xdg-open https://github.com/davidmoreno/tailtales/#use
F2exec xdg-open https://www.perplexity.ai/search/new?q={{lineqs}}
F3exec xdg-open https://www.duckduckgo.com/?q={{lineqs}}
F4exec xdg-open https://google.com/search?q={{lineqs}}
qquit
control-c-- copy to clipboard --
upvmove -1
kvmove -1
page upvmove -10
downvmove 1
jvmove 1
page downvmove 10
lefthmove -1
control-lefthmove -10
righthmove 1
control-righthmove 10
homevgoto 0
endvgoto 2000000000
Ggoto_line
spacetoggle_mark yellow
1toggle_mark red
2toggle_mark green
3toggle_mark blue
4toggle_mark magenta
5toggle_mark cyan
tabmove_to_next_mark
shift-back tabmove_to_prev_mark
escmode normal
vtoggle_details

Settings

It comes with some sensible default settings from the settings.yaml file. It can overwriten, by section at ~/.config/tailtales/settings.yaml or the appropiate XDG config directory. See the file for further information.

Rules

The settings file have several default rules, and more may be added (send your pull request with new file formats!).

It has a basic pattern on the file name to discover which rules to use and acording to the matrched rule it can set:

  • Data extractors: as logfmt, patterns and regex. These extracted data allows easy filtering and search.
  • Columns: From the extracted data, it can show some data into the columns.For example to easily format timestamp or processing time.
  • Filters: Acording filters from the filtering language, allows to color the lines, or add a gutter (symbol at the left of the table).

Filter Language

Its possible to search and filter based on both the line and the structured parsed contents.

  • Just text will look for text
  • The proper way is "text", but if just a simple text is given its understood as text (converts the variable name to a string)
  • ~ regex or better ~ "regex" can also be used to search / filter by regex
  • Basic operations as >, <, >=, <=, ==, != between variablers (record fields) and strings or numbers

More will be added.

Example expressions

  • INFO
  • "^INFO -- The closing " is assumed
  • timestamp <= "2025-01-01" -- The comparison is string based, so timestamps better in ISO format
  • line_number > 1000 && line_number < 2000 -- TODO, no priority, no parenteheiss, will not work

Features

  • TUI
  • Read a log file and be able to navigate using arrows and simple search commands
  • Read stdout/stderr from executed commands
  • Filter messages with some simple expressions
  • Parse the lines and provide a formated simple dictionary (key:value). Can see the log lines and the formatted data. Firswt version bassed on patterns.
  • Logfmt format parsing
  • Pattern format parsing
  • Regex format parsing
  • Filtering language
  • Filtering and marking based on these filters
  • Streaming input. Changes in the file, or pipe in, or executed command are seen inmediately.
  • As it may have many many lines, be able to scroll efficiently
  • Never blocking