2010-12-02 3 views
0

drucken Ich erstelle Servlet auf Tomcat 6.0 in Ubuntu 10.04. Für das Drucken des Protokolls habe ich System.setOut verwendet, um die Ausgabe umzuleiten.wie protokolle in tomcat servlet applikation

System.setOut(new PrintStream(new File("/tmp/new.log"))); 

System.setErr(new PrintStream(new File("/tmp/new.log"))); 

Ich habe diesen Code in doPost() verwenden, aber wenn meine Anwendung laufen dann in der Lage bin ich nicht ausgegeben, das ist zu sehen, warum vorübergehend ich diesen Code in doGet bewegt().

Wenn ich traf url durch Browser http://127.0.0.1:8080/hello/hello ich folgende Fehlermeldung auf Browser

java.security.AccessControlException: access denied (java.io.FilePermission /tmp/new1.log read) 
    java.security.AccessControlContext.checkPermission(AccessControlContext.java:342) 
    java.security.AccessController.checkPermission(AccessController.java:553) 
    java.lang.SecurityManager.checkPermission(SecurityManager.java:549) 
    java.lang.SecurityManager.checkRead(SecurityManager.java:888) 
    java.io.File.exists(File.java:748) 
    HelloWorldExample2.doGet(HelloWorldExample2.java:42) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    sun.reflect.GeneratedMethodAccessor32.invoke(Unknown Source) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    java.lang.reflect.Method.invoke(Method.java:616) 
    org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:269) 
    java.security.AccessController.doPrivileged(Native Method) 
    javax.security.auth.Subject.doAsPrivileged(Subject.java:537) 
    org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:301) 
    org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:162)** 
+0

Es scheint, dass der Benutzer, von dem Sie Server ausführen, keine Schreibberechtigung für/tmp dir –

+0

@ org.life.java hat, Apache Tomcat hat standardmäßig keinen Root-Zugriff auf tmp in Ubuntu. –

+0

Wie vorgeschlagen, warum Sie versuchen Rad neu zu erfinden, gehen Sie für log4j –

Antwort

4

bekommen vorschlagen würde ich nachdrücklich empfohlen, einen Logging-Framework wie log4j, SLF4j oder sogar die Logging-Klassen, die mit Java selbst kommen. Sie erfinden das Rad hier irgendwie neu :)

1

Da einige verschiedene Servlets implementiert werden können und jeder von diesen versuchen könnte, stdout umzuleiten, ist dies einfach nicht etwas, was tomcat Ihnen erlauben kann (um nicht zu erwähnen, dass Streams bereits zur Protokollierung umgeleitet werden, nach catalina.out).

Entweder filtern Sie einfach heraus, was Sie brauchen, aus der Tomcat-Logdatei, oder weisen Sie diese Datenströme einigen statischen Variablen zu, auf die Sie vom Servlet aus zugreifen können. Sie benötigen eine Synchronisierung, obwohl ich denke, dass die I/O-Klassen threadsicher sind. Die Verwendung eines Logging-Frameworks würde Ihnen das Leben erleichtern, je nachdem, wie groß ein Projekt ist (alles größer als ein Servlet mit zwei Methoden).

1

Verwenden Sie slf4j und Logback für Ihre Protokollierungsanforderungen. Sie werden es nicht bereuen, da Sie das Rad nicht neu erfinden möchten + Sie haben eine sehr anpassungsfähige Lösung.

Verwandte Themen