flow 0.3.5

A realtime log analyzer
Documentation
# Flow [![Build Status]https://travis-ci.org/viseztrance/flow.svg?branch=master]https://travis-ci.org/viseztrance/flow

Flow is a [tail](https://en.wikipedia.org/wiki/Tail_(Unix)) like tool that can
group and filter out data.

![Preview](doc/preview.gif)

## Instalation

Currently there are no prebuilt binaries, but with the help of people such as
yourself, this will change.

Flow depends on `ncurses` and `libreadline` (6.3+).

These can be installed on `ubuntu` using the following command:

    sudo apt-get install libncurses5-dev libncursesw5-dev libreadline-dev

And on `fedora`:

    sudo dnf install ncurses-devel readline-devel

Install [rust](https://www.rust-lang.org)

Run `cargo install flow`

## Usage

At a minimum, you can just provide the path to the log file you're insterested in:

    flow path/to/log <options>

Once started, you can search through the log lines with `Control + F` or `/`.

To filter data, you'll need a config file that can be generated by running:

    flow --init <directory or file name>

You can load it by:

    flow path/to/log -c path/to/config

If you haven't specified the `-c` flag, flow also tries to load a `.flow` config
file from your current directory or home folder.

## Writing your own config file

Let's have a look at a sample config:

```toml
[[filters]]
name = "All"

[[filters]]
name = "Having xyz"
contains = "(?i)xyz"

[[filters]]
name = "Errors"
contains = "(?i)xyz"
starts_with = "Started (?P<matching>POST)?"
ends_with = "Completed (?P<matching>500)?"
```

This config creates three menu filters, between which you can navigate by using
the arrow keys. Only lines matching each filter's conditions are shown.

The first filter creates a menu item named "All" that matches every line from
the provided log file.

The second one has an extra option named `contains`, that *needs* to have a
valid [regex](https://doc.rust-lang.org/regex/regex/index.html#syntax) syntax.
In this example, only lines containg `xyz` (case insensitive) will be shown.

The last filter has two extra options named `starts_with` and `ends_with` which
also need to be valid regexes. This example will yield every line between the
ones matching `Started POST` and `Completed 500`, as long as in between there is
at least one containg `xyz`.

To yield the right content, it's very important to match all starting and end
lines even if we have no interest in them – for example, in our case values such
as "Started GET" or "Completed 200". The named capture `(?P<matching>...)?`
tells apart valid from invalid content.

However you can very well use `starts_with` without `ends_with`, and vice versa:

```toml
[[filters]]
name = "Post requests"
starts_with = "Started (?P<matching>POST)?"
```

## License

This is free software, licensed under GPLv3.