To add to Chris King's suggestion on save, I wrote a reusable closure:
Closure saveClosure = { domainObj ->
if(domainObj.save())
println "Domain Object $domainObj Saved"
else
{
println "Errors Found During Save of $domainObj!"
println domainObj.errors.allErrors.each {
println it.defaultMessage
}
}
}
Then you can just use it everywhere and it will take care of error reporting:
def book = new Book(authorName:"Mark Twain")
saveClosure(book)
Additionally, I use the debug plugin - it allows extra logging, and I added tag to the bottom of my main - that gives me a view of all the variables in session / request.
Runtime Logging plugin allows to enable logging at runtime.
While writing this answer, P6SPY plugin also seems like it could be useful - it logs all statements your app makes against the database by acting as a proxy.
Grails Console is also useful. I use it to interactively poke around and experiment with some code, which also comes in handy during debugging.
And of course, being able to step through Debugger is sweet. I switched to IntelliJ IDEA since it has the best Grails / Groovy support.