LogSense + n8n: automatski odgovor na downtime upite iz Apache logova
Ovaj case study opisuje kako koristim LogSense (PHP aplikaciju za analizu Apache logova) i n8n workflow da automatski odgovorim na standardizirane “Downtime:” emailove. Ideja je jednostavna: iz maila izvući vremenski period, povući relevantne metrike iz logova i sastaviti jasan odgovor koji je utemeljen na podacima.
Kontekst i problem
Monitoring tim često šalje poruke s subjectom poput “Downtime: solgar.hr - October 27th to November 2nd” i traži potvrdu je li bilo incidenta ili planned aktivnosti te “root cause”. Ručno otvaranje logova i traženje uzorka u tom periodu je sporo, pogotovo kad su mjeseci arhivirani (.gz) i kada treba brzo reagirati.
Zato sam htio automatizaciju koja: (1) prepozna da se radi o downtime upitu, (2) pouzdano izvuče date range, (3) povuče log metrike preko API-ja, (4) složi draft odgovora u konzistentnom formatu.
LogSense: što radi i zašto je bitan
LogSense je “drop-in” PHP aplikacija koja radi na shared hostingu bez SSH-a. Čita Apache access logove (i gzip arhive), pokušava pronaći odgovarajući error log, te vraća JSON s agregatima: status kodovi, metode, top URL/IP, user-agentovi i hourly traffic.
Time dobivam objektivan uvid u period koji je naveden u mailu: ima li spikea u 5xx, vidi li se timeout pattern, bot surge ili neki sumnjivi endpointi. Taj JSON je baza za odgovor (manualno ili kroz AI).
n8n workflow: logika i koraci
Workflow u n8n-u je namjerno jednostavan i podijeljen u jasne korake, tako da se kasnije lako proširi (npr. na više domena, više formata subjecta ili dodatne checkove).
Koraci detaljnije
1) IMAP trigger + filter: Workflow se aktivira na nove mailove i odmah filtrira one koji sadrže “Downtime:” u subjectu.
2) OpenAI ekstrakcija perioda: OpenAI dobije subject + body i vraća strogi JSON sa start/end u formatu YYYY-MM-DD HH:mm.
Structured output je važan jer izbjegavam regex parsiranje i edge-caseove (ordinale, range preko dva mjeseca, itd.).
{"start":"2025-10-27 00:00","end":"2025-11-02 23:59"}
3) JSON.parse u JS nodeu: Ako OpenAI vrati JSON kao string u polju text, u malom JS nodeu radim parse i mapiram u polja start/end.
const raw = $json.text;
let data;
try {
data = JSON.parse(raw);
} catch (e) {
throw new Error("Invalid JSON from OpenAI: " + raw);
}
return [{ start: data.start, end: data.end }];
4) HTTP request na LogSense API: n8n šalje POST na /log_report/log_report.php sa secret tokenom i periodom.
Backend vraća agregirani JSON s metrikama relevantnim za taj interval.
{
"secret": "YOUR_SECRET",
"start": "={{$json.start}}",
"end": "={{$json.end}}"
}
5) OpenAI draft reply: Drugi OpenAI node dobije API JSON i složi kratak odgovor: ključne nalaze (npr. 5xx spike / timeout / bot activity) i zaključak (“plausible upstream issue” ili “no clear pattern”).
Node screenshotovi
U nastavku su screenshotovi konfiguracije pojedinih nodeova (kao referenca kad workflow kasnije nadograđujem).
Primjer emaila (ulaz) i draft odgovora
Ovo je format poruke koji tipično stiže (standardni text + date range), a ispod je primjer odgovora koji workflow generira.
Zaključak
Ovaj setup mi daje brži i konzistentniji odgovor: umjesto ručnog kopanja po logovima, dobijem draft u par minuta, a iza njega stoje konkretne metrike iz LogSense JSON-a. Workflow je dovoljno jednostavan da ga kasnije mogu proširiti (npr. automatsko označavanje spikeova, confidence gating, ili routanje prema incident procesu).