From 7891f780048b2274deb31590427fc3d4e3665c23 Mon Sep 17 00:00:00 2001 From: Ayomide Emmanuel Date: Mon, 21 Jul 2025 14:24:49 +0100 Subject: [PATCH 1/3] Initial commit: Apache log ETL project --- .gitignore | 4 ++ README.md | 25 ++++++++++ __pycache__/database.cpython-312.pyc | Bin 0 -> 2727 bytes __pycache__/parser.cpython-312.pyc | Bin 0 -> 2688 bytes database.py | 69 ++++++++++++++++++++++++++- etl_apache.py | 51 +++++++++++++++++++- image.png | Bin 0 -> 74672 bytes parser.py | 61 ++++++++++++++++++++++- requirements.txt | 2 + summarizer.py | 17 ++++++- 10 files changed, 225 insertions(+), 4 deletions(-) create mode 100644 __pycache__/database.cpython-312.pyc create mode 100644 __pycache__/parser.cpython-312.pyc create mode 100644 image.png diff --git a/.gitignore b/.gitignore index e69de29..207d00b 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1,4 @@ +.venv +test_logs.txt +apache_logs.db +_pycache_ \ No newline at end of file diff --git a/README.md b/README.md index e69de29..0ae087c 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,25 @@ +# 📊 LogForge Apache Log ETL + +## 📁 Overview +LogForge is an Apache log parser and analyzer pipeline that extracts, parses, stores, and summarizes log data using Python and SQLite. + +--- + +## ⚙️ Project Structure + +- `etl_apache.py` – CLI runner for the ETL pipeline +- `parser.py` – Parses raw log lines using regex +- `database.py` – Manages DB schema, connection, and insert logic +- `summerizer.py` – Generates daily summary CSVs +- `apache_logs.db` – Local SQLite DB +- `data/logs/apache_logs` – Folder containing raw logs + +--- + +## 🔍 Schema +![alt text](image.png) + +## 🚀 Usage + +```bash +python etl_apache.py --log data/logs/apache_logs diff --git a/__pycache__/database.cpython-312.pyc b/__pycache__/database.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dfdc3741a74b0b32dcc1f0dc902c129e376a46c9 GIT binary patch literal 2727 zcmb`J&2JM&6u@V^>+g?*O%O#ybN~m~%B3n4RYJ7XkWF!uEYu$r0i%`U-6Rf<*PY!c zBnlNsR1g(4jC9rH4vA^=1)}Do%Z~AF;g(ZB=z-zqkA5&CHwG z_j|iPC6h4(?bJJ8%zhn4=y!JGwSarEbr>!lAQh>&jxHlLqy}!|%UI=Zqssx62g#{H zko*!B!+)?rauvH{nd034Rt7E}AalEK&Rc-x;JPG_{Yo3*A^uQjx?S}`kA6+=7LT(V;B8j3naBQQ6M-Pi@1u$QO!4x|Ayv3j~hEAV+O4=2=roPA*CxOL=lJ zpPR_$C&`#JNwTHlg`5o2Oh|Gu)A4SSqI9XtVAkd}!>r8v?em&BtE)a|_8|Qxs+)RM zulvj}rMX~uk#*LeS~9gA%v77!DAlNMmIcTZr81*6Okamln`yuTR8wXvh7%Gg$+=HU zlD$*Wmdiid>Tiw`*3{{LKTKL#R9Ig6g0p8;s8%ubhOes%R#Q`zinAdyB8_HC<3)0= zl+VL+Qi{0=sZh*LT@7|=N6lED}yghFvZ zR?=BX0bc5wLHocKVm_xq+(etnU29iXuY7g&=IC#H?2dd(Zlly-(yEXRZ1dYN3)$VG*re<_(4MFbyBTIpuN%1%sL03OQs0{Pp;BN3yv=Z2f z8WpebYG5xc3Yv2@@9LndL#__HI^yc6t7EQ?Gd&&KaQB4Ky|X;42<%9G&5M%JdI*{9 zKW{Cb5#=zNME7co=sGuv7O|L+m!H|sm0`$E2-0OQLmb>Xn0do(+%m+&D?>U&!Jr<9dLk3aXW8+RR3JysWXNlO4rbn3R-o3j zqT9h*AtzXiXTe$#FIX$&1Z&0Y;1mPswjy4HR;&}DmFkU94B2^ZMc^F+;4T_80f$a` z5LPPJFtr(4GnXXBG);n04AK=u5-j z_zpx5E}O#Mr^3OOaPWzcUJc#FcTcnf1JT`^31LlM1&V@0{p|$WHF$qyJ-XRHaDS}T zPnbTxo@8otJwR6u@mBwVE~|U{cre}SA8zlC3#pg!{$yV}hz5q+Z*7zK=Zhff z-}AI@xYalO9O3BhUlN0D4)iPgE%@kE_GIAulLKet!5?B6WDm5gM%d6kf{XtF+BZAU z{##_H16{}+u#sa?`C2z}A}=pr=}FUWfV^7n73B=+uEV{l+MV2;9xH5*)n}|k&rse@ z9J&ueb26?wxuVXxUV72}%nObK`4cSZCYa+-hr#6o=2igVOR;@Vg>*|uKM@W)DYh9& zt)*5|ZN$BiXopara9><)Jgk0mthN8$$I0U_!(8;eHirg|v}4=pVHau@Oz!tzhT69nH7M9^>E;IX$nd3w7;7dIa3r*O4&<0ul`4XDGGBW1M~- S8p6W!(|fS6bv%p(d-Pw0XH_Bq literal 0 HcmV?d00001 diff --git a/__pycache__/parser.cpython-312.pyc b/__pycache__/parser.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0e086f01846d087683edff15cd100a1ab109860d GIT binary patch literal 2688 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\d+\.\d+\.\d+\.\d+)\s-\s-\s' + r'\[(?P[^\]]+)\]\s' + r'"(?P\w+)\s(?P.*?)\s(?PHTTP/\d\.\d)"\s' + r'(?P\d{3})\s(?P\d+)\s' + r'"(?P[^"]*)"\s' + r'"(?P[^"]*)"' +) + +# Parse timestamp +def parse_timestamp(raw: str) -> str | None: + try: + return datetime.strptime(raw, "%d/%b/%Y:%H:%M:%S %z").isoformat() + except Exception: + return None + +# Generate unique hash for deduplication +def generate_hash(ip: str, timestamp: str, path: str) -> str: + return hashlib.md5(f"{ip}_{timestamp}_{path}".encode()).hexdigest() + +# Main transform function +def transform_logs(df: pd.DataFrame) -> tuple[pd.DataFrame, pd.DataFrame]: + structured_logs = [] + malformed_logs = [] + + for raw in df["raw_log"]: + raw = raw.strip() + match = log_pattern.match(raw) + if not match: + malformed_logs.append({"raw_log": raw, "error_reason": "Regex match failed"}) + continue + + data = match.groupdict() + timestamp = parse_timestamp(data["timestamp"]) + if not timestamp: + malformed_logs.append({"raw_log": raw, "error_reason": "Invalid timestamp"}) + continue + + uid = generate_hash(data["ip"], timestamp, data["path"]) + + structured_logs.append({ + "signature_hash": uid, + "ip": data["ip"], + "timestamp": timestamp, + "method": data["method"], + "path": data["path"], + "protocol": data["protocol"], + "status": int(data["status"]), + "bytes_sent": int(data["bytes"]), + "referrer": data["referrer"], + "user_agent": data["user_agent"] + }) + + return pd.DataFrame(structured_logs), pd.DataFrame(malformed_logs) diff --git a/requirements.txt b/requirements.txt index e69de29..1624071 100644 --- a/requirements.txt +++ b/requirements.txt @@ -0,0 +1,2 @@ +pandas +chardet \ No newline at end of file diff --git a/summarizer.py b/summarizer.py index b8b5d98..421ddd1 100644 --- a/summarizer.py +++ b/summarizer.py @@ -1 +1,16 @@ -# Report Generation \ No newline at end of file +# Report Generation +import sqlite3 +import pandas as pd + +def generate_daily_summary(date_str): + conn = sqlite3.connect("apache_logs.db") + query = f""" + SELECT date(timestamp) as log_date, status, COUNT(*) as hits + FROM logs + WHERE date(timestamp) = '{date_str}' + GROUP BY status + """ + df = pd.read_sql_query(query, conn) + df.to_csv(f"summary_{date_str}.csv", index=False) + print(f"📦 Daily summary saved as summary_{date_str}.csv") + conn.close() From e34729e95d98261ce3781eafc6b68ccb0f5191da Mon Sep 17 00:00:00 2001 From: Ayomide Emmanuel Date: Mon, 21 Jul 2025 15:04:00 +0100 Subject: [PATCH 2/3] Initial commit: Fixing Summerizer.py --- summarizer.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/summarizer.py b/summarizer.py index 421ddd1..fa49ab9 100644 --- a/summarizer.py +++ b/summarizer.py @@ -1,16 +1,23 @@ -# Report Generation +# summarizer.py import sqlite3 import pandas as pd +import json def generate_daily_summary(date_str): conn = sqlite3.connect("apache_logs.db") query = f""" - SELECT date(timestamp) as log_date, status, COUNT(*) as hits + SELECT date(timestamp) AS log_date, status, COUNT(*) AS hits FROM logs WHERE date(timestamp) = '{date_str}' GROUP BY status + ORDER BY status """ df = pd.read_sql_query(query, conn) - df.to_csv(f"summary_{date_str}.csv", index=False) - print(f"📦 Daily summary saved as summary_{date_str}.csv") + + # Save as JSON instead of CSV + output_filename = f"summary_{date_str}.json" + with open(output_filename, 'w', encoding='utf-8') as f: + json.dump(df.to_dict(orient='records'), f, indent=2) + + print(f"📦 Daily summary saved as {output_filename}") conn.close() From 04da232d27432a14e7159209ac3cbd6d152cc6d5 Mon Sep 17 00:00:00 2001 From: Ayomide Emmanuel Date: Mon, 21 Jul 2025 15:10:43 +0100 Subject: [PATCH 3/3] Initial commit: added a file to .gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 207d00b..0a6ef2e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ .venv test_logs.txt apache_logs.db -_pycache_ \ No newline at end of file +.ipynb_checkpoints \ No newline at end of file