我每次启动glassfish服务器都面临这个问题。服务器启动正常,但由于这个错误,我的记录器输出没有被记录到server.log文件中。这似乎是glassfish 2.1版本中的一个bug。我无法切换到更高版本,因为我正在运行的应用程序不支持更高版本。大多数在线帖子报告了当glassfish从MyEclipse IDE启动时出现此错误,并建议从IDE停止服务器,然后从命令行重新启动它。我总是从终端启动我的服务器,但我得到这个错误。我真的很困惑,如果不查看日志,就无法进行大量调试。谁能建议一个合适的解决方法?
我尝试过的一些事情
- 我的日志级别最初是INFO,更改为FINE和SEVERE,但仍然没有效果。
- 我把我的日志重定向到一个不同的位置,认为这可能有帮助,但没有用。
- 我甚至尝试修改/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来安装它们。