各式主流的、实用的、好玩的开源项目大派对。
在showcase的jmx-client.jsp中,更近一步demo了使用yui-g/yui-u进行内容排版,将两种JMX操作的Form等 宽并列。
4. CSS进阶长
为了更好的支持缩放,现在不流行用px作为长度单位了,改用em. 常用的换算关系如下,其他可以查 http://pxtoem.com/ px em 5 0.313 8 0.5 10 0.625 13 0.813 16 1
另外,可能是为了批量的修改字体,也会只定义一个标准body字体的大小,然后其他h1,h2等全部用百分比来表示大小。 YUI里默认大小是13px,常用换算关系如下,其他px的百分比见图表 px % 10 77
13 100% 20 153.9%
?
基础类库: 日 志-Slf4j, Log4j, Utils工具类
1.资料
? 日志的资料(江南白衣博物馆) 2.选型
log4j作者的新作slf4j是commons-logging的替代品,因为可以参数化的语句\,不用再为了丁点性能写什么 if( logger.isDebugenable()) ....Hibernate、Jetty, Spring3.0等项目已经迁移到了slf4j。 至于log4j的后续项目logback,因为国内主流还是log4j,暂时不做演示。
3.in SpringSide 3
3.1 日志库间关系
新写的代码,使用slf4j,然后会通过slf4j-log4j12调度log4j。
原有代码或第三方代码,使用commons logging的依然会去调用log4j,使用log4j的也无需改动。
3.2 日志文件生成策略
日志文件一般按日滚动,对于要被每小时处理一次的话也可以按小时来滚动,见showcase中的log4j.properties。 对于调试信息等不大重要的信息,可以使用按大小滚动,且设置最多保留的文件数量。
如果需要按日/小时滚动,每日的文件又要按大小滚动,还想限制目录中文件的总数量,建议使用一个叫TimeAndSizeRollingAppender的开源项目
3.3 调试日志
系统上线后,难免会出现问题,这时候,好的调试日志就是TO team或开发人员的救命稻草。 调试日志一般有如下设计:
发生在多个服务器的日志可以汇总到一个日志文件里.
? 可以通过JMS, SocketServer等Appender实现, SS中暂无演示。
? 发生在前后台多个业务子系统的日志, 每条日志有一个TransactionId清晰的显示某次业务的完整过程,可以方便的grep.|
? 利用log4j的MDC实现,见TraceUtils, showcase的TraceLogAspect通过AOP在每个WebService方法调用前,都自动生成了一个
TraceId.
?
要把traceId自动打印到日志中, 需要在log4j.properties中在appdender的ConversionPattern添加%X{traceId},如:
log4j.appender.stdout.layout.ConversionPattern=%d [%t] %p %c %X{traceId}-%m%n
调试日志在发送到中央JMS/SocketServer的同时要在本地保留备份,但与平时的系统日志又不要放在同一文件,且调试日志不会保留太 长。
? 可将调试日志的级别限定在Debug,同时在系统日志的appender上设置Threshold为Info,设定RollingFile的文件大小与数 量,
见log4j.properties.
? 利用AOP自动记录一些信息,减少debug语句的数量,showcase中的TraceLogAspect作了简单演示。
?
3.4 业务日志
使用QueueAppender/JdbcLogTask, 再配合TraceUtils中演示的Log4j MDC技术, 能方便的实现业务日志功能.
3.5 JMX动态配置日志级别
Springside3简单封装了一个Log4jMBean,可以通过JMX Console无需重启的动态读取或设置每个Logger的日志级别,并读取每个Logger设定的appender。
在showcase示例中,路径为service:jmx:rmi:///jndi/rmi://localhost:1099/showcase, MBean名称为SpringSide:type=Log4jManagement
另外平时在代码中也可以随意某个设置日志级别,如- Logger logger= Logger.getLogger(\ logger.setLevel(Level.toLevel(\);
3.6 Log4jMockAppender
MockAppender用于验证日志输出的正确性,在JmsQueueTest,ExecutorJobTest等测试用例中均有演示。
在测试开始前, 使用addToLogger()方法将MockAppender添加到需要侦听的logger. 即可在测试后通过getAllLogs()方法, getFirst/LastLog()等方法取出log事件。
3.6 加强版的异步数据库日志
log4j的异步Appender不是很稳定,Jdbc Appender也不完全符合需求(不是由Spring注入DataSource,没有好的批处理机制) , 因此在extension项目中重新进行了封装,并在showcase的log4j.properties, applicationContext-log.xml,LogAction.java中演示。 轻量的异步QueueAppender将消息放入由QueueHolder持有的队列。
? 由Spring管理DataSource的JdbcLogWriter从队列中读出消息,批量写入数据库。支持阻塞的读取消息并缓存到一定数量 时写入
与定时批量读取消息两种策略。
? JdbcLogWriter的sql可由Spring注入,更可在子类重载getActualSql()函数进行处理。
? Queue管理器在系统正常关闭/重启时会通知JdbcLogWriter停止工作,JdbcLogWriter的基类 QueueConsumer会将负责队列中未完
成信息持久化到临时文件,在下次启动时重新载入。
?
1.SpringSide3 Core Utils
? ? ? ? ? ? ? ?
ReflectionUtils,在Sping/Apache Commons的反射类的基础上,提供更进一步的反射操作,如: 1.强制直接访问private/protected属性 或 调用Getter/Setter 2.获取范型定义类型信息
3.获取集合中元素的属性组成一个List或字符串 4.转换字符串到相应的对象类型.
5.转换Checked Exception到UnChecked Exception.
EncodeUtils,集成了大部分的编码解码需求,包括Base64/Base64URLSave, Hex, Url Encode, Html/Xml Escape. WebUtils, Servlet编程常用的工具类辅助函数,特别是对缓存控制,Etag判断的支持。