Glassfish v2.1 启动正常,但日志不显示



我每次启动glassfish服务器都面临这个问题。服务器启动正常,但由于这个错误,我的记录器输出没有被记录到server.log文件中。这似乎是glassfish 2.1版本中的一个bug。我无法切换到更高版本,因为我正在运行的应用程序不支持更高版本。大多数在线帖子报告了当glassfish从MyEclipse IDE启动时出现此错误,并建议从IDE停止服务器,然后从命令行重新启动它。我总是从终端启动我的服务器,但我得到这个错误。我真的很困惑,如果不查看日志,就无法进行大量调试。谁能建议一个合适的解决方法?

我尝试过的一些事情

  1. 我的日志级别最初是INFO,更改为FINE和SEVERE,但仍然没有效果。
  2. 我把我的日志重定向到一个不同的位置,认为这可能有帮助,但没有用。
  3. 我甚至尝试修改/etc/java-6-openjdk/logging。属性,根据递归后对SystemOutandErrhandler的调用但这也无济于事。

这真的很烦人。非常感谢你的帮助。提前谢谢。

-client
-XX:+UnlockDiagnosticVMOptions
-XX:MaxPermSize=192m
-Xmx512m
-XX:NewRatio=2
-XX:+LogVMOutput
-XX:LogFile=/home/aakanksha/softwares/glassfish/domains/visionael/logs/jvm.log
-cp
/home/aakanksha/softwares/glassfish/lib/jhall.jar:/home/aakanksha/softwares/glassfish/lib/appserv-launch.jar
com.sun.enterprise.server.PELaunch
start
recursive call into SystemOutandErrhandler
java.lang.RuntimeException: recursivecall
    at com.sun.enterprise.server.logging.SystemOutandErrHandler$LoggingByteArrayOutputStream.flush(SystemOutandErrHandler.java:359)
    at java.io.PrintStream.write(PrintStream.java:449)
    at com.sun.enterprise.server.logging.SystemOutandErrHandler$LoggingPrintStream.write(SystemOutandErrHandler.java:293)
    at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:220)
    at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:281)
    at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:124)
    at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:134)
    at java.io.OutputStreamWriter.write(OutputStreamWriter.java:220)
    at java.io.Writer.write(Writer.java:157)
    at java.util.logging.StreamHandler.publish(StreamHandler.java:209)
    at java.util.logging.ConsoleHandler.publish(ConsoleHandler.java:105)
    at java.util.logging.Logger.log(Logger.java:573)
    at java.util.logging.Logger.doLog(Logger.java:598)
    at java.util.logging.Logger.log(Logger.java:621)
    at com.sun.enterprise.server.logging.SystemOutandErrHandler$LoggingByteArrayOutputStream.flush(SystemOutandErrHandler.java:368)
    at java.io.PrintStream.write(PrintStream.java:449)
    at com.sun.enterprise.server.logging.SystemOutandErrHandler$LoggingPrintStream.write(SystemOutandErrHandler.java:293)
    at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:220)
    at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:290)
    at sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:294)
    at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:140)
    at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:229)
    at java.util.logging.StreamHandler.flush(StreamHandler.java:242)
    at java.util.logging.ConsoleHandler.publish(ConsoleHandler.java:106)
    at java.util.logging.Logger.log(Logger.java:573)
    at java.util.logging.Logger.doLog(Logger.java:598)
    at java.util.logging.Logger.log(Logger.java:662)
    at com.sun.enterprise.server.ApplicationServer.printStartupInfo(ApplicationServer.java:618)
    at com.sun.enterprise.server.ApplicationServer.onInitialization(ApplicationServer.java:170)
    at com.sun.enterprise.server.ondemand.OnDemandServer.onInitialization(OnDemandServer.java:103)
    at com.sun.enterprise.server.PEMain.run(PEMain.java:399)
    at com.sun.enterprise.server.PEMain.main(PEMain.java:336)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:622)
    at com.sun.enterprise.server.PELaunch.main(PELaunch.java:415)

从GLASSFISH-6164中列出的解决方案如下:

如果我重置系统。out和System。Err在调用之前指向一个临时文件readConfiguration,不要将它们重置为指向记录器没问题。

当readConfiguration被调用时,你可以创建一个自定义的LogManager来执行这个工作。然后在启动时使用java.util.logging.manager system属性安装自定义LogManager。

public class ConsoleLogManager extends LogManager {
   @Override
   public void readConfiguration() throws IOException, SecurityException {
        final PrintStream out = System.out;
        final PrintStream err = System.err;
        System.setOut(off());
        try {
            System.setErr(off());
            try {
                super.readConfiguration();
            } finally {
                System.setErr(err);
            }
        } finally {
            System.setOut(out);
        }
    }
    @Override
    public void readConfiguration(InputStream ins) throws IOException, SecurityException {
       final PrintStream out = System.out;
       final PrintStream err = System.err;
       System.setOut(off());
       try {
            System.setErr(off());
            try {
                super.readConfiguration(ins);
            } finally {
                System.setErr(err);
            }
        } finally {
            System.setOut(out);
        }
    }
    @Override
    public void reset() throws SecurityException {
        final PrintStream out = System.out;
        final PrintStream err = System.err;
        System.setOut(off());
        try {
            System.setErr(off());
            try {
                super.reset();
            } finally {
                System.setErr(err);
            }
        } finally {
            System.setOut(out);
        }
    }
    private static PrintStream off() {
        return new PrintStream(new ByteArrayOutputStream());
    }
}

另一个解决方法是包装系统。out和System。在打印流中,当检测到重新进入时不做任何事情。您可以使用自定义LogManager来安装它们。

相关内容

  • 没有找到相关文章

最新更新