Spring framework 与Jboss Log4j冲突解决Word下载.docx
《Spring framework 与Jboss Log4j冲突解决Word下载.docx》由会员分享,可在线阅读,更多相关《Spring framework 与Jboss Log4j冲突解决Word下载.docx(10页珍藏版)》请在冰豆网上搜索。
needs
to
be
set
avoid
a
possible
deadlock
on
exception
at
the
appender
level.
See
bug#696819.
Log4jQuietMode"
true<
How
frequently
in
seconds
ConfigurationURL
is
checked
for
changes
RefreshPeriod"
60<
/mbean>
把resource:
log4j.xml改为resource:
jboss-log4j.xml
3.在自己的应用程序的WEB-INF目录中添加一个jboss-web.xml内容如下
?
xml
version="
1.0"
encoding="
UTF-8"
jboss-web>
class-loading
java2ClassLoadingCompliance="
false"
loader-repository>
ConfigTest:
loader=ConfigTest.war
loader-repository-config>
java2ParentDelegation=false
/loader-repository-config>
/loader-repository>
/class-loading>
/jboss-web>
4.把log4j.jar加到build-path中
5.在自己的应用程序的WEB-INF目录中添加一个log4j.properties内容如下:
#Global
variable
definition
LOG_LEVEL=DEBUG
LOG_FILE1=D:
/jboss-4.0.5.GA/server/default/log/configtest1.log
LOG_FILE2=D:
/jboss-4.0.5.GA/server/default/log/configtest2.log
#
com.microsoft
Logger
log4j.logger.org.stephencat.test=${LOG_LEVEL},
logfile1
log4j.additivity.org.stephencat.test=false
log4j.logger.org.stephencat.cat=${LOG_LEVEL},
logfile2
log4j.additivity.org.stephencat.cat=false
Console
Appender
Definition
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-5p
%c(%t)
%x:
%m%n
#log4j.appender.stdout.layout.ConversionPattern=%-5p:
[%d{MM/dd
HH:
mm:
ss,SSS}]
File
log4j.appender.logfile1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfile1.File=${LOG_FILE1}
log4j.appender.logfile1.DatePattern='
.'
yyyy-MM-dd
log4j.appender.logfile1.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile1.layout.ConversionPattern=%-5p:
[%d{ISO8601}]
log4j.appender.logfile2=org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfile2.File=${LOG_FILE2}
log4j.appender.logfile2.DatePattern='
log4j.appender.logfile2.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile2.layout.ConversionPattern=%-5p:
这里分别定义了两个命名控件:
logfile1对应命名空间(Java代码中的package)org.stephencat.test.*
logfile2对应命名空间org.stephencat.cat.*
6.建立一个用于初始化的InitServlet,配置如下方法:
/**
*
servlet.
br>
*
@throws
ServletException
if
an
error
occure
*/
public
void
init(ServletConfig
config)
throws
{
//
Put
your
code
here
String
isRelativePosition
=
config.getInitParameter("
relativePosition"
);
logConfiguration
logConfiguration"
root
"
;
if(isRelativePosition.equals("
true"
)){
config.getServletContext().getRealPath("
/"
}
PropertyConfigurator.configure(root
+
logConfiguration);
在web.xml配置这个Servlet的初始化参数(声明log4j.properties的位置)和启动优先级:
servlet>
description>
This
description
my
J2EE
component<
/description>
display-name>
display
name
/display-name>
servlet-name>
InitServlet<
/servlet-name>
servlet-class>
org.stephencat.test.InitServlet<
/servlet-class>
init-param>
param-name>
relativePosition<
/param-name>
param-value>
/param-value>
/init-param>
logConfiguration<
WEB-INF/log4j.properties<
load-on-startup>
1<
/load-on-startup>
/servlet>
7.在org.stephencat.test.TestServlet(映射为/test)中加入:
static
Logger
log
Logger.getLogger(TestServlet.class.getName());
8.在org.stephencat.cat.Test2Servlet(映射为/test2)中加入:
Logger.getLogger(Test2Servlet.class.getName());
9.重新启动JBoss,会出现如下错误消息:
11:
53:
21,549
ERROR
[STDERR]
log4j:
A
org.jboss.logging.appender.FileAppend
er"
object
not
assignable
org.apache.log4j.Appender"
variable.
The
class
wa
s
loaded
by
[WebappClassLoader
delegate:
false
repositories:
/WEB-INF/classes/
---------->
Parent
Classloader:
.FactoryURLClassLoader@dcc4e2
]
whereas
type
org.jboss.logging.appender.FileAppender
was
by
[org.jboss.system.server.NoAnnotationURLClassLoader@a97b0b].
Could
instantiate
named
FI
LE"
.
这是因为自己的log4j.jar与JBoss的log4jService有点冲突,但这段错误消息实际上可以忽略
10.访问以下网址:
http:
//localhost/..../test
//localhost/..../test2
将分别在以下日志文件中输出日志内容:
D:
文件名和物理路径可在log4j.properties中修改。
这个项目打算用jboss做,无论如何,其他的中间件我都用的有点恶心了,听说jboss不错,也想尝试一下新鲜事物,但是刚一开始就出现了一个问题,建立一个简单的web程序,发布,发布地点都已经知晓,但是在启动jboss的时候,发现爆出error错误,如下:
16:
41,884ERROR[STDERR]log4j:
ERRORA"
org.jboss.logging.appender.FileAppender"
objectisnotassignabletoa"
variable.
ERRORTheclass"
wasloadedby
ERROR[WebappClassLoader
delegate:
false
repositories:
/WEB-INF/classes/
ParentClassloader:
.FactoryURLClassLoader@8aa2d
]whereasobjectoftype
而相同的项目在tomcat下面是不会报错的,查明原因后发现,原来jboss自己带了日志功能,而建立web项目的时候它自己本身也带着日志功能(你的项目中应该有spring),直接造成冲突。
对于解决办法,下面转载一片文章。
log4j是一个很好的开源的日志项目,下面就我在实际中使用的一些情况作一个小结(我所写的是以spring为框架的运用,之所以要提到这点,是因为在spring中专门有处理log4j的地方,而我也用到了这些地方)。
在使用的第一步你要明白你所发布的web项目所使用的服务器,因为不同的服务器对于使用log4j是有些不同的,我在实际使用中主要是用tomcat和jboss两类,对于tomcat,它本身是没有配置log4j的,所以使用起来和常规的一样;
而在jboss中它是本身配置了log4j的,所以有时候我们在看项目代码时,其整个项目并没有log4j的配置文件,而在一些类中仍然定义了Logger,例如staticLoggerlog=org.apache.log4j.Logger.getLogger(UserDaoImple.class);
,这就表明开发者打算使用jboss默认的log4j的配置,我们可以在jboss下的对应的log目录下的server.log中看到日志,jboss本身的log4j的配置是将debug,info级的日志写在server.log中,而像error等级别比较高的日志打印到控制台上,而写到server.log中的日志比较多,并不方便查看。
于是我们想到使用自己的log4j配置写到某个具体的文件中(注意文件要先建立,才能往里面写东西,log4j自己不能建立文件),但这里因为jboss有它自己的log4j配置,所以如果我们配置的log4j包含Console的Appender时,就会出错,错误类似于
ERROR:
invalidconsoleappenderconfigdetected,consolestreamislooping.
解决方法一是不用Console的Appender,或者改jboss的配置文件,在jboss-service.xml文件里,把
mbeancode="
name="
attributename="
CatchSystemOut"
false<
。
我建议不用Console的Appender,当然这是对jboss3.2.x是这样,对于jboss4.0.x如果我们要用自己的log4j配置照上述改还是会有问题,会有类似于log4j:
org.jboss.logging.util.OnlyOnceErrorHandler"
org.apache.log4j.spi.ErrorHandler"
variable的异常,解决方法是把/server/default/jbossweb-tomcat55.sar/META-INF/jboss-service.xml中的以下两个熟悉改成true
Java2ClassLoadingCompliance"
UseJBossWebLoader"
以上就是使用jboss服务器可能出现的问题,解决了这些再来使用log4j就比较简单了。
下面说说对于采用了spring框架的项目如何使用log4j,在spring中使用log4j,有些方便的地方,
1.动态的改变记录级别和策略,即修改log4j.properties,不需要重启Web应用,这需要在web.xml中设置一下。
2.把log文件定在/WEB-INF/logs/而不需要写绝对路径。
3.可以把log4j.properties和其他properties一起放在/WEB-INF/,而不是Class-Path。
首先我们在web.xml中需要设定一下
context-param>
log4jConfigLocation<
/context-param>
log4jRefreshInterval<
60000<
listener>
listener-class>
org.springframework.web.util.Log4jConfigListener<
/listener-class>
/listener>
其中第二部分就是能够动态修改log4j.properties的关键,容器会每60秒扫描log4j的配置文件
对于log4j的配置文件如何写,这就不多说了,大家可以去google,有一点就是我们如果用RollingFileAppender或者FileAppender时,可以通过${webapp.root}来定位到服务器的发布的该项目下,这是spring把web目录的路径压入到了webapp.root的系统变量。
然后,在log4j.properties里就可以这样定义logfile位置
log4j.appender.logfile.File=${webapp.root}/WEB-INF/logs/myfuse.log
如果有多个web应用,怕webapp.root变量重复,可以在context-param里定义webAppRootKey。
当我们定义完log4j.properties后,剩下的就是在需要记录的class中new出Logger了
常用log4j配置
常用log4j配置,一般可以采用两种方式,.properties和.xml,下面举两个简单的例子:
一、log4j.properties
###设置org.zblog域对应的级别INFO,DEBUG,WARN,ERROR和输出地A1,A2##
log4j.category.org.zblog=ERROR,A1
log4j.category.org.zblog=INFO,A2
log4j.appender.A1=org.apache.log4j.ConsoleAppender
###设置输出地A1,为ConsoleAppender(控制台)##
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
###设置A1的输出布局格式PatterLayout,(可以灵活地指定布局模式)##
log4j.appender.A1.layout.ConversionPattern=%d{yyyy-MM-ddHH:
ss,SSS}[%c]-[%p]%m%n
###配置日志输出的格式##
log4j.appender.A2=org.apache.log4j.RollingFileAppender
###设置输出地A2到文件(文件大小到达指定尺寸的时候产生一个新的文件)##
log4j.appender.A2.File=E:
/study/log4j/zhuwei.html
###文件位置##
log4j.appender.A2.MaxFileSize=500KB
###文件大小##
log4j.appender.A2.MaxBackupIndex=1
log4j.append