Metadata-Version: 2.1 Name: apachelogs Version: 0.6.0 Summary: Parse Apache access logs Home-page: https://github.com/jwodder/apachelogs Author: John Thorvald Wodder II Author-email: apachelogs@varonathe.org License: MIT Project-URL: Source Code, https://github.com/jwodder/apachelogs Project-URL: Bug Tracker, https://github.com/jwodder/apachelogs/issues Project-URL: Documentation, https://apachelogs.readthedocs.io Project-URL: Say Thanks!, https://saythanks.io/to/jwodder Keywords: Apache,access logs,httpd,logfiles Platform: UNKNOWN Classifier: Development Status :: 4 - Beta Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Classifier: License :: OSI Approved :: MIT License Classifier: Intended Audience :: System Administrators Classifier: Topic :: Internet :: WWW/HTTP :: HTTP Servers Classifier: Topic :: System :: Logging Classifier: Topic :: Text Processing :: Filters Requires-Python: ~=3.5 Description-Content-Type: text/x-rst Requires-Dist: attrs (>=17.1) Requires-Dist: pydicti (~=1.1) .. image:: http://www.repostatus.org/badges/latest/active.svg :target: http://www.repostatus.org/#active :alt: Project Status: Active — The project has reached a stable, usable state and is being actively developed. .. image:: https://travis-ci.com/jwodder/apachelogs.svg?branch=master :target: https://travis-ci.com/jwodder/apachelogs .. image:: https://codecov.io/gh/jwodder/apachelogs/branch/master/graph/badge.svg :target: https://codecov.io/gh/jwodder/apachelogs .. image:: https://img.shields.io/pypi/pyversions/apachelogs.svg :target: https://pypi.org/project/apachelogs/ .. image:: https://img.shields.io/github/license/jwodder/apachelogs.svg :target: https://opensource.org/licenses/MIT :alt: MIT License .. image:: https://img.shields.io/badge/Say%20Thanks-!-1EAEDB.svg :target: https://saythanks.io/to/jwodder `GitHub `_ | `PyPI `_ | `Documentation `_ | `Issues `_ | `Changelog `_ ``apachelogs`` parses Apache access log files. Pass it a `log format string `_ and get back a parser for logfile entries in that format. ``apachelogs`` even takes care of decoding escape sequences and converting things like timestamps, integers, and bare hyphens to ``datetime`` values, ``int``\s, and ``None``\s. Installation ============ ``apachelogs`` requires Python 3.5 or higher. Just use `pip `_ for Python 3 (You have pip, right?) to install ``apachelogs`` and its dependencies:: python3 -m pip install apachelogs Examples ======== Parse a single log entry:: >>> from apachelogs import LogParser >>> parser = LogParser("%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"") >>> # The above log format is also available as the constant `apachelogs.COMBINED`. >>> entry = parser.parse('209.126.136.4 - - [01/Nov/2017:07:28:29 +0000] "GET / HTTP/1.1" 301 521 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36"\n') >>> entry.remote_host '209.126.136.4' >>> entry.request_time datetime.datetime(2017, 11, 1, 7, 28, 29, tzinfo=datetime.timezone.utc) >>> entry.request_line 'GET / HTTP/1.1' >>> entry.final_status 301 >>> entry.bytes_sent 521 >>> entry.headers_in["Referer"] is None True >>> entry.headers_in["User-Agent"] 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36' >>> # Log entry components can also be looked up by directive: >>> entry.directives["%r"] 'GET / HTTP/1.1' >>> entry.directives["%>s"] 301 >>> entry.directives["%t"] datetime.datetime(2017, 11, 1, 7, 28, 29, tzinfo=datetime.timezone.utc) Parse a file full of log entries:: >>> with open('/var/log/apache2/access.log') as fp: # doctest: +SKIP ... for entry in parser.parse_lines(fp): ... print(str(entry.request_time), entry.request_line) ... 2019-01-01 12:34:56-05:00 GET / HTTP/1.1 2019-01-01 12:34:57-05:00 GET /favicon.ico HTTP/1.1 2019-01-01 12:34:57-05:00 GET /styles.css HTTP/1.1 # etc.