TTechclick ⚡ XP 0% All lessons
F5 · BIG-IP ASM · Logging & iRulesInteractive · L1 / L2 / L3

ASM Logging & iRules Events: Support IDs & ASM_REQUEST_DONE

When a flight goes wrong, investigators don't guess — they pull the black box and read exactly what happened, second by second. Your F5 BIG-IP Advanced WAF (formerly ASM) has the same recorder. A logging profile decides what gets recorded and where it's stored; the Event Logs are the tape; and the support ID is the one number that jumps you straight to the exact blocked request. This lesson shows you how to build that recorder, read it by support ID, and then go further — using ASM iRule events like ASM_REQUEST_DONE to script the WAF's behaviour per request.

📅 2026-06-02 · ⏱ 12 min · 3 live demos · 4 infographics · 🏷 10-Q assessment + AI Tutor inline

⚡ Quick Answer

Log and script F5 BIG-IP Advanced WAF (ASM): build a logging profile (local vs remote — CSV, Splunk key-value, ArcSight CEF), read Event Logs by support ID, and use ASM iRule events (ASM_REQUEST_DONE, ASM_REQUEST_VIOLATION, ASM_RESPONSE_VIOLATION) with ASM::support_id, ASM::violation and ASM::unblock to customise WAF behaviour. 12 min.

🎯 By the end you will be able to

Read as:

Pick where you want to start

1

Logging Profiles

Where events go (local vs remote) and which requests are logged. The recorder's settings.

2

Trace by Support ID

Read the Event Logs and jump to the exact blocked request from the one number on the block page.

3

ASM iRule Events

ASM_REQUEST_DONE vs the legacy ASM_REQUEST_VIOLATION, plus ASM_RESPONSE_VIOLATION.

4

ASM Commands

ASM::support_id, ASM::violation, ASM::unblock, ASM::raise — and the ASM::disable trap.

🧠 Warm-up — 3 questions, no score

Just notice which ones make you pause. We answer all three inside the lesson.

1. A user says "I got blocked". What single value lets you find their exact request in the logs?

