在 JBoss 4.0.5GA 上使用应用程序自己的 log4j 配置

1. 把 D:\jboss-4.0.5.GA\server\default\conf 里面的 log4j.xml 改名为 jboss-log4j.xml

2. 编辑 D:\jboss-4.0.5.GA\server\default\conf 里面的 jboss-service.xml 找到

    <!--  ====================================================================  -->
   
<!--  Log4j Initialization                                                  -->
   
<!--  ====================================================================  -->

   
< mbean  code ="org.jboss.logging.Log4jService"
      name
="jboss.system:type=Log4jService,service=Logging"
      xmbean-dd
="resource:xmdesc/Log4jService-xmbean.xml" >
      
< attribute  name ="ConfigurationURL" > resource:log4j.xml </ attribute >
      
<!--  Set the org.apache.log4j.helpers.LogLog.setQuiteMode. As of log4j1.2.8
      this needs to be set to avoid a possible deadlock on exception at the
      appender level. See bug#696819.
      
-->
      
< attribute  name ="Log4jQuietMode" > true </ attribute >
      
<!--  How frequently in seconds the ConfigurationURL is checked for changes  -->
      
< attribute  name ="RefreshPeriod" > 60 </ attribute >
   
</ 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

# com.microsoft Logger
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} ]  %c(%t) %x:%m%n

# File Appender Definition
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} ]  %c(%t) %x:%m%n

# File Appender Definition
log4j.appender.logfile2
= org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfile2.File
= ${LOG_FILE2}
log4j.appender.logfile2.DatePattern
= '.'yyyy-MM-dd
log4j.appender.logfile2.layout
= org.apache.log4j.PatternLayout
log4j.appender.logfile2.layout.ConversionPattern
= %-5p: [ %d{ISO8601} ]  %c(%t) %x:%m%n

这里分别定义了两个命名控件:
logfile1 对应命名空间(Java 代码中的 package)org.stephencat.test.*
logfile2 对应命名空间 org.stephencat.cat.*

6. 建立一个用于初始化的 InitServlet ,配置如下方法:

     /**
     * Initialization of the servlet. <br>
     *
     * 
@throws  ServletException if an error occure
     
*/
    
public   void  init(ServletConfig config)  throws  ServletException {
        
//  Put your code here
        String isRelativePosition  =  config.getInitParameter( " relativePosition " );
        String logConfiguration 
=  config.getInitParameter( " logConfiguration " );
        String root 
=   "" ;
        
if (isRelativePosition.equals( " true " )){
            root 
=  config.getServletContext().getRealPath( " / " );
        }
        PropertyConfigurator.configure(root 
+  logConfiguration);
    }

在 web.xml 配置这个 Servlet 的初始化参数(声明 log4j.properties 的位置)和启动优先级:

   < servlet >
    
< description > This is the description of my J2EE component </ description >
    
< display-name > This is the display name of my J2EE component </ display-name >
    
< servlet-name > InitServlet </ servlet-name >
    
< servlet-class > org.stephencat.test.InitServlet </ servlet-class >
    
< init-param >
        
< param-name > relativePosition </ param-name >
        
< param-value > true </ param-value >
    
</ init-param >
    
< init-param >
        
< param-name > logConfiguration </ param-name >
        
< param-value > WEB-INF/log4j.properties </ param-value >
    
</ init-param >
    
< 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)中加入:

     static  Logger log  =  Logger.getLogger(Test2Servlet. class .getName());

9. 重新启动 JBoss ,会出现如下错误消息:

11 : 53 : 21 , 549  ERROR  [ STDERR ]  log4j:ERROR A  " org.jboss.logging.appender.FileAppend
er
"  object is not assignable to a  " org.apache.log4j.Appender "  variable.
11 : 53 : 21 , 549  ERROR  [ STDERR ]  log4j:ERROR The class  " org.apache.log4j.Appender "  wa
s loaded by
11 : 53 : 21 , 549  ERROR  [ STDERR ]  log4j:ERROR  [ WebappClassLoader
  delegate: false
  repositories:
    /WEB-INF/classes/
----------> Parent Classloader:
java.net.FactoryURLClassLoader@dcc4e2
] whereas object of type
11 : 53 : 21 , 549  ERROR  [ STDERR ]  log4j:ERROR  " org.jboss.logging.appender.FileAppender
"  was loaded by  [ org.jboss.system.server.NoAnnotationURLClassLoader@a97b0b ] .
11 : 53 : 21 , 549  ERROR  [ STDERR ]  log4j:ERROR Could not instantiate appender named  " FI
LE
" .

这是因为自己的 log4j.jar 与 JBoss 的 log4jService 有点冲突,但这段错误消息实际上可以忽略

10. 访问以下网址:

http://localhost/..../test

http://localhost/..../test2

将分别在以下日志文件中输出日志内容:

D:/jboss- 4.0.5 .GA/server/default/log/configtest1.log
D:/jboss-4.0.5.GA/server/default/log/configtest2.log

文件名和物理路径可在 log4j.properties 中修改。

你可能感兴趣的:(apache,log4j,Web,servlet,jboss)