1. 概要
いきさつを述べておくと、「apache」のログを編集してログ解析のソフトに軽くして渡そうとしたんだな。
ログ解析ソフトを複数使用しているので、不要なログをプリセットで削除しておこうと思いまして。
最初、不要なログを判断するために、ログの1行分を「split」とかで分割して、ホスト名やらなんやらに分けようと思ったのですが、単純な分割では、対応しきれない・・・。
ちょっと調べてみると、なんだ、パーサがあるじゃないか・・・。
本ページは、下記の記事を参考にさせていただきました。
「Apache のアクセスログを Python のモジュールで読み込む - Qiita」
2. インストール
「apachelog」と「apache-log-parser」ちゅうのがあるらしい。
「apachelog」というのは、「pkg」「ports」に存在するのですが、参考サイトにあるようにどうもメンテナンスされていないようで、「USES=python:2.7」となっております。
今後、使えなくなるのが目に見えているようなので、これは、試してみるまでもなくやめておきます。
「apache-log-parser」は、「pkg」「ports」にはないようですが、「pip」には存在しました。
念のため「pip」のバージョンを確認しておきます。
$ pip --version
pip 19.1.1 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)
うむ、現在(2020年6月15日)使用しているのが、「python3.7」なので、問題ないようです。
インストール。
$ pip install apache-log-parser
・・・ 略 ・・・
Installing collected packages: ua-parser, user-agents, apache-log-parser
Running setup.py install for user-agents ... done
Running setup.py install for apache-log-parser ... done
Successfully installed apache-log-parser-1.7.0 ua-parser-0.10.0 user-agents-2.1
インストールは、無事成功したようです。
3. 使ってみる
以下のようなソースを書きます。
import apache_log_parser
import pprint
from textwrap import indent
pp = pprint.PrettyPrinter(indent=4)
parser = apache_log_parser.make_parser("%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"")
lines = [ '52.243.33.24 - - [15/Jun/2020:10:45:36 +0900] "POST /blog//xmlrpc.php HTTP/1.1" 200 439 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0 Safari/537.36"', '122x216x15x62.ap122.ftth.ucom.ne.jp - - [15/Jun/2020:10:47:59 +0900] "-" 408 -', 'opt-27-120-156-230.client.pikara.ne.jp - - [15/Jun/2020:10:56:12 +0900] "-" 408 -' ]
for line in lines:
try:
parsed_log = parser(line)
except apache_log_parser.LineDoesntMatchException:
print('exeption')
continue
pp.pprint(parsed_log)
参考サイトでは。
from pip._vendor.html5lib.treewalkers import pprint
てなフォーマットがありましたが、よくわからないので割愛。
「apache」のログフォーマットは、食わせないとならないらしい。
「httpd.conf」の
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
みたいな行を探して、そのフォーマットを 7行目でそのまま食わせているわけです。
(実際には、それを取り込むモジュールもあるようですが、今のところ割愛)
上記のソースを実行すると、下記の結果が得られます。
Traceback (most recent call last):
File "/home/hogehoge/lang/python/apache/parse01.py", line 1, in <module>
import apache_log_parser
ModuleNotFoundError: No module named 'apache_log_parser'
まぁ、本来は、ログの 2、3目の
122x216x15x62.ap122.ftth.ucom.ne.jp - - [15/Jun/2020:10:47:59 +0900] "-" 408 -
opt-27-120-156-230.client.pikara.ne.jp - - [15/Jun/2020:10:56:12 +0900] "-" 408 -
てな行をうまく解析してほしいのですが、これは、うまくいかないようです。
「408」は、「Apache の HTTP ステータスコードが知りたい - ITmedia エンタープライズ」あたりを読むと、タイムアウトのようです。
これは、まぁ、はじかないようにってことかな・・・。