You should never be writing a async void method, as you can not Await it. And you should always await a async, because otherwise you swallow Exceptions. If you got nothing sensible to return from a function, just return a instance of non-generic Task - and thus it can be awaited.
"Fire and Forget is fine - provided you never actually forget." With several forms of Multitasking, there is this whole issue with swallowing Exceptions. The TPL suffers as badly from it as Multithreading. The execution of a Task can throw exceptions. And those can be fatal ones, wich should never be caught - much less silently swallowed (forgotten). Normally you have to write exceptionally bad try/catch code, but for Multtiasking you have to actively avoid it. Task and Await, are how you avoid it (not actually forget). While async void is a (almost) guaranteed swallowing.
The Task instance carries the Exceptions in a neat list. Wait will re-throw them. No Exception is swallowed due to Multtiasking (you of course still got the otehr ways to mess that part up).
If you got no sensible place to await, you could write a child Task for the sole purpose of looking at and handling it's parents exceptions. But then you would still have to kill the process on Fatal or Boneheaded Excetpions and end up with duplicated Exception handlers. Better to await it all back at the main programm flow, where you hopefully got that global Logging code.