I would take off the first two fields using then dissect, then use grok with an array of patterns to match each of the message types that you care about.
dissect { mapping => { "message" => "%{someNumber} %{someIP} %{[@metadata][restOfLine]}" }
grok {
match => {
"[@metadata][restOfLine]" => [
"^%{IPV4:anotherIP} '%{NUMBER:anotherNumber}': login ...",
"^Monitor connections: %{NUMBER:connections} free memory: %{NUMBER:freeKB} ..."
]
}
}