JBoss配置学习(二):日志(Log4j)    Log4j是一种日志记录工具包,起有如下几个比较重要的概念
    1.日志级别分为:ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF,譬如如果调用org.apache.log4j.Logger.debug(msg),那么只有当系统的日志级别小于等于DEBUG(即ALL或者DEBUG)时,该信息才会输出
    2.日志追加器(Appender):日志追加器定义了日志信息以什么样的格式写到哪里,主要有ConsoleAppender和FileAppender,前者以System.out的方式输出,后者则以文件的格式输出,自定义的Appender必须实现rg.apache.log4j.Appender接口
    3.日志分类(Category):日志可以对不同的分类配置不同的日志级别和日志追加器,一般以做日志记录的类的包名为日志分类,日志分类存在父子关系,譬如对于一个类ayufox.jboss.eclipse.Bootstrap进行日志,则日志分类ayufox和ayufox.jboss都对其起作用,其中ayfuox.jboss覆盖ayufox的配置,就如同ayufox.jboss继承了ayufox,ayufox.jboss的行为覆盖ayufox一样
    Log4j的使用比较简单,如下
    Logger logger = LogManager.getLogger(myClass);
    logger.debug(...)
    logger.warn(...)
    JBoss使用Log4j完成日志记录的任务,见$JBOSS_HOME/server/all/config/jboss-service.xml(以all服务实例为例,下面不再强调)
    [code]
    <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>      
        <attribute name="Log4jQuietMode">true</attribute>
        <attribute name="RefreshPeriod">60</attribute>
    </mbean>
    [/code]
    从ConfigurationURL,可以知道log4j的配置文件为$JBOSS_HOME/server/all/config/log4j.xml,详细配置的理解可以参考该文件和log4j的文档,在这里举例说明,假设我们对jms服务器端的行为做进一步了解,我们可以让其打印出更多的调试信息,则在log4j.xml中配置如下
    [code]
    <category name="org.jboss.mx">     
       <priority value="DEBUG" />     
       <appender-ref ref="CONSOLE"/>   
    </category>
    [/code]我的BLOG: http://ayufox.blogcn.com

解决方案 »

  1.   

    JBoss配置学习(三):命名服务(NS)    命名服务提供了让用户可以通过一个名字映射到一个对象的服务,以让用户可以使用一个可识别的名字来访问一个对象,譬如internet的DNS就是一个例子,其提供了根据域名获得IP的服务。在J2EE中使用JNDI来提供这样的一种功能。
        JNDI的API包位于javax.naming下最主要的类是Context和InitContext,其提供了向命名服务提供者注册、取消注册和获得注册对象的功能,譬如EJB的扩展组件可能就会在启动时将加载EJB包并解析Bean和向命名服务提供注册,而客户端根据注册名向命名服务请求获得EJB的HOME对象。
        JBoss的命名服务包括三种,远程命名服务、本地命名服务和本地ENC,其名字分别以任意、java:和java:comp开头:远程命名服务和本地命名服务的名字必须在整个服务器实例中唯一,远程目录可以通过远程访问,即客户端和服务提供端位于不同的JVM,譬如一个远程HOME接口;而本地命名服务仅可以通过本地访问,即客户端和服务位于同一个服务器实例,譬如JBOSS提供的数据源;而ENC意思是Enterprise Naming Context,其名字在同一个环境中唯一,譬如不同的应用(两个不同的Web应用)其名字可以是一样的,譬如在EJB配置中(如下),可以通过java:com/env/ejb/hello来获得该EJB,其也仅可以在同一个应用实例中访问
        [code]
        <ejb-ref>
    <ejb-ref-name>ejb/hello</ejb-ref-name>
    <ejb-ref-type>Session</ejb-ref-type>
    <home>ayufox.ejb.test.HelloHome</home>
            <remote>ayufox.ejb.test.HelloObject</remote>
    <ejb-link>hello</ejb-link>
        </ejb-ref>
         [/code]
         1.服务器端配置1
         命名服务JBoss提供的配置如下$JBOSS_HOME/server/all/config/jboss-service.xml
          [code]
         <mbean code="org.jboss.naming.NamingService"   name="jboss:service=Naming"   xmbeandd="resource:xmdesc/NamingService-xmbean.xml">      
          <attribute name="CallByValue">false</attribute>
          <attribute name="Port">1099</attribute>   
          <attribute name="BindAddress">${jboss.bind.address}</attribute>         
          <attribute name="RmiPort">1098</attribute>
          <attribute name="RmiBindAddress">${jboss.bind.address}</attribute>      
          <depends optional-attribute-name="LookupPool"        proxy-type="attribute">jboss.system:service=ThreadPool</depends>   
          </mbean>
          [/code]
          各个参数意义自明,不再解释,其中BindAddress是因为有些服务器有多个网卡具有多个IP,可以通过指定某一个IP则仅向该IP访问才有效,可以通过配置该bean来改变JNDI访问端口等。
         2.服务器端配置2
         $JBOSS_HOME/server/all/config/jdni.properties(一般不需要重新配置)
         java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
         java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
         3.远程客户端配置:
         在运行环境路径下配置jdni.properties
         java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
         java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
         java.naming.provider.url=localhost:1099
         4.测试代码
         1)获得所有远程命名对象
         [code]
         InitialContext ctx = new InitialContext();    
         NamingEnumeration<NameClassPair> ne = ctx.list("java:");
         while (ne.hasMoreElements())
         {
    NameClassPair cp = ne.next();
    System.out.println(cp.getName());
         }
         [/code]
         2)获得远程HOME接口
         [code]
         Context ctx = new InitialContext();
         Object ref = ctx.lookup("java:/ejb/hello");
         [/code]
      

  2.   

    请问jboss的全局变量在那里设啊
    就是我设了smtp="smtp.126.com"的话我全个项目中都能通过访问smtp得到它的值
      

  3.   

    一种方式是可以在你项目刚启动的时候通过JDNI注册你的全局变量