log method
Hands message to JobObserver.onLog as it is.
Nothing happens to it on the way: a listener that wants a line makes one, a listener that wants the object keeps it. A no-op when the job has no observer, so a body logs unconditionally.
Only a message passed unbuilt costs nothing until somebody listens: the object itself, or a closure the observer calls. A string with interpolation is built before this call, observer or not.
ctx.log(() => 'migration failed: $error');
Implementation
@override
void log(Object? message) => _owner._notifyLog(message);