Take a look at Log::Log4perl. This can do a lot of what you need.
A method I've found useful is to use something like Data::UUID to create a unique ID for every message logged. If it's a user error you can get them to copy 'n' paste the ID and you know exactly what they saw.
I may be wrong, but "notices" seem out of place with the other types. It's UI information, not logging information.
I tend to like to log to one place. You can always post-process the messages into another format if you need to. By all means e-mail (or whatever) as well - but having once place you know the messages will be makes things simpler. For example, recovering from a failed logging method is easier. If your e-mail logger fails you only have to log that fact, you don't have to worry about recovering the original message and logging that as well.