Thank you. Trying the documented form of Reduce, with "vars" as the 2nd argument, it leaves these forms unevaluated:
In[2]:= Reduce[(a^x)^y == a^(x*y), {}]
Out[2]= a^(x y) == (a^x)^y
In[3]:= Reduce[Log[x] + Log[y] == Log[x*y], {}]
Out[3]= Log[x] == -Log[y] + Log[x y]
On this query, Reduce, has been running for 10 minutes so far, with no result yet:
Reduce[n*Log[x] == Log[x^n], {}]
So Reduce doesn't seem to be generally useful for this type of problem, in my opinion.
In the case where Reduce did provide an answer,
Out[4]= ((a b)^x == 0 && b^x == 0) || (b^x != 0 && a^x == b^-x (a b)^x)
the more general side of the disjunction is
b^x != 0 && a^x == b^-x (a b)^x
which is equivalent by a simple transformation to
b^x != 0 && a^x*b^x == (a b)^x
I suppose in hindsight, I'm looking for a different form of answer, which would more explicitly tell me the ranges required for the variables to make the identity valid. This answer is less explicit, as its form is so close to the original question.