
stool is a CLI tool to analyze access pattern from Nginx access log.
Installation
You can install stool using the following command:
go install github.com/haijima/stool@latest
MacOS users can install stool using Homebrew (See also haijima/homebrew-tap):
brew install haijima/tap/stool
or you can download binaries from Releases.
Examples
stool param --file path/to/access.log --num 10 --stat "/users/(?P<userId>[^/]+)$"
stool scenario --file path/to/access.log --matching_groups "/users/.*,/items/.*" --format dot | dot -T svg -o scenario.svg && open scenario.svg
stool transition --file path/to/access.log --matching_groups "/users/.*,/items/.*" --format dot | dot -T svg -o transition.svg && open transition.svg
stool trend --file path/to/access.log --matching_groups "/users/.*,/items/.*" --interval 10
stool genconf path/to/main.go --format yaml >> .stool.yaml
Commands and Options
Commands
stool param: Show the parameter statistics for each endpoint
stool scenario: Show the access patterns of users
stool transition: Show the transition between endpoints
stool trend: Show the count of accesses for each endpoint over time
stool genconf: Generate configuration file
Options
Global Options
--config string : Config file (default is $XDG_CONFIG_HOME/.stool.yaml)
--no-color: Disable colorized output
-q, --quiet: Quiet output
--verbosity int: Verbosity level (default 0)
-f, --file string : Access log file to profile.
--filter string : Filter log lines for more information
--format string: The stat output format {table|md|csv|tsv} (default "table")
--log_labels stringToString : Comma-separated list of key=value pairs to override log labels (default [])
-m, --matching_groups strings : Comma-separated list of regular expression patterns to group matched URIs. For
-n, --num int: The number of parameters to show (default 5)
--stat: Show statistics of the parameters
--time_format string : The format to parse time field on log file (default "02/Jan/2006:15:04:05 -0700").
-t, --type string: The type of the parameter {path|query|all} (default "all")
example: --matching_groups "/users/.*,/items/.*".
-f, --file string : Access log file to profile.
--filter string : Filter log lines for more information
--format string : The output format {dot|mermaid|csv} (default "dot").
--log_labels stringToString : Comma-separated list of key=value pairs to override log labels (default [])
-m, --matching_groups strings : Comma-separated list of regular expression patterns to group matched URIs. For
example: --matching_groups "/users/.*,/items/.*".
--palette : Use color palette for each endpoint (default false)
--time_format string : The format to parse time field on log file (default "02/Jan/2006:15:04:05 -0700").
-f, --file string : Access log file to profile.
--filter string : Filter log lines for more information
--format string : The output format {dot|mermaid|csv} (default "dot").
--log_labels stringToString : Comma-separated list of key=value pairs to override log labels (default [])
-m, --matching_groups strings : Comma-separated list of regular expression patterns to group matched URIs. For
example: --matching_groups "/users/.*,/items/.*".
--time_format string : The format to parse time field on log file (default "02/Jan/2006:15:04:05 -0700").
-f, --file string : Access log file to profile.
--filter string : Filter log lines for more information
--format string : The output format {table|md|csv} (default "table")
-i, --interval int : The time (in seconds) of the interval. Access counts are cumulated at each interval. (
default 5).
--log_labels stringToString : Comma-separated list of key=value pairs to override log labels (default [])
-m, --matching_groups strings : Comma-separated list of regular expression patterns to group matched URIs. For
--sort string : Comma-separated list of "<sort keys>:<order>" Sort keys
are {method|uri|sum|count0|count1|countN}. Orders are [asc|desc]. e.g. "sum:desc,count0:asc" (
default "sum:desc")
example: --matching_groups "/users/.*,/items/.*".
--time_format string : The format to parse time field on log file (default "02/Jan/2006:15:04:05 -0700").
--capture-group-name : Add names to captured groups like "(?P<name>pattern)" (default false)
--format string : The output format {toml|yaml|json|flag} (default "yaml")
filter
Use common expression language (CEL) to filter log lines.
The following variables are defined
req: string
status: int
method: string
uri: string
time: timestamp
uid: string
set_new_uid: bool
Example:
--filter "method == 'GET' && uri.contains('users') && time >= timestamp('2024-01-01T10:00:00Z')"
[!TIP]
timestamp function requires RFC3339 format.
Prerequisites
Graphviz
Graphviz is required to visualize .dot files that are generated by stool scenario
or stool transition command.
ngx_http_userid_module is required to get the user ID from the cookie.
See Module ngx_http_userid_module for details.
stool can handle LTSV formatted log file.
The example of Nginx log setting is shown below:
userid on; # Enable $uid_got and $uid_set
log_format ltsv "time:$time_local"
"\thost:$remote_addr"
"\tforwardedfor:$http_x_forwarded_for"
"\treq:$request"
"\tstatus:$status"
"\tmethod:$request_method"
"\turi:$request_uri"
"\tsize:$body_bytes_sent"
"\treferer:$http_referer"
"\tua:$http_user_agent"
"\treqtime:$request_time"
"\tcache:$upstream_http_x_cache"
"\truntime:$upstream_http_x_runtime"
"\tapptime:$upstream_response_time"
"\tuidgot:$uid_got"
"\tuidset:$uid_set"
"\tvhost:$host";
License
This tool is licensed under the MIT License. See the LICENSE file for details.