Recently we're experimenting with logging solutions at work. We'd like to have an indication of what our current setup is capable of handling in terms of log volume.

My first idea was to whip up a quick Perl script that simply uses Sys::Syslog to dump Shakespeare's works into the logging setup. That worked quite nicely but it's a limited test case.

I wanted something that is more flexible. Enter logload. Logload uses a simple pattern language to generate syslog lines and adds rate limiting on top.

Syslog Patterns

Logload supports a simple pattern language. The logload tool reads a pattern, interprets it and then generates corresponding output. logload will make the following substitutions:

  • a quoted string "foo", which is printed as is
  • a group of quoted strings [ "foo", "bar", ... ] which will select one of these strings at random
  • the plain string randword which will select a random word from the included dictionary
  • the plain string timestamp which will print the current timestamp in iso format
  • all of these should be placed in a list ( [ "foo", "bar"], "=", ["1", "2"], ... ) whose elements will be printed according to the rules above

So the pattern ( ["foo", "bar"], "=", [ "1", "2" ]) will select randomly from foo, bar and 1, 2 and print something like bar = 1 into the syslog stream.

Actually the selection is not truly random. At parse time we randomize the list and then iterate through it, starting from the beginning and wraping around when the end has been reached.

The keyword randword will select a random word from an included dictionary. This is nice to simulate usernames and similar things.

Use the keyword timestamp to fetch the current time in ISO format.

Throughput

To control how many loglines are output per second you can use the -r options of logload. This accepts the number of loglines per second that will be sent.

Throughput control is implemented with a simple leaky bucket algorithm, that tries to reach the defined number of lines. The algorithm has a very low time granularity so output may be a bit bursty.

Usage & examples

Command line arguments:

  • -H specifies the target host, default is localhost, i.e. -H localhost
  • -p specifies the port to send on, default is 514
  • -l specifies the logline/pattern to send
  • -r rate specifies the rate in lines per second, defaults to 1000

Some examples:

  • logload -l '(["INFO", "DEBUG"], ": foobar user ", randword, "logged in")'

  • logload -l 'yada yada' -H logger -p 1544

  • logload -l '("<13>", timestamp, " mymachine ", ["postmaster[14333]", "httpd[17663]"], ": Oww, i must terminate!")'

Limitations

  • currently only plain syslog connections, no GELF or similar
  • currently only tcp and no udp protocol support
  • currently no ssl

Getting Logload

Logload is available from my github repository or simply do a pip install logload.

Generating syslog network load

Follow me on Mastodon!