the ultimate tailer
Project description
The ultimate rotation and windows friendly log tailer plus a lot more…
backfills rotated files
handles gz and bz2 files
handles multi line records
doesn’t break windows rotating log handlers
easy to extend
Free software: BSD license
other than six pure Python stdlib.
Installation
pip install tailchaser
Thsi will install the tailchaser library in your site-packages and it will also add the script tailchase to your Scripts directory.
Usage
$ tailchase /where/my/logs/*.log $ tailchase -h usage: tailchase [-h] [--only-backfill] [--dont-backfill] [--clear-checkpoint] [--read-period READ_PERIOD] [--read-pause READ_PAUSE] [--reading-from {unix,win}] [--temp-dir TEMP_DIR] [--logging {DEBUG,INFO,WARN,ERROR,CRITICAL}] file-pattern positional arguments: file-pattern The file pattern to tail, such as /var/log/access.* optional arguments: -h, --help show this help message and exit --only-backfill dont't tail, default: False --dont-backfill basically only tail, default: False --clear-checkpoint start form the begining, default: False --read-period READ_PERIOD how long you read before you pause. If zero you don't pause, default: 1 --read-pause READ_PAUSE how long you pause between reads, default: 0 --reading-from PLATFORM sets how long you read and then pause can be one of {unix,win}, default: win --temp-dir TEMP_DIR on back fill files are copied to a temp directory.Use this to set this directory, default: None --logging LEVEL logging level it can be one of DEBUG,INFO,WARN,ERROR,CRITICAL, default: ERROR
In its simplest form
In its simplest form tailchase works like a combination of cat and tail -f except it will start with the oldest rotated file. So if you were to have
/var/log/opendirectoryd.log /var/log/opendirectoryd.log.0 /var/log/opendirectoryd.log.1 /var/log/opendirectoryd.log.2 /var/log/opendirectoryd.log.3 /var/log/opendirectoryd.log.4
it would first output the text of /var/log/opendirectoryd.log.4, then /var/log/opendirectoryd.log.3, etc. until it reached the newest file then when it has reached the end of /var/log/opendirectoryd.log revert to a “tail -f” behaviour.
So if you were to do
tailchase 'tests/logs/opendirectoryd.*'
“note: In bash you need to quote the wildcard otherwise it will be expanded into the scripts argv array.”
you would get something like
2015-12-24 15:39:56.733754 EST - AID: 0x0000000000000000 - Registered node with name '/Contacts' 2015-12-24 15:39:56.733933 EST - AID: 0x0000000000000000 - Registered node with name '/LDAPv3' as hidden 2015-12-24 15:39:56.736154 EST - AID: 0x0000000000000000 - Registered node with name '/Local' as hidden 2015-12-24 15:39:56.736868 EST - AID: 0x0000000000000000 - Registered node with name '/NIS' as hidden 2015-12-24 15:39:56.737134 EST - AID: 0x0000000000000000 - Discovered configuration for node name '/Search' at path ' 2015-12-24 15:39:56.737151 EST - AID: 0x0000000000000000 - Registered node with name '/Search' 2015-12-24 15:39:56.738794 EST - AID: 0x0000000000000000 - Loaded bundle at path '/System/Library/OpenDirectory/Modules 2015-12-24 15:39:56.740509 EST - AID: 0x0000000000000000 - Loaded bundle at path '/System/Library/OpenDirectory/Modules/
Coding with tailchaser
Using the tailchaser library in a project is probably best done by example.
Example 1 - Tailchase to a REST service.
# # Example 1 - Tail to Elastic # import requests import tailchaser class TailToElastic(tailchaser.Tailer): def handoff(self, file_tailed, checkpoint, record): """ Expect a record like: 20160204 10:28:15,525 INFO PropertiesLoaderSupport - Loading properties file from URL [file:C:/WaterWorks/Broken/BSE//config/lme-market.properties] 20160204 10:28:15,541 INFO PropertiesLoaderSupport - Loading properties file from URL [file:C:/WaterWorks/Broken/BSE//config/default-database.properties] 20160204 10:28:15,541 INFO PropertiesLoaderSupport - Loading properties file from URL [file:C:/WaterWorks/Broken/BSE//config/default-hibernate.properties] """ date, time, level, source, _, message = record.split(5) result = requests.json("http://someelacticserver.com:9200/myindex/log", json={ 'timestamp': '{}T{}'.format(date, time) 'level': level, 'source': source, 'message': message }) return result.status_code == requests.codes.ok
Example 2 - Tailchase to Kafka
# # Example 2 - Tail to Kafka - shows how to add your own arguments and then send messages to kafka. # import msgpack import tailchaser from kafka import KafkaProducer class TailToKafka(tailchaser.Tailer): def add_arguments(cls, parser=None): parser = super(TailToKafka, cls).add_arguments(parser) HOSTS = 'localhost:1234' TOPIC = 'log' def startup(self): self.kafka_producer = KafkaProducer(bootstrap_servers=self.HOSTS,value_serializer=msgpack.dumps) def handoff(self, file_tailed, checkpoint, record): """ Expect a record like: 20160204 10:28:15,525 INFO PropertiesLoaderSupport - Loading properties file from URL [file:C:/WaterWorks/Broken/BSE//config/lme-market.properties] 20160204 10:28:15,541 INFO PropertiesLoaderSupport - Loading properties file from URL [file:C:/WaterWorks/Broken/BSE//config/default-database.properties] 20160204 10:28:15,541 INFO PropertiesLoaderSupport - Loading properties file from URL [file:C:/WaterWorks/Broken/BSE//config/default-hibernate.properties] """ self.kafka_producer.send(self.TOPIC, record).get(timeout=10) return True
Documentation
Development
To run the all tests run:
tox
Note, to combine the coverage data from all the tox environments run:
Windows |
set PYTEST_ADDOPTS=--cov-append tox |
---|---|
Other |
PYTEST_ADDOPTS=--cov-append tox |
Changelog
0.1.0 (2016-02-21)
First release on PyPI.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
File details
Details for the file tailchaser-0.1.1-py2.py3-none-any.whl
.
File metadata
- Download URL: tailchaser-0.1.1-py2.py3-none-any.whl
- Upload date:
- Size: 11.7 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 2aedb9a18349fe7d9bd2e1b18924245811132d197c80f3aabd117332be9f291b |
|
MD5 | 437b67539a8cf44f32df72ab3c32e0c0 |
|
BLAKE2b-256 | bc6253a493c698d59325398b4fe9b5810187aa03f1686d6a3a16f096a3d412fd |