【发布时间】:2021-09-23 20:16:49
【问题描述】:
我希望能够使用 SQL 语法查询我的 Apache 日志,其方式与工具 asql 类似。
我正在使用以下代码将 Apache 日志导入 Sqlite:
import sqlite3, apache_log_parser # pip install apache_log_parser
conn = sqlite3.connect('logs.db')
cur = conn.cursor()
cur.execute("""CREATE TABLE IF NOT EXISTS logs (server TEXT, port INTEGER, ip TEXT, time TEXT, url TEXT, status INTEGER, bytes INTEGER, referer TEXT, useragent TEXT)""")
parser = apache_log_parser.make_parser("%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"")
with open("other_vhosts_access.log") as f:
for line in f:
d = parser(line)
cur.execute("""INSERT INTO logs VALUES (:server_name, :server_port, :remote_host, :time_received_isoformat, :request_url, :status, :bytes_tx, :request_header_referer, :request_header_user_agent)""", d)
cur.close()
conn.commit()
conn.close()
它有效。然而,一个月的other_vhosts_access.log 200 MB 文件会产生近 200 MB 的 Sqlite DB 文件(没有压缩)。所以在我的情况下 1 年的日志:
-
通常占用 500 MB:2 * 200 MB(上个月的 2 个纯文本)+ 10 * 10 MB(前 10 个月由
logrotate压缩) -
现在占用:2.4 GB:12 * 200 MB
问题:有没有办法让logs.db(自动?)压缩,但仍然能够使用 Sqlite 运行只读的SELECT * FROM logs WHERE ... 查询?
我见过Sqlite ZIPVFS,但这不是开源的(而且对我的项目来说太贵了)。
【问题讨论】:
标签: python apache sqlite logging compression