"how can i parse the redo log and trap the sql that might have caused a bulk row delete? my scenario is, as soon as a bulk row delete happens"
What sort of delete are you talking about ?
A DELETE FROM table WHERE pk IN (1,....50) can delete fifty rows in one statement execution
FORALL i IN 1..50
DELETE FROM table WHERE pk = i;
will have fifty executions, each deleting a single row in one transaction.
FOR i IN 1..50 LOOP
DELETE FROM table WHERE pk = i;
COMMIT;
END LOOP;
will have fifty executions, each deleting a single row in fifty transactions in one session.
So are you looking for deletes of more than 20 rows in a single statement, transaction or session ?
Taking the simplest option. Logically, after each DELETE statement, you'd need to look at the number of rows processed and, if greater than 20, create an audit record.
Technically, the way to execute such a test is to create an AFTER DELETE row level trigger on the table. Any alternative would have exactly the same performance impact as it would need to do exactly the same work.
Transaction or session level limits would be similar, but you'd need the trigger to maintain a count of the number of records deleted (eg in a package level variable).