From bc0bb68ec88f41af7b73102c3259870febdd5f0a Mon Sep 17 00:00:00 2001 From: Calvin Date: Thu, 12 Apr 2012 00:12:34 +0800 Subject: [PATCH] =?UTF-8?q?#10=20=E4=BD=BF=E7=94=A8Jolokia=20=E5=B0=86JMX?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E8=BE=93=E5=87=BA=E6=88=90Restful=20JSON?= =?UTF-8?q?=E6=95=B0=E6=8D=AE,=20JMX=E9=87=8D=E8=8E=B7=E6=96=B0=E7=94=9F?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mini-web/src/main/webapp/WEB-INF/web.xml | 2 +- examples/showcase/pom.xml | 6 ++ .../common/service/AccountManager.java | 17 ++++ .../showcase/jmx/ApplicationStatistics.java | 41 ++++++++ .../applicationContext-showcases.xml | 1 - .../resources/jmx/applicationContext-jmx.xml | 9 +- .../resources/log/applicationContext-log.xml | 22 ----- .../src/main/resources/log4j-perf4j.xml | 44 --------- .../src/main/resources/log4j.properties | 12 +-- .../main/webapp/WEB-INF/views/story/cache.jsp | 4 +- .../main/webapp/WEB-INF/views/story/jms.jsp | 4 +- .../main/webapp/WEB-INF/views/story/jmx.jsp | 35 +++++-- .../webapp/WEB-INF/views/story/schedule.jsp | 4 +- .../webapp/WEB-INF/views/story/utilizes.jsp | 16 ++-- .../webapp/WEB-INF/views/story/webservice.jsp | 2 +- .../showcase/src/main/webapp/WEB-INF/web.xml | 17 +++- .../{Log4jMBean.java => Log4jManager.java} | 65 ++----------- .../modules/log/Log4jMBeanTest.java | 94 ------------------- .../modules/log/Log4jManagerTest.java | 30 ++++++ pom.xml | 8 ++ 20 files changed, 174 insertions(+), 259 deletions(-) create mode 100644 examples/showcase/src/main/java/org/springside/examples/showcase/jmx/ApplicationStatistics.java delete mode 100644 examples/showcase/src/main/resources/log/applicationContext-log.xml delete mode 100644 examples/showcase/src/main/resources/log4j-perf4j.xml rename modules/core/src/main/java/org/springside/modules/log/{Log4jMBean.java => Log4jManager.java} (54%) delete mode 100644 modules/core/src/test/java/org/springside/modules/log/Log4jMBeanTest.java create mode 100644 modules/core/src/test/java/org/springside/modules/log/Log4jManagerTest.java diff --git a/examples/mini-web/src/main/webapp/WEB-INF/web.xml b/examples/mini-web/src/main/webapp/WEB-INF/web.xml index 8e7023721..7f63356c0 100644 --- a/examples/mini-web/src/main/webapp/WEB-INF/web.xml +++ b/examples/mini-web/src/main/webapp/WEB-INF/web.xml @@ -69,7 +69,7 @@ /* - + sitemeshFilter com.opensymphony.sitemesh.webapp.SiteMeshFilter diff --git a/examples/showcase/pom.xml b/examples/showcase/pom.xml index 02e69e485..4325fb7fa 100644 --- a/examples/showcase/pom.xml +++ b/examples/showcase/pom.xml @@ -321,6 +321,12 @@ poi + + + org.jolokia + jolokia-core + + javax.mail diff --git a/examples/showcase/src/main/java/org/springside/examples/showcase/common/service/AccountManager.java b/examples/showcase/src/main/java/org/springside/examples/showcase/common/service/AccountManager.java index 5889e0cc6..dbd2d6614 100644 --- a/examples/showcase/src/main/java/org/springside/examples/showcase/common/service/AccountManager.java +++ b/examples/showcase/src/main/java/org/springside/examples/showcase/common/service/AccountManager.java @@ -14,6 +14,7 @@ import org.springside.examples.showcase.common.dao.UserMyBatisDao; import org.springside.examples.showcase.common.entity.User; import org.springside.examples.showcase.jms.simple.NotifyMessageProducer; +import org.springside.examples.showcase.jmx.ApplicationStatistics; import org.springside.examples.showcase.security.ShiroDbRealm; import org.springside.examples.showcase.security.ShiroDbRealm.HashPassword; import org.springside.modules.mapper.JsonMapper; @@ -43,6 +44,8 @@ public class AccountManager { private ShiroDbRealm shiroRealm; + private ApplicationStatistics applicationStatistics; + /** * 在保存用户时,发送用户修改通知消息, 由消息接收者异步进行较为耗时的通知邮件发送. * @@ -70,10 +73,19 @@ public void saveUser(User user) { shiroRealm.clearCachedAuthorizationInfo(user.getLoginName()); } + if (applicationStatistics != null) { + applicationStatistics.incrUpdateUserTimes(); + } + sendNotifyMessage(user); + } public List getAllUser() { + + if (applicationStatistics != null) { + applicationStatistics.incrUpdateUserTimes(); + } return (List) userJpaDao.findAll(); } @@ -193,4 +205,9 @@ public void setMemcachedClient(SpyMemcachedClient memcachedClient) { public void setShiroRealm(ShiroDbRealm shiroRealm) { this.shiroRealm = shiroRealm; } + + @Autowired(required = false) + public void setApplicationStatistics(ApplicationStatistics applicationStatistics) { + this.applicationStatistics = applicationStatistics; + } } diff --git a/examples/showcase/src/main/java/org/springside/examples/showcase/jmx/ApplicationStatistics.java b/examples/showcase/src/main/java/org/springside/examples/showcase/jmx/ApplicationStatistics.java new file mode 100644 index 000000000..ad7b75e0f --- /dev/null +++ b/examples/showcase/src/main/java/org/springside/examples/showcase/jmx/ApplicationStatistics.java @@ -0,0 +1,41 @@ +package org.springside.examples.showcase.jmx; + +import java.util.concurrent.atomic.AtomicInteger; + +import org.springframework.jmx.export.annotation.ManagedAttribute; +import org.springframework.jmx.export.annotation.ManagedOperation; +import org.springframework.jmx.export.annotation.ManagedResource; + +@ManagedResource(objectName = ApplicationStatistics.MBEAN_NAME, description = "Application Statistics Management Bean") +public class ApplicationStatistics { + + public static final String MBEAN_NAME = "showcase:name=ApplicationStatistics"; + + private AtomicInteger listUserTimes = new AtomicInteger(); + private AtomicInteger updateUserTimes = new AtomicInteger(); + + public void incrListUserTimes() { + listUserTimes.incrementAndGet(); + } + + public void incrUpdateUserTimes() { + updateUserTimes.incrementAndGet(); + } + + @ManagedAttribute(description = "Times of all users be listed") + public int getListUserTimes() { + return listUserTimes.get(); + } + + @ManagedAttribute(description = "Times of users be updated") + public int getUpdateUserTimes() { + return updateUserTimes.get(); + } + + @ManagedOperation(description = "Reset all statistics") + public void resetStatistics() { + listUserTimes.set(0); + updateUserTimes.set(0); + } + +} diff --git a/examples/showcase/src/main/resources/applicationContext-showcases.xml b/examples/showcase/src/main/resources/applicationContext-showcases.xml index 62ea04e92..33a2080f2 100644 --- a/examples/showcase/src/main/resources/applicationContext-showcases.xml +++ b/examples/showcase/src/main/resources/applicationContext-showcases.xml @@ -10,7 +10,6 @@ - diff --git a/examples/showcase/src/main/resources/jmx/applicationContext-jmx.xml b/examples/showcase/src/main/resources/jmx/applicationContext-jmx.xml index 8819efe65..9c6e4bfec 100644 --- a/examples/showcase/src/main/resources/jmx/applicationContext-jmx.xml +++ b/examples/showcase/src/main/resources/jmx/applicationContext-jmx.xml @@ -7,10 +7,15 @@ JMX服务端配置 - + - + + + + + + diff --git a/examples/showcase/src/main/resources/log/applicationContext-log.xml b/examples/showcase/src/main/resources/log/applicationContext-log.xml deleted file mode 100644 index dd8394403..000000000 --- a/examples/showcase/src/main/resources/log/applicationContext-log.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - 日志高级演示配置 - - - - - - - \ No newline at end of file diff --git a/examples/showcase/src/main/resources/log4j-perf4j.xml b/examples/showcase/src/main/resources/log4j-perf4j.xml deleted file mode 100644 index 68e59e408..000000000 --- a/examples/showcase/src/main/resources/log4j-perf4j.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/examples/showcase/src/main/resources/log4j.properties b/examples/showcase/src/main/resources/log4j.properties index 221b29ac4..9f05d6224 100644 --- a/examples/showcase/src/main/resources/log4j.properties +++ b/examples/showcase/src/main/resources/log4j.properties @@ -5,7 +5,6 @@ log4j.rootLogger=WARN, Console, RollingFile #Console Appender log4j.appender.Console=org.apache.log4j.ConsoleAppender -log4j.appender.Console.Threshold=INFO log4j.appender.Console.layout=org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p %-40.40c -%m%n @@ -17,18 +16,11 @@ log4j.appender.RollingFile.File.DatePattern=.yyyy-MM-dd-HH log4j.appender.RollingFile.layout=org.apache.log4j.PatternLayout log4j.appender.RollingFile.layout.ConversionPattern=%d [%t] %-5p %-40.40c -%m%n -#TraceFile Appender (Store debug message, rolling with 10M, 5 files, threshold is DEBUG) -log4j.appender.TraceFile=org.apache.log4j.RollingFileAppender -log4j.appender.TraceFile.File=logs/showcase_trace.log -log4j.appender.TraceFile.Threshold=OFF -log4j.appender.TraceFile.MaxBackupIndex=5 -log4j.appender.TraceFile.layout=org.apache.log4j.PatternLayout -log4j.appender.TraceFile.layout.ConversionPattern=%d %X{traceId} [%-40.40c] -%m%n ##Loggers## -#Project defalult level with TraceFile appender -log4j.logger.org.springside.examples.showcase=INFO,TraceFile +#Project defalult level +log4j.logger.org.springside.examples.showcase=INFO #log4jdbc log4j.logger.jdbc.sqltiming=INFO \ No newline at end of file diff --git a/examples/showcase/src/main/webapp/WEB-INF/views/story/cache.jsp b/examples/showcase/src/main/webapp/WEB-INF/views/story/cache.jsp index bed76203a..830c19c71 100644 --- a/examples/showcase/src/main/webapp/WEB-INF/views/story/cache.jsp +++ b/examples/showcase/src/main/webapp/WEB-INF/views/story/cache.jsp @@ -7,13 +7,13 @@