Answered in Path 2 — Trace by Support ID. (Spoiler: it's the support ID.)

2. Your SIEM is Splunk. Which remote storage format do you pick in the logging profile?

Answered in Path 1 — Logging Profiles. Splunk = key-value.

3. You're writing a NEW iRule that runs after every request. Which ASM event do you use?

Answered in Path 3 — ASM iRule Events. New iRules use ASM_REQUEST_DONE.

Most engineers think…

"The WAF blocked it — case closed. Logging is just noise for compliance."

Wrong — and that one belief is why so many WAF incidents take hours instead of minutes. When a real customer is wrongly blocked at 2pm on launch day, "the WAF blocked it" is the start of the investigation, not the end. Without a logging profile sending events somewhere you can read them, you're blind. With one — and the support ID from the block page — you open the exact request, see every violation and the matched signature, and fix the right thing in two minutes. And once you can read the WAF, ASM iRules let you script it: log custom fields, allow a trusted source, or raise your own violation. This lesson turns the WAF from a black box into a black-box recorder you can read and program.

① Logging profiles — the WAF's recorder settings

Think of a CCTV system. The camera (the WAF) sees everything, but whether anything is recorded, and where the tape is stored, is a separate setting. In Advanced WAF that setting is the logging profile. It answers two questions: which requests to log, and where to store them.

You build it at Security ▸ Event Logs ▸ Logging Profiles ▸ Create, enable Application Security, and then choose the destination. The two big choices:

For remote storage you also pick the format so the receiving system can parse the fields. There are three you must know for the 303 exam: CSV for a generic syslog server, key-value pairs for a reporting server like Splunk, and CEF for an ArcSight server. Finally, Request Type decides volume: Illegal requests only (the default — just the blocks/alarms) or All Requests (everything, huge volume, use only while tuning).

👉 So far: a logging profile = which requests (illegal vs all) + where (local vs remote) + which format (CSV/key-value/CEF). Next, see the whole logging pipeline at a glance.
Figure 1 — The ASM logging pipeline: from request to readable event
A left-to-right pipeline. Untrusted client traffic enters the BIG-IP virtual server, which runs the security policy and the attached logging profile. The logging profile decides which requests to log (illegal only or all) and the destination. From there one branch writes to local storage read in the GUI Event Logs, and another branch sends events over remote high-speed logging in CSV, key-value or CEF format to a syslog or SIEM pool such as Splunk or ArcSight. A lime aha note states that the support ID is the key that links the block page, the event log and the iRule together. The logging profile decides what's recorded — and where the tape is stored Untrusted / attack Trusted / inspected Decision / config The "aha" Request user or attacker 203.0.113.7 BIG-IP virtual server Security Policy + Logging Profile assigns a support ID per transaction Request Type: illegal-only / all Logging profile Storage Destination? Local • Remote Local Storage read in GUI Event Logs lab / low traffic only Remote HSL CSV → syslog key-value → Splunk CEF → ArcSight SIEM pool correlate + alert The aha: the SUPPORT ID is the key — it links the block page, the event log, and the iRule into one story. block page shows it · Event Logs search it · iRule reads it with ASM::support_id Golden rule: production logs go REMOTE (HSL → SIEM), not to local disk. Local storage on a busy box competes for disk + CPU and is lost on reboot — keep it for labs.
One profile, two destinations. Local for labs, remote high-speed logging for production — and the support ID threads through all of it.

Sneha at Infosys faces this

Sneha's new WAF blocked a partner's API call during a demo. She opens the GUI to investigate — and the Event Logs are empty. Nothing was recorded.

Likely cause

No logging profile is attached to the virtual server, so the WAF blocked but recorded nothing. A policy without a logging profile is a camera with no recorder.

Diagnosis

Check the virtual server's security settings for an attached Log Profile.

Local Traffic ▸ Virtual Servers ▸ vs_partner_api ▸ Security ▸ Policies ▸ Log Profile
Fix

Create a profile at Security ▸ Event Logs ▸ Logging Profiles, enable Application Security, set Request Type = All Requests while she debugs, attach it to the VS, and re-run the call.

Verify

Re-trigger the partner call. It now appears under Security ▸ Event Logs ▸ Application ▸ Requests with a support ID she can open. She later flips Request Type back to Illegal requests only for steady-state.

▶ Watch a request become a readable event — then watch the no-profile mistake

Rahul at TCS attaches a logging profile. Press Play for the recorded flow, then Break it to see what happens with no profile attached.

① REQUESTA request hits the virtual server; ASM assigns it a support ID
② POLICYThe security policy evaluates it — say it triggers an illegal violation
③ PROFILEThe attached logging profile records it (Request Type matches) and routes it
④ READYou open it by support ID in Event Logs (local) or in the SIEM (remote)
Press Play to step through a recorded request. Then press Break it.
Recreated screen — the logging profile you build
🖥️ This is the screen you'll use — Security ▸ Event Logs ▸ Logging Profiles ▸ Create. (Recreated for clarity — your BIG-IP TMUI matches this.)
https://bigip-mgmt.corp.local/tmui · Security ▸ Event Logs ▸ Logging Profiles
Overview
Application Security
Event Logs
Logging Profiles
Application ▸ Requests
Network Firewall
DoS Protection
Security » Event Logs » Logging Profiles » New Logging Profile…
Profile Namelp_remote_splunk
Application SecurityEnabled ✓1
Storage DestinationRemote Storage2
Logging FormatKey-Value Pairs (Splunk)3
Server Addresses10.20.30.40 : 514 (pool_splunk)
Request TypeIllegal requests only
Finished
turn on Application Security · Remote Storage for production · match the format to your SIEM — key-value for Splunk, CEF for ArcSight, CSV for plain syslog.
Quick check · Q1 of 10

A new policy blocks a request, but the Event Logs are completely empty. What's the most likely cause?

Correct: b. Blocking and logging are separate. The policy decides whether to block; the attached logging profile decides whether (and where) the event is recorded. No profile on the virtual server = a camera with no recorder. Attach one at Security ▸ Event Logs ▸ Logging Profiles and bind it under the VS Security ▸ Policies.

Pause & Predict

Your SOC runs ArcSight. A teammate sets the logging profile's remote format to Key-Value Pairs because "that's what we used at the last job". What breaks, and what should it be? Type your guess.

Answer: ArcSight expects CEF (Common Event Format — the pipe-delimited CEF:Version|Vendor|Product|… structure). Feeding it key-value pairs means ArcSight can't parse the fields, so dashboards and correlation rules go blank. Key-value is the Splunk format; CSV is for a plain syslog server. Match the format to the SIEM — that's the whole point of the format setting.

② Trace a block by its support ID

This is the skill that makes you the person the team calls during an incident. A user is blocked. Instead of guessing, you ask them one thing: "what's the support ID on the block page?"

Every blocking response page Advanced WAF returns prints a support ID — a long unique number. You take it to Security ▸ Event Logs ▸ Application ▸ Requests, paste it into the search, and the WAF opens that exact request: the violations it triggered, the matched attack signature, the parameter and value, the source IP, and the full request data. No log-diving, no time filters — one number, one request.

From there the decision is the same tuning judgement you already know: if it's a legitimate request wrongly blocked, you accept the suggestion or relax the entity; if it's a real attack, you confirm the block is correct and move on. The support ID is what turns "somewhere in millions of log lines" into "this one row".

Pro tip — the support ID also lives in an iRule

The same value you paste into Event Logs is available in TCL as ASM::support_id. So you can write an iRule that logs the support ID to a custom remote target, injects it into a response header for your app team, or correlates it with an upstream request ID. One identifier, GUI and script — that's why the 303 exam keeps coming back to it.

👉 So far: block page → support ID → Event Logs → the exact request. Next, see the trace as a clean linear flow.
Figure 2 — Tracing one block, end to end, by support ID
A linear left-to-right flow of five steps. First, a user is blocked and the response page shows a support ID. Second, the user reports that support ID to the engineer. Third, the engineer pastes it into Security, Event Logs, Application, Requests. Fourth, the WAF opens that exact transaction showing the violation, matched signature, parameter and source IP. Fifth, the engineer decides: accept the suggestion if it is a legitimate false positive, or confirm the block if it is a real attack. A lime aha note states that the same support ID is available in an iRule as the ASM support_id command. One number turns "somewhere in the logs" into "this exact request" Blocked / untrusted Engineer action Decision The "aha" ① Block page "Request blocked" Support ID: 184...77 ② User reports "here's the ID" ③ Event Logs search Application ▸ Requests paste support ID ④ The exact request opens violation · matched signature parameter · value · source IP full request data Legit? → Accept / relax false positive fixed Attack? → confirm block The aha: the same support ID is readable in an iRule as ASM::support_id — GUI and script, one number. log it, inject it into a response header, or correlate it with an upstream request ID
Five steps, one identifier. The support ID is the thread that runs from the block page to the exact log row — and into your iRules.
Recreated screen — the request you open by support ID
🖥️ This is the screen you'll use — Security ▸ Event Logs ▸ Application ▸ Requests, searched by support ID. (Recreated for clarity — your BIG-IP TMUI matches this.)
https://bigip-mgmt.corp.local/tmui · Security ▸ Event Logs ▸ Application ▸ Requests
Overview
Event Logs
Logging Profiles
Application ▸ Requests
Application ▸ Reporting
Network Firewall
Security » Event Logs » Application » Requests   — filter: support ID
Search · Support ID184467440737095516071
Result · StatusBlocked
ViolationIllegal meta character in parameter2
Attack SignatureSQL-INJ "UNION SELECT" (id 200001234)
Parameter / Valueid = 7' UNION SELECT ...
Source IP203.0.113.73
Confirm block (real attack)
paste the support ID from the block page · read the violation + matched signature · the source IP — here rating-5 SQLi, so the block is correct, no tuning needed.

The four log surfaces — tap to flip

📋
Application ▸ Requests
tap to flip

The per-request log. Search by support ID to open one transaction with all its violations, the matched signature, parameter, value and source IP. Your incident starting point.

📊
Application ▸ Reporting
tap to flip

Aggregated charts — top violations, top URLs, top attacking IPs over time. Use it to spot trends and campaigns, not single requests.

🗄️
Logging Profiles
tap to flip

The recorder settings: which requests (illegal vs all) and where they go (local vs remote: CSV / key-value / CEF). Attach to the virtual server to take effect.

🧾
SIEM (remote)
tap to flip

Where production events really live — Splunk (key-value), ArcSight (CEF) or a syslog server (CSV). Correlation, alerting and long retention happen here, off the BIG-IP.

Attack Signatures (#3) False-Positive Tuning (#10) F5 WAF Simulator
Quick check · Q2 of 10

A customer says "I was blocked at 3:14pm". What's the fastest way to open their exact request?

Correct: c. The support ID is unique per transaction and is printed on the block page. Searching it opens that one request with every violation, the matched signature, the parameter/value and the source IP — no scrolling or time-guessing. The same value is ASM::support_id in an iRule.

Pause & Predict

During an attack, your BIG-IP's disk fills up and logging stops. The profile is set to Local Storage with Request Type = All Requests. Name the two changes that fix it. Type your guess.

Answer: (1) Switch Storage Destination to Remote high-speed logging so events leave the box for a SIEM pool instead of filling local disk. (2) Set Request Type back to Illegal requests only for steady-state — "All Requests" is a tuning setting, not a production one. Local + All-Requests on a busy box is exactly how disk fills mid-attack.

③ ASM iRule events — ASM_REQUEST_DONE and friends

Reading the WAF is half the power. The other half is scripting it. iRules let you run custom logic at specific moments in a transaction. ASM adds its own set of events — moments that fire when the security policy has something to say.

There are three ASM events you must know:

The reason ASM_REQUEST_DONE won is that it runs once, predictably, at the end of request processing — so inside it you can read ASM::status (did it block?), ASM::violation (what fired?) and ASM::support_id (which transaction?) in one place, for every request, and decide what to do. The old violation-only event couldn't see the clean requests at all.

Common mistake — using the legacy event in new iRules

Symptom you'll see: a junior writes a new logging iRule on ASM_REQUEST_VIOLATION, and it never logs clean traffic — only blocks — so their "log every request" requirement silently fails. Cause: the violation event only fires on violations. Fix: use ASM_REQUEST_DONE and branch on ASM::status. The legacy event exists only so old iRules keep working — F5 explicitly says new iRules should use ASM_REQUEST_DONE.

👉 So far: three ASM events — ASM_REQUEST_DONE (modern, every request), ASM_REQUEST_VIOLATION (legacy, violations only), ASM_RESPONSE_VIOLATION (responses). Next, a side-by-side so the choice is obvious.
Figure 3 — ASM_REQUEST_DONE vs ASM_REQUEST_VIOLATION vs ASM_RESPONSE_VIOLATION
Three columns compare ASM_REQUEST_DONE, ASM_REQUEST_VIOLATION and ASM_RESPONSE_VIOLATION across when each fires, what it sees, and whether to use it in new iRules. ASM_REQUEST_DONE fires after every request whether or not there was a violation, sees clean and violating requests, and is the recommended choice for new iRules. ASM_REQUEST_VIOLATION fires only on a request violation, sees only violating requests, and is legacy kept for backward compatibility. ASM_RESPONSE_VIOLATION fires on a response violation such as data leakage and is used for outbound checks. A lime aha note states that new iRules use ASM_REQUEST_DONE and branch on the ASM status command. Three events, one obvious choice for new work When it fires What it sees Use in new iRules? ASM_REQUEST_ DONE ASM_REQUEST_ VIOLATION ASM_RESPONSE_ VIOLATION after EVERY request only on a violation on a response violation (server → client) clean AND violating + status, support_id only violating requests outbound leaks, DataGuard matches ✓ YES — the default ✗ legacy only backward compat when checking responses The aha: new iRules use ASM_REQUEST_DONE and branch on ASM::status — it sees every request, not just the blocks. ASM_REQUEST_VIOLATION is kept only so old iRules keep running Enable application-security iRule events in the policy if you raise user-defined violations. Policy Building / Learning and Blocking settings → user-defined violations need Alarm/Block flags set.
Pick the column you need. For "do something after each request", it's always the green one — ASM_REQUEST_DONE.

Karthik at Wipro faces this

Karthik must inject the WAF support ID into a response header so the app team can correlate WAF blocks with their own request IDs. He writes it on ASM_REQUEST_VIOLATION and it only works for blocked requests, not clean ones.

Likely cause

The legacy event fires only on violations. Clean requests never reach his header-injection logic, so the app team can't correlate the majority of traffic.

Diagnosis

Confirm which event the iRule is bound to and what fires it.

Local Traffic ▸ iRules ▸ irule_asm_supportid_header — event ASM_REQUEST_VIOLATION
Fix

Move the logic to ASM_REQUEST_DONE, capture set sid [ASM::support_id], and set the header in HTTP_RESPONSE. Now every request — clean or blocked — carries the ID.

Verify

Send a clean request and a blocked one. Both responses now carry X-WAF-Support-ID; the app team's traces line up with the WAF Event Logs by that value.

The iRule (real, copy-pasteable)

iRule — log + stamp the support ID on every request (modern event)
when ASM_REQUEST_DONE {
    # runs after EVERY request — clean or violating
    set sid [ASM::support_id]
    set st  [ASM::status]
    if { $st ne "" } {
        # a violation fired — record what and from where
        log local0. "WAF status=$st support_id=$sid \
client=[ASM::client_ip] severity=[ASM::severity] \
violations=[ASM::violation names]"
    }
    # stash for the response stage
    set ::sid_for_resp $sid
}
when HTTP_RESPONSE {
    HTTP::header insert "X-WAF-Support-ID" $::sid_for_resp
}
Expected output — /var/log/ltm when a SQLi request is blocked
Jun  2 14:07:31 bigip1 info tmm[12044]: Rule /Common/irule_asm_supportid :
  WAF status=blocked support_id=18446744073709551607
  client=203.0.113.7 severity=critical
  violations=VIOL_ATTACK_SIGNATURE
# and on the app side, the response now carries:
X-WAF-Support-ID: 18446744073709551607
Quick check · Q3 of 10

You're writing a new iRule that must run after every request (clean or blocked) to log a custom field. Which event do you bind it to?

Correct: a. ASM_REQUEST_DONE fires after ASM finishes processing each request, violation or not, so it sees clean traffic too — exactly what "after every request" needs. F5 made it the replacement for ASM_REQUEST_VIOLATION (legacy, violations only). ASM_RESPONSE_VIOLATION is for outbound response checks.

Pause & Predict

An iRule calls ASM::raise my_custom_violation on a suspicious request, but nothing ever alarms or blocks. The command runs without error. What's missing in the policy? Type your guess.

Answer: ASM::raise only signals a user-defined violation — whether it alarms or blocks is still decided by the policy. You must (1) create the user-defined violation and set its Alarm/Block flags, and (2) enable application-security iRule events in the policy. Without those, the raise is heard but the policy does nothing with it. The iRule proposes; the policy disposes.

④ ASM iRule commands — read, allow, raise (and the disable trap)

Inside those events you call ASM commands. Here are the ones the 303 exam and real production both lean on:

Common mistake — using ASM::disable as a performance hack

Symptom you'll see: someone scripts ASM::disable broadly "to speed things up", and weeks later an attack walks straight through on those connections — the WAF was off. Cause: ASM::disable turns off WAF processing for that connection entirely. Fix: only use it on a specific, documented, trusted path (e.g. an internal health-check URL), never as a blanket switch on customer-facing traffic. Same discipline for ASM::unblock — surgical, logged, justified.

👉 So far: read with support_id / violation / status, allow with unblock, signal with raise, and never blanket-disable. Next, the one-glance cheat-sheet.
Figure 4 — ASM logging & iRules cheat-sheet (one glance)
A cheat-sheet card with three grouped panels. The logging panel lists the menu path Security, Event Logs, Logging Profiles, the local versus remote choice, the three remote formats CSV for syslog, key-value for Splunk and CEF for ArcSight, and the request type illegal-only versus all. The events panel lists ASM_REQUEST_DONE as the modern hook, ASM_REQUEST_VIOLATION as legacy, and ASM_RESPONSE_VIOLATION for responses. The commands panel lists ASM support_id, violation, status, client_ip, severity, unblock, raise and disable with one-line meanings. A lime aha note ties them together via the support ID. Everything on one card — log it, read it, script it 🗄️ Logging profile Path: Security ▸ Event Logs ▸ Logging Profiles ▸ Create Storage: Local → GUI Event Logs (lab) Remote → HSL → SIEM (prod) Remote format: CSV → plain syslog Key-value → Splunk CEF → ArcSight Request Type: Illegal only (steady-state) All Requests (tuning only) Attach to the virtual server! ⚡ Events ASM_REQUEST_DONE every request · MODERN · use this ASM_REQUEST_VIOLATION violations only · LEGACY · avoid ASM_RESPONSE_VIOLATION response leaks · DataGuard Inside the event you can read: ASM::status — did it block? ASM::violation — what fired ASM::support_id — which txn enable iRule events for ASM::raise 🛠 Commands ASM::support_idASM::violation ASM::statusASM::client_ip ASM::severityASM::unblock ASM::raiseASM::disable txn's support IDviolations + detail did it block?real client IP overall severitysurgical allow user-defined violoff (careful!) Never blanket ASM::disable it turns the WAF OFF for that connection The aha: one support ID stitches the block page → Event Logs → SIEM → your iRule into a single story. log it, read it, allow it, raise it — that's the whole WAF observability + scripting toolkit
Screenshot this one before the 303. Logging on the left, events in the middle, commands on the right — and the support ID running through all three.
Quick check · Q4 of 10

A health-check from a trusted internal monitor keeps tripping a blocking violation. You want only that request to pass while every other check stays enforced. Which command fits?

Correct: d. ASM::unblock overrides the blocking action for a request that had a blocking violation — used surgically (matched on the trusted source/URL) it lets that one request through while the rest of the policy keeps blocking. ASM::disable (a) would turn the WAF off entirely for the connection — far too broad.

Stuck? Ask the lesson tutor

Scoped to this blog only — logging profiles, support IDs, ASM events & commands. Tap a question.

Powered by the Techclick lesson tutor · answers grounded in this blog. For anything else, use the main chat at chat.techclick.in.

📝 Wrap-up assessment — six more

You've answered 4 inline. Six left. 70% (7 of 10) marks the lesson complete on your profile. Tap Submit all answers at the end.

Q5 · Remember

A logging profile's Storage Destination can be Local or Remote. Which remote format does an ArcSight SIEM expect?

Correct: b. ArcSight uses CEF (the pipe-delimited CEF:Version|Vendor|Product|… structure). Key-value pairs are the Splunk/Reporting-Server format; CSV is for a generic syslog server. Match the format to the SIEM or the fields won't parse.
Q6 · Apply

Sneha needs to log every request (not just blocked ones) for two days while she tunes a new app. Which logging-profile setting does she change?

Correct: a. Request Type = All Requests logs clean and illegal traffic — exactly what tuning needs. It's high-volume, so she switches back to Illegal-requests-only for steady-state to protect disk/SIEM cost. Enforcement Mode (b) is a policy setting, unrelated to log volume.
Q7 · Analyze

A "log every request" iRule on a new app only ever logs blocked requests, never clean ones. The iRule is bound to ASM_REQUEST_VIOLATION. Root cause?

Correct: c. The legacy violation event only fires when a request violated the policy, so clean traffic never triggers the iRule. ASM_REQUEST_DONE fires after every request — bind to it and branch on ASM::status to handle both. (Clean requests do get a support ID — d is wrong.)
Q8 · Analyze

An on-call engineer can't find a user's blocked request in millions of log lines. The user still has the block-page open. What's the one value to ask for?

Correct: b. The support ID is unique per transaction and is printed on the block page; searching it opens that exact request with all violations, the matched signature, parameter, value and source IP — no scrolling. The same value is ASM::support_id in an iRule.
Q9 · Evaluate

On a busy production app, a team proposes Local Storage logging with Request Type = All Requests "so we have everything on the box". Sound design?

Correct: c. Local storage on a busy box competes for disk/CPU and is lost on reboot; "All Requests" multiplies the volume and can fill the disk mid-attack. Production design = remote HSL to a SIEM pool + Illegal-requests-only steady-state. Disabling logging (d) leaves you blind — the opposite extreme.
Q10 · Evaluate

To "make the app faster", a developer asks you to script ASM::disable on every request to a customer-facing checkout. Right call?

Correct: d. ASM::disable stops WAF plugin processing on that connection — blanket-applying it to checkout removes protection from the most attacked page you have. It's not a logging toggle (a is wrong). Use it only on a narrow, trusted, documented exclusion (e.g. an internal monitor URL), with a justification you can defend.
Lesson complete — saved to your profile.
Almost! You need 70% (7 of 10) — re-read the path that tripped you up and tap "Try again".

🧠 In your own words

Type one line: why does F5 tell you to use ASM_REQUEST_DONE instead of ASM_REQUEST_VIOLATION in new iRules? Then compare to the expert version.

Expert version: ASM_REQUEST_VIOLATION fires only when a request violated the policy, so it never sees clean traffic — it's kept only for backward compatibility. ASM_REQUEST_DONE fires after ASM finishes processing every request, violation or not, so in one predictable place you can read ASM::status, ASM::violation and ASM::support_id and decide what to do for any request. That's why F5 made it the modern replacement. If your answer mentioned "DONE runs on every request, VIOLATION only on blocks", you've got it.

🗣 Teach a friend

Best way to lock it in — explain it in one line to a teammate. Tap to generate a paste-ready summary.

📖 Glossary

Logging profile
A reusable object (Security ▸ Event Logs ▸ Logging Profiles) that decides which requests are logged (illegal-only or all) and where they go (local storage or remote high-speed logging). Attach it to the virtual server to take effect.
Local Storage
Logging destination that keeps events on the BIG-IP, viewable in the GUI Event Logs. Fine for labs/low traffic; competes for disk and is lost on reboot on busy boxes.
Remote high-speed logging (HSL)
F5's low-overhead mechanism for forwarding log messages off-box to an external syslog/SIEM pool — the production logging answer.
CSV / Key-value / CEF
The three remote storage formats. CSV = generic syslog; Key-value pairs = Reporting Server / Splunk; CEF (Common Event Format) = ArcSight. Match the format to the SIEM.
Request Type
The logging-profile setting choosing All Requests (high volume — tuning) or Illegal requests only (default — steady-state).
Support ID
A unique identifier ASM stamps on each transaction and prints on the block page. Search it in Security ▸ Event Logs ▸ Application ▸ Requests to open the exact request. In an iRule it's ASM::support_id.
ASM_REQUEST_DONE
iRule event that fires after ASM finishes processing every request, violation or not — the modern, all-purpose ASM hook, replacing ASM_REQUEST_VIOLATION.
ASM_REQUEST_VIOLATION
Legacy iRule event that fires only when a request violated the policy. Kept for backward compatibility; not for new iRules.
ASM_RESPONSE_VIOLATION
iRule event that fires when a response (server → client) violates the policy, e.g. data-leakage / DataGuard matches.
ASM::unblock
iRule command that overrides the blocking action for a request that had a blocking violation — a surgical, logged allow, not a way to disable the WAF.
ASM::raise
iRule command that issues a user-defined violation on the present request. Whether it alarms/blocks depends on the policy's flags and enabled iRule events.
ASM::disable / ASM::enable
Turn WAF plugin processing off/on for the connection. Use disable only on a specific, trusted, documented path — never as a blanket performance hack.

📚 Sources

  1. F5 BIG-IP 17.5.0 Documentation — Logging Application Security Events (creating logging profiles, local vs remote storage, CSV / key-value / CEF formats, Request Type illegal-vs-all, viewing local events, attaching to the virtual server). techdocs.f5.com/en-us/bigip-17-5-0/big-ip-asm-implementations/logging-application-security-events.html
  2. F5 clouddocs — iRules ASM namespace (events ASM_REQUEST_DONE, ASM_REQUEST_VIOLATION, ASM_RESPONSE_VIOLATION; commands ASM::support_id, ASM::violation, ASM::violation_data, ASM::status, ASM::client_ip, ASM::severity, ASM::unblock, ASM::raise, ASM::disable, ASM::enable). clouddocs.f5.com/api/irules/ASM.html
  3. F5 clouddocs — ASM_REQUEST_DONE event reference ("triggered after ASM finished processing the request and found all violations"; modern replacement for ASM_REQUEST_VIOLATION). clouddocs.f5.com/api/irules/ASM_REQUEST_DONE.html
  4. F5 KB — K37655278: BIG-IP ASM event logging + K23041827: An iRule that uses ASM violation details (support ID lookup, violation data in iRules, custom logging patterns). my.f5.com
  5. F5 Agility iRules Labs — Class 2 / Module 1 / Lab 2: ASM Hooks (hands-on ASM_REQUEST_DONE, reading ASM::violation and ASM::support_id, enabling application-security iRule events). f5-agility-labs-irules.readthedocs.io
  6. F5 Certification — 303 — BIG-IP ASM Specialist Exam Blueprint (logging configuration, event analysis, iRules objectives). education.f5.com/exams/big-ip-asm-specialist-303
  7. Reddit r/f5networks + DevCentral community.f5.com — practitioner threads on remote logging to Splunk (key-value) vs ArcSight (CEF), tracing blocks by support ID, and ASM_REQUEST_DONE vs the legacy violation event. reddit.com/r/f5networks · community.f5.com

What's next?

You can now turn the WAF into a recorder you read and program: build a logging profile, route events local or remote in the right format, trace any block by its support ID, and script ASM with ASM_REQUEST_DONE and the ASM commands. Tie it back to tuning — when a support-ID trace shows a false positive, you already know how to fix it. Prove it on the simulator and the 303 mock.