The problem is that $-substitution stops when it occurs $(and many other punctuation marks).
To do what you do, do this to read the variable (using a form with one command argument set):
puts [set log_$i]
This compiles exactly in the form of bytecode that you expect.
But...
Do not do this if you can avoid it.
, , , , :
set i 0
set log($i) "blah blah"
puts $log($i)
. , , ( ) :
set i 0
upvar 0 log_$i v
set v "blah blah"
puts $v
upvar - . ( , upvar, , - ).