Esimi, vi sottopongo uno strano problema in cui mi sono imbattuto di recente, ed al quale non sono certo di aver trovato una soluzione (l'incubo più grande di un programmatore non è NON correggere un bug, ma correggerlo e non capire come ci è riuscito).

Scenario:
- Applicazione J2EE basata su Spring
- Container: Tomcat 6
- Logging dell'applicativo effettuato mediante Log4j 1.2.13

Accade che, in maniera assolutamente non predicibile e non riproducibile sistematicamente (o almeno finora non ci sono mai riuscito), si ottiene una misteriosa NullPointerException nell'implementazione del DAO che accede agli utenti. L'eccezione viene sollevata da una riga di log in uno dei metodi del dato, a causa del fatto che il logger in quel punto (e solo quando si verifica il problema) è misteriosamente null.
Di seguito potete vedere le righe salienti del codice nel DAO.
codice:
public class UserDaoImpl extends SqlMapClientDaoSupport implements UserDao {

	private final Logger logger = Logger.getLogger(UserDaoImpl.class);
        ....
        ....
        ....
       public UserDetails loadUserByUsername(String username)  {
	.....
	logger.debug("originalUsername: " + originalUsername);
        .....
        }
La classe non è stata scritta da me, ma sulla sua costruzione non avrei nulla da eccepire, l'unica cosa "strana" che noto è nella dichiarazione del logger, e cioè il fatto che il campo logger non è stato dichiarato come static (cosa che io normalmente faccio). Il mio "fix" consiste proprio nel dichiarare come static tale campo, ma non ho assolutamente la certezza del fatto che sia risolutivo, sebbene il problema non si sia più presentato infatti, non è detto che non sia un caso.
La documentazione non fa riferimento al fatto che Logger.getLogger possa in alcun caso restituire null, e nemmeno specifica di utilizzare una variabile static per memorizzarne il valore di ritorno.

Le domande in buona sostanza sono essenzialmente due:

1) a qualcuno di voi è mai capitata una stranezza del genere, e cioè che getLogger restituisse null? Per me è in assoluto la prima volta.
2) qualcuno sa indicarmi un valido motivo per dichiarare sempre static la variabile che ospita il logger? Io l'ho sempre fatto, ma si tratta per lo più di una consuetudine acquisita per osservazione di codice altrui, ed alla convinzione che fosse più efficiente utilizzare un logger statico.
Eventualmente apprezzo link a della documentazione autorevole in merito o esperienze pro o contro static.