2011-04-08 3 views
4

sortie du journal de mon RemoteServiceServlet (GWT) ne figure pas dans Logfiles ou Stdout lors de l'utilisation getServletContext().log("anything");ServletContext.log() ne vous connecter

Pour l'injection de dépendance J'utilise Google Guice. Pour ma propre sortie de journal, j'utilise slf4j-jdk14. J'ai essayé cela dans Tomcat 6 ainsi que dans Jetty (devmode GWT).

Pour être clair, mon Servlet:

@Singleton 
public class MyServiceServlet extends RemoteServiceServlet implements MyService { 

    private static final Logger log = LoggerFactory.getLogger(MyServiceServlet.class); 
    private final ADependency dep; 

    @Inject 
    public MyServiceServlet(ADependency dep) { 
     getServletContext().log("THIS IS NOT SHOWN IN MY LOGS"); 
     log.error("THIS IS SHOWN IN MY LOGS"); 
     this.dep = dep; 
    } 
} 

Alors, où puis-je trouver la sortie du journal manquant ou où puis-je configurer le ServletContext-Log?

+0

Note: il est très facile de reproduire ceci: il suffit de créer une application GWT avec « mvn archetype : generate ", choisissez" 241: remote -> gwt-maven-plugin ", remplacez le retour dans greetServer (String) par" throw new ... "et démarrez l'application avec" mvn clean install gwt: run ". Le client affiche une erreur, mais il n'y a pas de sortie de journal sur le serveur. –

+0

ok ... Je viens de créer une nouvelle webapp avec juste une servlet et rien d'autre. Je l'ai déployé dans Tomcat et j'ai trouvé la sortie du journal dans localhost.2011-04-09.log. –

+0

java.util.logging, slf4j, log4j, ServletContext.log(), commons.logging, ... Je veux juste voir toutes les erreurs dans un seul fichier! –

Répondre

3

Le comportement de la méthode ServletContext.log est spécifique au conteneur. La méthode que j'ai utilisée pour la rendre cohérente est d'enrouler le ServletConfig passé par init() afin de créer un ServletContext enveloppé qui utilise notre propre logger fourni (Slf4j dans ce cas).

public class Slf4jServletConfigWrapper implements ServletConfig { 
    private final ServletConfig config; 
    private final Logger log; 

    public Slf4jServletConfigWrapper(Logger log, ServletConfig config) { 
    this.log = log; 
    this.config = config; 
    } 

    public ServletContext getServletContext() { 
    return new ServletContext() { 
     public void log(String message, Throwable throwable) { 
     log.info(message, throwable); 
     } 

     public void log(Exception exception, String msg) { 
     log.info(msg, exception); 
     } 

     public void log(String msg) { 
     log.info(msg); 
     } 
... 

Full Slf4jServletConfigWrapper.java code

Dans votre Servlet remplacer la méthode init() pour utiliser l'emballage ServletConfig

public void init(final ServletConfig config) throws ServletException { 
    super.init(new Slf4jServletConfigWrapper(log, config)); 
} 
Questions connexes