Cache演示

-

技术说明:

+

技术说明:

  • 演示Memcached的使用
  • 演示Spring与Ehcache的集成
-

用户故事:

+

用户故事:

  • 在AccountManager.java中演示了对Memcached的使用
  • EhcacheDemo.java演示了Ehcache与Spring的集成
  • diff --git a/examples/showcase/src/main/webapp/WEB-INF/views/story/jms.jsp b/examples/showcase/src/main/webapp/WEB-INF/views/story/jms.jsp index 14e49d712..271f473a2 100644 --- a/examples/showcase/src/main/webapp/WEB-INF/views/story/jms.jsp +++ b/examples/showcase/src/main/webapp/WEB-INF/views/story/jms.jsp @@ -7,7 +7,7 @@

    JMS演示

    -

    技术说明:

    +

    技术说明:

    • 演示基于ActiveMQ的JMS Topic/Queue应用
    • 演示基于Spring CachingConnectionFactory, JmsTemplate, DefaultMessageListener的应用
    • @@ -15,7 +15,7 @@
    • 演示Advanced模式, 包括发送者的timeToLive等属性设置, 接受者的消息过滤器,消息确认模式与持久化订阅者
    -

    用户故事:

    +

    用户故事:

    • 在综合演示用例中保存用户时,异步发送通知消息邮件
    • 在servers/activemq目录演示优化过的activemq.xml配置文件
    • diff --git a/examples/showcase/src/main/webapp/WEB-INF/views/story/jmx.jsp b/examples/showcase/src/main/webapp/WEB-INF/views/story/jmx.jsp index e31958f48..f0f34b877 100644 --- a/examples/showcase/src/main/webapp/WEB-INF/views/story/jmx.jsp +++ b/examples/showcase/src/main/webapp/WEB-INF/views/story/jmx.jsp @@ -1,21 +1,40 @@ <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + -JMX演示用例 + JMX演示用例

      JMX演示用例

      -

      技术说明:

      +

      技术说明:

        -
      • 服务端演示使用Spring annotation定义MBean
      • +
      • 演示使用Spring annotation将POJO定义为MBean
      • +
      • 演示使用jolokia将JMX输出为Restul JSON Monitor API
      -

      用户故事:

      -
      - 使用JMX动态配置查看和配置Log4J日志等级。
      客户端可使用JConsole或JManager, 远程进程URL为 localhost:2099 - 或完整版的service:jmx:rmi:///jndi/rmi://localhost:2099/jmxrmi -
      +

      MBean介绍:

      +
        +
      • Log4j Mbean,控制Log4j的Logger Level, name为log4j:name=Log4j
      • +
      • Application Statistics Mbean, 当用户在综合演示里查看/更新用户时,计数器将会递增, name为showcase:name=ApplicationStatistics
      • +
      + +

      使用Jconsole或其他JMX客户端:

      +
        +
      • 如果JConsole与应用在同一台机器,直接选择该进程。
      • +
      • 否则远程进程URL为 localhost:2099 或完整版的service:jmx:rmi:///jndi/rmi://localhost:2099/jmxrmi
      • +
      + +

      与国际接轨的Resultful API:

      + \ No newline at end of file diff --git a/examples/showcase/src/main/webapp/WEB-INF/views/story/schedule.jsp b/examples/showcase/src/main/webapp/WEB-INF/views/story/schedule.jsp index 1b456f529..76d5e5681 100644 --- a/examples/showcase/src/main/webapp/WEB-INF/views/story/schedule.jsp +++ b/examples/showcase/src/main/webapp/WEB-INF/views/story/schedule.jsp @@ -7,7 +7,7 @@

      定时任务演示

      -

      技术说明:

      +

      技术说明:

      • JDK5.0 ScheduledExecutorService的Timer式任务定义, 支持Graceful Shutdown演示.
      • Spring的Cront式任务定义, 支持Graceful Shutdown演示.
      • @@ -15,7 +15,7 @@
      • Quartz的任务在内存或数据库中存储, 单机或集群执行演示.
      -

      用户故事:

      +

      用户故事:

      • 简单的定时在Console打印当前用户数量.
      • 设法同时运行两个实例, 演示Quartz集群运行的效果.
      • diff --git a/examples/showcase/src/main/webapp/WEB-INF/views/story/utilizes.jsp b/examples/showcase/src/main/webapp/WEB-INF/views/story/utilizes.jsp index c4d686c6c..133e19aaf 100644 --- a/examples/showcase/src/main/webapp/WEB-INF/views/story/utilizes.jsp +++ b/examples/showcase/src/main/webapp/WEB-INF/views/story/utilizes.jsp @@ -5,7 +5,7 @@ -

        XML/JSON操作演示

        +

        XML/JSON操作演示

        • 基于JAXB2.0的Java-XML绑定, 演示根元素是List, 属性是List与Map等特殊情况.
        • 万能老倌Dom4j.
        • @@ -14,29 +14,27 @@
        • 在JsonDemo.java中演示Jackson远超同类JSON库的转化能力.
        -

        Excel演示

        +

        Excel演示

        说明:演示基于POI的Excel操作。

        • 导出Excel文件
          演示冻结/合并单元格, 单元格字体/边框/颜色, 单元格数值格式/公式等特性.
        • 读取Excel文件
          见ExcelExportActionTest测试用例.
        -

        Email演示

        +

        Email演示

        • 简单文本邮件演示.
        • 带附件的MIME邮件演示, 使用Freemarker模板创建HTML内容.
        • 在综合演示用例中保存用户时,发送两种邮件.
          演示邮箱名为springside3.demo@gmail.com, 密码为demoforyou.
        -

        日志演示

        +

        日志演示

          -
        • Log4JMBean: 通过JMX动态查询与改变Logger的日志等级与Appender.
        • -
        • MockLog4jAppender: 在测试用例中验证日志的输出.
        • -
        • 使用JConsole动态修改log4j的日志等级.(路径service:jmx:rmi:///jndi/rmi://localhost:2099/jmxrmi,名称Log4j:name=log4j)
        • -
        • Schedule测试用例使用MockAppender校验日志输出.
        • +
        • Log4JManager: 通过JMX动态查询与改变Logger的日志等级与Appender, 详见JMX页面.
        • +
        • MockLog4jAppender: 在测试用例中验证日志的输出, 在Schedule测试用例使用MockAppender校验日志输出.
        -

        其他常用工具

        +

        其他常用工具

        全部演示在org.springside.examples.showcase.utilities目录

        • JodaTime: 日期操作.
        • diff --git a/examples/showcase/src/main/webapp/WEB-INF/views/story/webservice.jsp b/examples/showcase/src/main/webapp/WEB-INF/views/story/webservice.jsp index bdbb43994..acd1fcd54 100644 --- a/examples/showcase/src/main/webapp/WEB-INF/views/story/webservice.jsp +++ b/examples/showcase/src/main/webapp/WEB-INF/views/story/webservice.jsp @@ -7,7 +7,7 @@

          Restful Service 高级演示

          -

          技术说明:

          +

          技术说明:

          • HttpBasic认证, 与Shiro权限控制结合.
          • Multi-part演示.
          • diff --git a/examples/showcase/src/main/webapp/WEB-INF/web.xml b/examples/showcase/src/main/webapp/WEB-INF/web.xml index 220f3ecb1..c215d025e 100644 --- a/examples/showcase/src/main/webapp/WEB-INF/web.xml +++ b/examples/showcase/src/main/webapp/WEB-INF/web.xml @@ -49,6 +49,18 @@ JerseyServlet /rs/* + + + + jolokia-agent + org.jolokia.http.AgentServlet + 2 + + + + jolokia-agent + /jolokia/* + @@ -100,7 +112,7 @@ /* - + shiroFilter org.springframework.web.filter.DelegatingFilterProxy @@ -112,7 +124,7 @@ FORWARD - + cacheControlHeaderFilter org.springside.examples.showcase.web.CacheControlHeaderFilter @@ -122,6 +134,7 @@ /static/* + sitemeshFilter com.opensymphony.sitemesh.webapp.SiteMeshFilter diff --git a/modules/core/src/main/java/org/springside/modules/log/Log4jMBean.java b/modules/core/src/main/java/org/springside/modules/log/Log4jManager.java similarity index 54% rename from modules/core/src/main/java/org/springside/modules/log/Log4jMBean.java rename to modules/core/src/main/java/org/springside/modules/log/Log4jManager.java index 51ec36f3b..7914ec0ea 100644 --- a/modules/core/src/main/java/org/springside/modules/log/Log4jMBean.java +++ b/modules/core/src/main/java/org/springside/modules/log/Log4jManager.java @@ -5,10 +5,6 @@ */ package org.springside.modules.log; -import java.util.Enumeration; - -import org.apache.commons.lang3.Validate; -import org.apache.log4j.AppenderSkeleton; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.slf4j.LoggerFactory; @@ -23,22 +19,18 @@ * * @author calvin */ -@ManagedResource(objectName = Log4jMBean.LOG4J_MBEAN_NAME, description = "Log4j Management Bean") -public class Log4jMBean { +@ManagedResource(objectName = Log4jManager.MBEAN_NAME, description = "Log4j Management Bean") +public class Log4jManager { /** - * Log4jMbean的注册名称. + * Log4jManager的Mbean的注册名称. */ - public static final String LOG4J_MBEAN_NAME = "Log4j:name=log4j"; + public static final String MBEAN_NAME = "log4j:name=Log4j"; - private static org.slf4j.Logger mbeanLogger = LoggerFactory.getLogger(Log4jMBean.class); + private static org.slf4j.Logger managerLogger = LoggerFactory.getLogger(Log4jManager.class); private String projectLoggerName; - private String traceAppenderName; - - private Level projectLoggerOrgLevel; - /** * 获取Logger的日志级别. */ @@ -60,7 +52,7 @@ public void setLoggerLevel(String loggerName, String newLevel) { Logger logger = Logger.getLogger(loggerName); Level level = Level.toLevel(newLevel); logger.setLevel(level); - mbeanLogger.info("设置{}级别为{}", loggerName, newLevel); + managerLogger.info("设置{}级别为{}", loggerName, newLevel); } /** @@ -81,45 +73,6 @@ public void setProjectLoggerLevel(String newLevel) { setLoggerLevel(projectLoggerName, newLevel); } - /** - * 开始Trace. - * 降低项目默认Logger的级别到DEBUG, 同时打开traceAppender的阀值到Debug. - * 需要先注入项目默认Logger名称及traceAppender名称. - */ - @ManagedOperation(description = "Start trace") - public void startTrace() { - Validate.notBlank(traceAppenderName); - Logger logger = Logger.getLogger(projectLoggerName); - projectLoggerOrgLevel = logger.getLevel(); - logger.setLevel(Level.DEBUG); - setTraceAppenderThreshold(logger, Level.DEBUG); - mbeanLogger.info("Start trace"); - } - - /** - * 结束Trace. - * 提升项目默认Logger的级别回到原来的值, 同时关闭traceAppender的阀值到Off. - * 需要先注入项目默认Logger名称及traceAppender名称. - */ - @ManagedOperation(description = "Stop trace") - public void stopTrace() { - Validate.notBlank(traceAppenderName); - Logger logger = Logger.getLogger(projectLoggerName); - logger.setLevel(projectLoggerOrgLevel); - setTraceAppenderThreshold(logger, Level.OFF); - mbeanLogger.info("Stop trace"); - } - - private void setTraceAppenderThreshold(Logger logger, Level level) { - Enumeration e = logger.getAllAppenders(); - while (e.hasMoreElements()) { - AppenderSkeleton appender = (AppenderSkeleton) e.nextElement(); - if (appender.getName().equals(traceAppenderName)) { - appender.setThreshold(level); - } - } - } - /** * 根据log4j.properties中的定义, 设置项目默认的logger名称, 如org.springside.examples.miniweb. */ @@ -127,10 +80,4 @@ public void setProjectLoggerName(String projectLoggerName) { this.projectLoggerName = projectLoggerName; } - /** - * 根据log4j.properties中的定义,设置项目中的TraceAppender的名称 - */ - public void setTraceAppenderName(String traceAppenderName) { - this.traceAppenderName = traceAppenderName; - } } \ No newline at end of file diff --git a/modules/core/src/test/java/org/springside/modules/log/Log4jMBeanTest.java b/modules/core/src/test/java/org/springside/modules/log/Log4jMBeanTest.java deleted file mode 100644 index 48e413f56..000000000 --- a/modules/core/src/test/java/org/springside/modules/log/Log4jMBeanTest.java +++ /dev/null @@ -1,94 +0,0 @@ -package org.springside.modules.log; - -import static org.junit.Assert.*; - -import org.apache.log4j.Level; -import org.apache.log4j.Logger; -import org.junit.Test; -import org.slf4j.LoggerFactory; - -public class Log4jMBeanTest { - - @Test - public void testLoggerLevel() { - - String loggerName = "org.springside.modules"; - Log4jMBean mbean = new Log4jMBean(); - String orgLevel = mbean.getLoggerLevel(loggerName); - - Logger.getLogger(loggerName).setLevel(Level.FATAL); - assertEquals("FATAL", mbean.getLoggerLevel(loggerName)); - - mbean.setLoggerLevel(loggerName, "TRACE"); - assertEquals("TRACE", mbean.getLoggerLevel(loggerName)); - - mbean.setLoggerLevel(loggerName, "WRONG_LEVEL_NAME"); - assertEquals("DEBUG", mbean.getLoggerLevel(loggerName)); - - mbean.setLoggerLevel(loggerName, orgLevel); - } - - @Test - public void startAndStopTrace() { - //准备Logger - String loggerName = "org.springside.examples"; - String traceAppenderName = "TraceFile"; - - org.slf4j.Logger logger = LoggerFactory.getLogger(loggerName); - - Log4jMBean mbean = new Log4jMBean(); - mbean.setProjectLoggerName(loggerName); - mbean.setTraceAppenderName(traceAppenderName); - - MockLog4jAppender normalAppender = new MockLog4jAppender(); - normalAppender.setName("RollingFile"); - normalAppender.setThreshold(Level.INFO); - normalAppender.addToLogger(loggerName); - - MockLog4jAppender traceAppender = new MockLog4jAppender(); - traceAppender.setName(traceAppenderName); - traceAppender.setThreshold(Level.OFF); - traceAppender.addToLogger(loggerName); - - mbean.setLoggerLevel(loggerName, "INFO"); - - //未开始Trace, info级别信息只写到normal appender - //debug信息不会写到任何appender - logger.info("before trace"); - assertEquals("before trace", normalAppender.getFirstMessage()); - assertTrue(traceAppender.isEmpty()); - normalAppender.clearLogs(); - traceAppender.clearLogs(); - - logger.debug("before trace"); - assertTrue(normalAppender.isEmpty()); - assertTrue(traceAppender.isEmpty()); - - //开始trace, info级别信息写到所有appender - //debug信息只写到trace appender - mbean.startTrace(); - logger.info("start trace"); - assertEquals("start trace", normalAppender.getFirstMessage()); - assertEquals("start trace", traceAppender.getFirstMessage()); - normalAppender.clearLogs(); - traceAppender.clearLogs(); - - logger.debug("start trace"); - assertTrue(normalAppender.isEmpty()); - assertEquals("start trace", traceAppender.getFirstMessage()); - normalAppender.clearLogs(); - traceAppender.clearLogs(); - - //结束trace,逻辑与未开始Trace一样 - mbean.stopTrace(); - logger.info("after trace"); - assertEquals("after trace", normalAppender.getFirstMessage()); - assertTrue(traceAppender.isEmpty()); - normalAppender.clearLogs(); - traceAppender.clearLogs(); - - logger.debug("after trace"); - assertTrue(normalAppender.isEmpty()); - assertTrue(traceAppender.isEmpty()); - } -} diff --git a/modules/core/src/test/java/org/springside/modules/log/Log4jManagerTest.java b/modules/core/src/test/java/org/springside/modules/log/Log4jManagerTest.java new file mode 100644 index 000000000..bb12852ef --- /dev/null +++ b/modules/core/src/test/java/org/springside/modules/log/Log4jManagerTest.java @@ -0,0 +1,30 @@ +package org.springside.modules.log; + +import static org.junit.Assert.*; + +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.junit.Test; + +public class Log4jManagerTest { + + @Test + public void testLoggerLevel() { + + String loggerName = "org.springside.modules"; + Log4jManager mbean = new Log4jManager(); + String orgLevel = mbean.getLoggerLevel(loggerName); + + Logger.getLogger(loggerName).setLevel(Level.FATAL); + assertEquals("FATAL", mbean.getLoggerLevel(loggerName)); + + mbean.setLoggerLevel(loggerName, "TRACE"); + assertEquals("TRACE", mbean.getLoggerLevel(loggerName)); + + mbean.setLoggerLevel(loggerName, "WRONG_LEVEL_NAME"); + assertEquals("DEBUG", mbean.getLoggerLevel(loggerName)); + + mbean.setLoggerLevel(loggerName, orgLevel); + } + +} diff --git a/pom.xml b/pom.xml index 910b6f82e..bf0ce43f8 100644 --- a/pom.xml +++ b/pom.xml @@ -417,6 +417,14 @@ + + + org.jolokia + jolokia-core + 1.0.2 + + +