I disagree completely with your first point. If you need to know on what line an I/O error occured, something is horribly wrong with your error handling. Users must not have to dig into a program to find and address the cause of errors under their control (as opposed to a programming error).
I agree with the other changes, but I didn't want to venture far from the topic until the OP's problem became known. How I write it:
open(my $fh_log, '>>', $qfn_log)
or die(qq{Cannot open log file "$qfn_log": $!\n});