Every request that reached the application, parsed into readable entries — who asked for what, what they got back, and what they were using. This is where you see scanning, probing and brute-force attempts against this application specifically.
Getting here: Servers → a server → Applications → an application → Security
1. What this tab is, and what it is not
It is a reader. The tab pulls the web server's access log for the application and turns each line into a structured entry you can filter and search. It contains one section — Incidents logs.
It is not a control panel. There is nothing here to switch on, no rule to write, no address to block. Seeing an attack here does not stop it.
That division is worth being clear about up front, because the tab's own description mentions managing security settings:
| Need | Where it lives |
|---|---|
| See what is hitting the application | Security (this tab) |
| Block an IP or a port | Server → Firewall |
| Rate limiting, bot filtering, WAF rules, country blocks | Cloudflare Protection, for domains routed through Cloudflare |
| Restrict who can reach the server over SSH/SFTP | Application → Access |
Read here, act there. The value of this tab is that it tells you what to go and block, and gives you the evidence.
2. Fetching
Unlike the Logs tab, this one loads by itself as soon as you open it — there is a view waiting for you rather than an empty state.
| Control | Notes |
|---|---|
| Lines | 50 / 100 / 200 / 500 / 1000 — defaults to 50 |
| Fetch Logs | Runs the read; shows Fetching… |
| Refresh | Re-runs it with the same settings |
| Last fetched | The time of the most recent read |
Newest first. Entries are shown in reverse order, so the most recent request is at the top. This is the opposite of the Logs tab, and it is the right way round here: when you are checking whether something is happening now, you want the latest request first.
Fetching is a snapshot. Nothing updates on its own — press Refresh to see what has happened since.
If it fails, the message names the log type it was trying to read; in practice the cause is an unreachable server or a missing access log rather than anything about log types.
3. What each entry shows
Every parsed line becomes a card:
| Field | What it tells you |
|---|---|
| Status | The HTTP response code, colour-coded |
| Method | GET, POST, HEAD, PUT… |
| Path | What was requested — hover for the full path when truncated |
| IP | Who made the request |
| Timestamp | When |
| User Agent | What client they claimed to be — Unknown when absent |
| Referer | Where they claim to have come from, shown as a link |
Lines that do not match the standard access-log format are shown raw, in grey, rather than being dropped.
Reading the colours
| Colour | Status | What it usually means here |
|---|---|---|
| Green | 2xx | The request succeeded — the visitor got what they asked for |
| Blue | 3xx | A redirect — normal for www/non-www and HTTP→HTTPS |
| Amber | 4xx | The request was refused or the page doesn't exist |
| Red | 5xx | Your application failed, not the visitor |
The amber and red bands mean opposite things. A wall of 4xx is usually someone probing for things you don't have — which is noise unless it succeeds. A 5xx is your own application breaking, and belongs in the Logs tab's error log where the reason will be.
4. Filter badges
Five badges, each with a count:
| Badge | Covers |
|---|---|
| All | Every line fetched |
| Errors | 5xx |
| Warnings | 4xx |
| Info | 2xx |
| Debug | 3xx |
Two behaviours to know:
- Unparsed lines appear only under All. Selecting any specific level hides them, so a malformed or unusual log line can vanish from view. If something you saw disappears when you filter, go back to All.
- The four counts need not add up to All, for the same reason — All counts every line including the ones that could not be parsed.
5. Text search
Filter logs… matches anywhere in the original log line, case-insensitively, and combines with the level badge. ✕ clears it.
Because it searches the raw line, it covers every field at once — IP, path, status, user agent and referer. That makes it the main investigative tool on the page.
What to search for
Signs of scanning — paths you don't have:
| Search | What it finds |
|---|---|
wp-login / wp-admin | WordPress brute-force bots — noise on a WordPress site, pure scanning on anything else |
.env | Attempts to grab your environment file and its credentials |
.git | Attempts to download your repository |
phpmyadmin / adminer | Database admin panel probing |
xmlrpc | A classic WordPress amplification target |
/admin | Generic admin-panel discovery |
Signs of automation — user agents:
| Search | What it finds |
|---|---|
curl / python-requests / Go-http-client | Scripted clients, not browsers |
bot / spider | Crawlers, legitimate and otherwise |
sqlmap / nikto / nmap | Named attack tools that don't hide their identity |
Signs of a specific actor: paste an IP address to see everything one source did, which is how you decide whether it is a scanner, a crawler or a real visitor before blocking it.
6. Reading the tab as a security review
A practical order to work in:
- 1Fetch 1000 lines — anything less is a keyhole.
- 2Check Errors (5xx) first. These are your application failing. If there are any, the reason is in the Logs tab's error log.
- 3Check Warnings (4xx) next, and look at the paths. Scattered 404s across random paths are scanning. Repeated 401 or 403 on a login path is a brute-force attempt.
- 4Search the offending IP to see the full pattern of what it did.
- 5Check whether anything succeeded. A scanner hitting
/.envand getting 404s is noise. A scanner hitting/.envand getting 200 is an incident — that file is being served and its contents are gone. Rotate every credential in it immediately. - 6Act elsewhere — block the IP in the server Firewall, or apply rate limiting and bot rules in Cloudflare Protection.
The judgement that matters
Constant probing is normal and mostly harmless. Any server with a public IP is scanned continuously by automated tools; a log full of 404s for WordPress paths on a Laravel application means the internet is doing what it always does. It is not a reason to panic and not usually a reason to act.
What matters is a 2xx where you did not expect one. The status code is the line between "someone tried" and "someone succeeded", and it is the single most useful thing on this page.
7. Limits worth knowing
- This shows only what reached the web server. Requests blocked by the firewall, or absorbed by Cloudflare before reaching your origin, never appear here. An empty log is not proof of no attacks — it can mean your protection is working.
- It is one application's log, not the server's. Another application on the same server has its own.
- There is no alerting. Nothing here notifies you; you only see it when you look.
- There is no history beyond the log file. Rotation eventually removes old entries, and the tail you fetch is bounded by the Lines setting.
- The tab cannot block anything.
8. Common problems
| Problem | Cause |
|---|---|
| Very few entries on a busy site | Lines is at its default of 50 — raise it |
| Search finds nothing you expected | It only covers the lines fetched, not the whole file |
| An entry disappears when filterin | Unparsed lines show only under All |
| The badge counts don't add up | All includes unparsed lines; the level badges don't |
| Entries look stale | It's a snapshot — press Refresh |
| Fetch fails | The server is unreachable, or the application has no access log yet |
| Nothing but 4xx from strangers | Routine internet scanning — noise, unless one returns 2xx |
| Lots of 5xx | Your application is failing — go to the Logs tab's error log |
| Log is empty but the site has traffic | The vhost may write to a differently named log, or requests are being served from cache/CDN |
| You found an attacker but can't block them | By design — use the server Firewall or Cloudflare |
9. How this relates to other places
| Where | Scope |
|---|---|
| Security (this tab) | Parsed access log for one application — who hit it and what they got |
| Logs tab | The same access log raw, plus error, PHP-FPM, systemd and container logs |
| Server → Firewall | Where you actually block an address or close a port |
| Cloudflare Protection | Edge-level blocking, rate limiting, bot management and WAF |
| Settings tab | Uptime alerts — tells you the site is down, not who took it down |
The natural pairing: Security shows you the address, Firewall stops it.
Something here not matching what you see in the panel?
Tell us