LOG4J与JBOSS&Java程序冲突
我有一个从使用 log4j (滚动文件和控制台附加程序)的 jar 启动的 java 服务器。单独:没问题,它可以工作。 我有一个使用 log4j 的 JBoss 服务器(默认安装)。单独运行时一切正常。
当我首先启动 Java 服务器和 JBoss 时,也没有问题。
然而,当首先启动 JBoss 然后启动 java 服务器时,最后一个不会记录任何内容,JBoss 向我发送了以下内容: 错误 [ServerThread] 无法初始化
java.io.EOFException
at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2297)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2766)
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:797)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:297)
at org.jboss.invocation.pooled.interfaces.OptimizedObjectInputStream.<init>(OptimizedObjectInputStream.java:147)
at org.jboss.invocation.pooled.server.ServerThread.dorun(ServerThread.java:265)
at org.jboss.invocation.pooled.server.ServerThread.run(ServerThread.java:156)
log4j:WARN Detected problem with connection: java.net.SocketException: Broken pipe
使用 LOG4J 的两个服务器之间是否可能存在冲突?我在网上没有找到任何东西。
谢谢
ADDENDUM
- JBoss 和 Java 服务器位于不同的目录中
- JBoss 和 Java 服务器不共享任何端口 (8080/8433--> JBoss 和 20400-->Java)
- JBoss 和 Java服务器在自己的库文件夹中有自己的log4jxxxx.jar
- Java Log4j版本:log4j-1.2.16.jar(我也尝试过1.2.17)
- JBoss版本:jboss-5.1.0.GA
- 两者都写在不同的文件中
这是配置文件:(基本上仅限控制台和附加文件)
Java
<!-- mocutil import -->
<appender name="mocutilImport" class="org.apache.log4j.RollingFileAppender">
<param name="Threshold" value="INFO" />
<param name="File" value="log/mocutilImport.log" />
<param name="MaxFileSize" value="5000KB" />
<!-- Keep five backup file -->
<param name="MaxBackupIndex" value="5"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p - %m%n" />
</layout>
</appender>
<appender name="NectarMotrServer" class="org.apache.log4j.RollingFileAppender">
<param name="Threshold" value="INFO" />
<param name="File" value="log/NectarMotrServer.log" />
<param name="MaxFileSize" value="5000KB" />
<!-- Keep five backup file -->
<param name="MaxBackupIndex" value="5"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p - %m%n" />
</layout>
</appender>
<appender name="NectarMotrServerDev" class="org.apache.log4j.RollingFileAppender">
<param name="Threshold" value="DEBUG" />
<param name="File" value="log/NectarMotrServerDev.log" />
<param name="MaxFileSize" value="5000KB" />
<!-- Keep five backup file -->
<param name="MaxBackupIndex" value="5"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %c{1} [%t] %p - %m%n" />
</layout>
</appender>
<!-- Default -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Threshold" value="TRACE" />
<param name="Target" value="System.out"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d] %c{1} - %m%n" />
</layout>
</appender>
<category name="fr.edf.nectar">
<appender-ref ref="NectarmotrServer"/>
<appender-ref ref="NectarmotrServerDev"/>
<appender-ref ref="console"/>
</category>
<category name="fr.edf.nectar.interfaces.motr.imports.mocutil">
<appender-ref ref="mocutilImport"/>
</category>
<root>
<priority value="ALL"/>
</root>
JBOSS(我删除了注释附加器)
<!-- ======================= -->
<!-- Setup the Root category -->
<!-- ======================= -->
<appender name="FILE" class="org.jboss.logging.appender.DailyRollingFileAppender">
<errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
<param name="File" value="${jboss.server.log.dir}/server.log"/>
<param name="Append" value="true"/>
<!-- In AS 5.0.x the server log threshold was set by a system
property. In 5.1 and later we are instead using the system
property to set the priority on the root logger (see <root/> below)
<param name="Threshold" value="${jboss.server.log.threshold}"/>
-->
<!-- Rollover at midnight each day -->
<param name="DatePattern" value="'.'yyyy-MM-dd"/>
<!-- Rollover at the top of each hour
<param name="DatePattern" value="'.'yyyy-MM-dd-HH"/>
-->
<layout class="org.apache.log4j.PatternLayout">
<!-- The default pattern: Date Priority [Category] (Thread) Message\n -->
<param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n"/>
<!-- The full pattern: Date MS Priority [Category] (Thread:NDC) Message\n
<param name="ConversionPattern" value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
-->
</layout>
</appender>
<!-- ============================== -->
<!-- Append messages to the console -->
<!-- ============================== -->
<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
<errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
<param name="Target" value="System.out"/>
<param name="Threshold" value="INFO"/>
<layout class="org.apache.log4j.PatternLayout">
<!-- The default pattern: Date Priority [Category] Message\n -->
<param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n"/>
</layout>
</appender>
<root>
<!--
Set the root logger priority via a system property. Note this is parsed by log4j,
so the full JBoss system property format is not supported; e.g.
setting a default via ${jboss.server.log.threshold:WARN} will not work.
-->
<priority value="${jboss.server.log.threshold}"/>
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
I've got a java server launched from a jar that uses log4j (RollingFile and Console appender). Alone: no problem it works.
I've got a JBoss server using log4j (default install). Everything is ok when it runs alone.
When I start my Java server first and the JBoss, no problem either.
However when launching JBoss first and THEN launch the java server, the last doesn't log anything and JBoss sends me this :
ERROR [ServerThread] Failed to initialize
java.io.EOFException
at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2297)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2766)
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:797)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:297)
at org.jboss.invocation.pooled.interfaces.OptimizedObjectInputStream.<init>(OptimizedObjectInputStream.java:147)
at org.jboss.invocation.pooled.server.ServerThread.dorun(ServerThread.java:265)
at org.jboss.invocation.pooled.server.ServerThread.run(ServerThread.java:156)
log4j:WARN Detected problem with connection: java.net.SocketException: Broken pipe
Is there possible conflict between two servers using LOG4J ? I didn't find anything on the net.
Thanks
ADDENDUM
- JBoss and the Java server are in different directories
- JBoss and the Java server don't share any port (8080/8433--> JBoss and 20400-->Java)
- JBoss and the Java server have their own log4jxxxx.jar in their own library folder
- Java Log4j version : log4j-1.2.16.jar (I also tried 1.2.17)
- JBoss version : jboss-5.1.0.GA
- Both write in different files
Here are the config files : (Basically console & appender file only)
Java
<!-- mocutil import -->
<appender name="mocutilImport" class="org.apache.log4j.RollingFileAppender">
<param name="Threshold" value="INFO" />
<param name="File" value="log/mocutilImport.log" />
<param name="MaxFileSize" value="5000KB" />
<!-- Keep five backup file -->
<param name="MaxBackupIndex" value="5"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p - %m%n" />
</layout>
</appender>
<appender name="NectarMotrServer" class="org.apache.log4j.RollingFileAppender">
<param name="Threshold" value="INFO" />
<param name="File" value="log/NectarMotrServer.log" />
<param name="MaxFileSize" value="5000KB" />
<!-- Keep five backup file -->
<param name="MaxBackupIndex" value="5"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p - %m%n" />
</layout>
</appender>
<appender name="NectarMotrServerDev" class="org.apache.log4j.RollingFileAppender">
<param name="Threshold" value="DEBUG" />
<param name="File" value="log/NectarMotrServerDev.log" />
<param name="MaxFileSize" value="5000KB" />
<!-- Keep five backup file -->
<param name="MaxBackupIndex" value="5"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %c{1} [%t] %p - %m%n" />
</layout>
</appender>
<!-- Default -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Threshold" value="TRACE" />
<param name="Target" value="System.out"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d] %c{1} - %m%n" />
</layout>
</appender>
<category name="fr.edf.nectar">
<appender-ref ref="NectarmotrServer"/>
<appender-ref ref="NectarmotrServerDev"/>
<appender-ref ref="console"/>
</category>
<category name="fr.edf.nectar.interfaces.motr.imports.mocutil">
<appender-ref ref="mocutilImport"/>
</category>
<root>
<priority value="ALL"/>
</root>
JBOSS (I removed commented appenders)
<!-- ======================= -->
<!-- Setup the Root category -->
<!-- ======================= -->
<appender name="FILE" class="org.jboss.logging.appender.DailyRollingFileAppender">
<errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
<param name="File" value="${jboss.server.log.dir}/server.log"/>
<param name="Append" value="true"/>
<!-- In AS 5.0.x the server log threshold was set by a system
property. In 5.1 and later we are instead using the system
property to set the priority on the root logger (see <root/> below)
<param name="Threshold" value="${jboss.server.log.threshold}"/>
-->
<!-- Rollover at midnight each day -->
<param name="DatePattern" value="'.'yyyy-MM-dd"/>
<!-- Rollover at the top of each hour
<param name="DatePattern" value="'.'yyyy-MM-dd-HH"/>
-->
<layout class="org.apache.log4j.PatternLayout">
<!-- The default pattern: Date Priority [Category] (Thread) Message\n -->
<param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n"/>
<!-- The full pattern: Date MS Priority [Category] (Thread:NDC) Message\n
<param name="ConversionPattern" value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
-->
</layout>
</appender>
<!-- ============================== -->
<!-- Append messages to the console -->
<!-- ============================== -->
<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
<errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
<param name="Target" value="System.out"/>
<param name="Threshold" value="INFO"/>
<layout class="org.apache.log4j.PatternLayout">
<!-- The default pattern: Date Priority [Category] Message\n -->
<param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n"/>
</layout>
</appender>
<root>
<!--
Set the root logger priority via a system property. Note this is parsed by log4j,
so the full JBoss system property format is not supported; e.g.
setting a default via ${jboss.server.log.threshold:WARN} will not work.
-->
<priority value="${jboss.server.log.threshold}"/>
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
在同一台机器上运行多个应用程序并使用 Log4j 设施是没有问题的。问题是,两台服务器中的 Log4j 配置文件位于何处? Log4j 在两台服务器中的哪里生成日志文件?你使用什么附加器?任何共同点都可能导致问题。尝试使用单独的配置文件、在不同文件夹中生成的日志文件来隔离两台服务器,并且两台服务器都有自己的 Log4j jar 副本。
显示的错误对于套接字而言很奇怪。 Log4j 使用任何依赖于套接字的附加程序?有没有像 Chainsaw 这样的 GUI 工具来监控日志?
提供有关两台服务器中安装的 Log4j 的更多信息。
There is no problem having several applications running in the same machine and using Log4j facilities. The questions is, where is located the Log4j config file in both server? where is Log4j generating the log files in both servers? What appenders are you using? Any point in common can cause problems. Try to isolate both servers with separate config files, log files generated in different folders and both servers having its own copy of Log4j jar.
The error shown is strange as refers to sockets. Log4j uses any appenders that relies on sockets? Any GUI tool for monitoring log like Chainsaw?
Provide more information about the Log4j installed in both servers.
发生的事情是这样的(感谢 David Oliván Ubieto 的帮助):
在 Java 服务器中,我们使用 Php/Java 桥,查看它的类,我发现:
引用 David Chainsaw 可能是一个问题,确实如此,因为它使用与 JBoss
相同的端口
服务(来源)。4445
调用者, type=pooled所以我认为会发生什么,启动服务器,桥库尝试连接到 4445 以查看链锯是否存在。它检测到某些内容并决定使用
4445
作为日志端口,导致 Java 没有日志,同时 JBoss 在4445
上收到奇怪的消息并抛出异常。首先启动 Java,将导致使用我的 Log4j 配置的库和 JBoss 按预期工作。
为了更正所有内容,我修改了
.../jboss-5.1.0.GA/server/default/conf/bindingservice.beans/META-INF/bindings-jboss-beans.xml
,如下所示:Here is what happened (Thanks to David Oliván Ubieto for his help):
In the Java server, we're using a Php/Java bridge, looking at its class I found :
Refering to David Chainsaw might be a problem, and it does because it uses the port
4445
which is the same as JBossinvoker, type=pooled
service (Source).So what happen I think is that launching the server, the bridge library try connecting to
4445
to see if chainsaw is present. It detects something and decide to use4445
as Logging port resulting in no log for Java, meanwhile JBoss receives strange messages on4445
and throw an Exception.Launching Java first, will result in the lib using my Log4j configuration and JBoss working as expected.
To correct everything I modified
.../jboss-5.1.0.GA/server/default/conf/bindingservice.beans/META-INF/bindings-jboss-beans.xml
like this :