Actually the there is another reason the first 2 do not work.
cat log.txt | grep '[*]'
This says return any line that contain an asterix, ie *. As yuo have none in your log then no lines are returned.
cat log.txt | grep '\[* \]'
This one on the other hand says, return any line that contains zero or more '[' followed by a space and then ']'. Again as this pattern is nowhere in your log, no lines are returned.
Your last entry:
cat log.txt | grep '\[.*\]'
says, return any line that contains '[' followed by zero or more of any character, ie the dot, followed by ']'. Which in your case would be every line as the time portion is between square brackets
on every line.
Lastly I would add that the use of cat is superfluous in all examples. Simply use the form: