When you say 1 logger per class, you are referring to the programmatic ILog, which is used to create the log messages. These do in fact need to be predefined, but it is as simple as the approach that Metro Smurf has given, or even simpler if you don't care about defining an ILog that might not be used:
private static ILog logger =
LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
Either of these approaches will configure a logger. Reflection is used to get the classname of the current method, which is then used as the logger name, hence calling the approach "dynamic". This could also be coded as the following (but then the code would be different in each class, and the reflection method makes it easy to do as a snippet).
private static ILog logger = LogManager.GetLogger(typeof(MyCurrentClass));
Per your comment about "put whatever I want", you can very easily do that also when you create the ILog instance (and pardon the pun).
private static ILog logger = LogManager.GetLogger("whatever I want");
The link that you include not only creates an ILog logger, but it creates an appender to go along with it. I would not consider that to be a good practice, since appenders can be more easily configured at runtime in web.config or app.config, and it is normally not necessary to have more than one or two appenders, with all of the logger output going to the appenders.