I think you are asking why your expression for f[x,y] returns an immediate result. This is because you used Set (=) rather than SetDelayed (:=).
So you want
In:= f[x_, y_] := (1/(4*Pi))*Log[(x - 20)^2 + y^2]
For your question about limits, you need to take the limit of the limit. Remember that limits do not necessarily commute, depending on the nature of the function at the point in question. So, one example you may execute is, in your particular example,
In:= Limit[Limit[f[x, y], x -> 20], y -> 0]
Which of course is not unexpected ;-)
As for your off topic question, you don't have to limit yourself to numerical data. However be aware that by using a symbolic value for the limiting value of your parameter you may not capture behaviors in particular cases and that you need to analyze the function to see if there are any issues for particular values of that parameter.
In:= Limit[Limit[f[x, y], x -> a], y -> 0]
Out= Log[(-20 + a)^2]/(4 \[Pi])