Surely there are Bashier folks out there than I, but I have just done basically like you do, but do it on every line where the output has to go to the log.
But at the start, I would define the log:
LOG=/path/to/filename.log
then just end each line with "2>&1 | tee $LOG"
Another way, would be to (break the script into a little piece, and a big piece) use the little piece to create (or otherwise determine) the logfile name, then either:
1) export it, and run the second half of the script like ./script 2>&1 | tee $EXPORTED_LOGNAME
or
2) the first part catches/creates the logfile name same as above, but then calls the second half itself, from within, directing (tee'ing) all output to logfilename same as above:
# first script
LOG=/path/to/log.log
# call 2nd script:
/script_no2 2>&1 | tee $LOG
Any use?
Hope it gives you ideas, at least!
Sasha