Java堂  


修改Spark的默认字体大小

归档在: JavaPlateform — Jet @ 5:56 上午
Tags:
原文出处: http://www.javatang.com/archives/2008/07/13/5634273.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

Spark是目前使用最多的Jabber客户端,最新的版本中已经提供了简体中文语言包,但是因为默认情况下Spark中使用的字号为11,所以中文汉字显示的非常难看。
spark默认界面

如果显示正常的话就需要将字号低于12的修改为12。首先在Spark源代码中查找 new Font 关键词,将所有设置为12以下的修改为12;然后打开 org.jivesoftware.Spark ,将其中的

  1. SyntheticaLookAndFeel.setFont("Dialog", 11);

修改为

  1. SyntheticaLookAndFeel.setFont("Dialog", 12);

重新编译之后就显示正常了。
显示正常的Spark

使用DWR出现“例外被抛出且未被接住”错误的原因和解决办法

归档在: DynamicLanguage, JavaPlateform, RIA — Jet @ 8:19 上午
Tags:
原文出处: http://www.javatang.com/archives/2008/07/10/1954272.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

DWR提供了两个js文件:engine.js和util.js,通常来说我们都是动态来引用这两个js文件,在官方的例子中也是这样做的(其中dwr是mapping时的路径):

  1. <script type="text/javascript" src="/dwr/engine.js"></script>
  2. <script type="text/javascript" src="/dwr/util.js"></script>

但是根据页面优化原则,我们如果将所有的js文件进行压缩整合在一起的话将会极大的减少页面加载的时间。但是当我们将上面的两个js文件下载下来然后跟其他js文件整合压缩之后,访问页面的时候会出现一个“例外被抛出且未被接住”的脚本错误。

用百度搜索了一下基本只搜到一篇名为《dwr应用时请注意(初学者)》的文章,文章中建议使用他在附件中所提供的dwr.jar包。但是作者所提供的dwr版本有些低,另外作者并没有在文章中说明造成问题的原因。

后来将异常转换为英文 Exception thrown and not caught 在google中搜索了一下,得知是因为没有在页面中动态引用engine.js,因为dwr在运行的时候需要动态控制这个文件。

但是这样的话就达不到压缩engine.js文件的目的了,我无意中在官方看到一篇专门讲解怎样缓存engine.js文件的文章,下面我就将作者建议的做法说明如下:

首先使用动态加载engine.js文件,然后将该文件下载下来。打开下载下来的engine.js文件,然后将第226到242行之间的文字剪切下来,然后将dwr.jar包中的org/directwebremoting/engine.js文件内容删除,然后粘贴到该文件中并替换dwr.jar包中原来的engine.js文件,内容大致如下:

  1. dwr.engine._origScriptSessionId = "${scriptSessionId}";
  2. dwr.engine._sessionCookieName = "${sessionCookieName}";
  3. dwr.engine._allowGetForSafariButMakeForgeryEasier = "${allowGetForSafariButMakeForgeryEasier}";
  4. dwr.engine._scriptTagProtection = "${scriptTagProtection}";
  5. dwr.engine._defaultPath = "${defaultPath}";
  6. dwr.engine._pollWithXhr = "${pollWithXhr}";

这样就可以将下载下来的engin.js文件同其他文件进行压缩合并了,但是在页面中还必须动态引用engine.js:

  1. <script type="text/javascript" src="/dwr/engine.js"></script>

这样一来即压缩了engine.js文件中静态的部分,又使用了engine.js中的动态部分,并且最重要的是“例外被抛出且未被接住”异常也不会再出现了。

参考资料:
Caching engine.js

如何使用DWR2.0的注解功能

归档在: DynamicLanguage, JavaPlateform, RIA — Jet @ 8:56 上午
Tags: ,
原文出处: http://www.javatang.com/archives/2008/07/07/5648271.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

DWR2.0新增加了JDK5的注解(Annotation)功能,使用注解功能之后可以从很大程度上简化了原来的dwr.xml的配置,使用起来非常的方便。

一、配置DWR使用注解功能

如果让dwr使用注解功能需要在web.xml进行如下配置:

  1. <servlet>
  2.         <servlet-name>dwr-invoker</servlet-name>
  3.         <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
  4.         <init-param>
  5.             <param-name>debug</param-name>
  6.             <param-value>true</param-value>
  7.         </init-param>
  8.         <!-- 将设定注解的域对象和业务实现类放在下面列表中,中间使用逗号间隔 -->
  9.         <init-param>
  10.             <param-name>classes</param-name>
  11.             <param-value>
  12.                 com.javatang.domain.Book,
  13.                 com.javatang.bank.Bank,
  14.                 com.javatang.dao.BookDao
  15.             </param-value>
  16.         </init-param>
  17.     </servlet>
  18.     <servlet-mapping>
  19.         <servlet-name>dwr-invoker</servlet-name>
  20.         <url-pattern>/scripts/ajax/*</url-pattern>
  21.     </servlet-mapping>

这样设置之后就可以在dwr中使用注解了,非常的方便。

二、DWR提供的注解类型
经常用到的注解主要有:@RemoteProxy、@RemoteMethod、@DataTransferObject和@RemoteProperty。

1. @RemoteProxy和@RemoteMethod
@RemoteMethod对应于原来dwr.xml文件中的create标签,用于创建DWR所提供的远程方法;而@RemoteMethod对应于create标签中的 <include method=”"/>,用来指定所要暴露的方法名称。我们举例来说明:

  1. @RemoteProxy(name="bankFunctions")
  2. public class  Bank {
  3.  
  4.     @RemoteMethod
  5.     public void buy() {
  6.         // ...
  7.     }
  8. }

从上面可以看出,@RemoteProxy表示这个类将用于远程方法,而使用@RemoteMethod指定所要暴露的方法,没有使用@RemoteMethod的方法将不会显示在客户端。
上面的注释使用dwr.xml表示如下:

  1. <!DOCTYPE dwr PUBLIC
  2.     "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
  3.     "http://getahead.ltd.uk/dwr/dwr20.dtd">
  4. <dwr>
  5.     <allow>
  6.         <create creator="new" javascript="bankFunctions">
  7.             <include method="buy" />
  8.         </create>
  9.     </allow>
  10. </dwr>

如果使用Spring中的DAO活逻辑层则需要进行如下的设置:

  1. // BookDao
  2. @RemoteProxy(creator = SpringCreator.class,
  3.     creatorParams = @Param(name = "beanName", value = "bookDao"),
  4.     name="bookFunctions")
  5. public class  BookDao {
  6.  
  7.     @RemoteMethod
  8.     public void addBook(Book book) {
  9.         // ...
  10.     }
  11. }

通过指定@RemoteProxy中的creator类型为SpringCreator,然后在creatorParams指定对应的beanName名称。对应的dwr.xml文件如下:

  1. <!DOCTYPE dwr PUBLIC
  2.     "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
  3.     "http://getahead.ltd.uk/dwr/dwr20.dtd">
  4. <dwr>
  5.     <allow>
  6.         <create creator="spring" javascript="bookFunctions">
  7.             <param name="beanName" value="bookDao" />
  8.             <include method="addBook" />
  9.         </create>
  10.     </allow>
  11. </dwr>

2. @DataTransferObject和@RemoteProperty
@DataTransferObject对应于原来dwr.xml文件中的convert标签,用于转换Java对象;@RemoteProperty则对应于convert标签中的 <param name=”include” value=”" />。

举例说明一下:

  1. @DataTransferObject
  2. public class Book {
  3.     @RemoteProperty
  4.     private int id;
  5.  
  6.     @RemoteProperty
  7.     private String name;
  8.  
  9.     public Book() {
  10.     }
  11.  
  12.     public int getId() {
  13.         return id;
  14.     }
  15.  
  16.     public void setId(int id) {
  17.         this.id = id;
  18.     }
  19.  
  20.     public String getName() {
  21.         return name;
  22.     }
  23.  
  24.     public void setName(String name) {
  25.         this.name = name;
  26.     }
  27. }

@RemoteProperty可以放在JavaBean中的私有变量上面,也可以放在getXXX方法上面。另外如果想将JavaBean中所有的属性都暴露出来的话,不需要在任何属性上面添加@RemoteProperty注释就可以了。

上面的注释对应的dwr.xml文件如下:

  1. <!DOCTYPE dwr PUBLIC
  2.     "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
  3.     "http://getahead.ltd.uk/dwr/dwr20.dtd">
  4. <dwr>
  5.     <allow>
  6.         <convert converter="bean"
  7.             match="com.javatang.domain.Book">
  8.             <param name="include" value="id, name" />
  9.         </convert>
  10.         <!-- 或者用下面的方式也可以
  11.         <convert converter="bean" match="com.javatang.domain.Book" />
  12.         -->
  13.     </allow>
  14. </dwr>

关于具体每个注释使用的方法已经所包含的参数可以参考Java Doc。使用DWR2.0的注解极大的简化了原来dwr.xml的配置,非常的方便。

参考资料:
DWR Annotations
[原创]DWR Annotations and Spring
DWR Annotations 使用 SpringCreator

Spring+Velocity中模板路径的问题

归档在: JavaPlateform — Jet @ 1:54 下午
原文出处: http://www.javatang.com/archives/2008/06/26/5407270.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

在Spring中使用Velocity进行视图渲染的时候需要注意一个路径的设置问题。Spring本身提供了一个用于对Velocity进行设置的类,我们做如下设置:

  1. <bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
  2.         <property name="configLocation" value="/WEB-INF/velocity.properties" />
  3.         <property name="resourceLoaderPath" value="/WEB-INF/templates" />
  4.     </bean>

使用configLocation属性设置了velocity配置文件的路径及文件名,而resourceLoaderPath设置了模板文件所在的位置。这里我们看到,所有的设置路径都是基于网站根目录的。

这个时候对于velocity.properties中用于设置宏文件的velocimacro.library选项而言,他所对应的目录就是前面resourceLoaderPath中设置的目录了,比如我们可以设置如下:

  1. velocimacro.library = macro.vm

并且对于模板文件中#parse指令所包含的文件也是基于resourceLoaderPath中所设置的目录。

如果我们将resourceLoaderPath设置为网站跟目录,而模板文件放在了/WEB-INF/template下,这个时候velocimacro.library和#parse指令所包含的文件路径就是基于网站根目录了,例如有个section.vm文件放在了/WEB-INF/template目录下,这个时候在模板文件中必须写成#parse(”/WEB-INF/template/section.vm”)才可以,可以看出这样非常的麻烦。

因此我们不能想当然的将resourceLoaderPath设置为网站的根目录,而是直接指向模板文件所在的目录。或许你认为我这么说有些可笑,但是有的时候我们往往在这些看似不经意的问题上浪费时间。

JPA和Hibernate注解的继承问题

归档在: JavaPlateform, Web&Server — Jet @ 3:03 下午
Tags: ,
原文出处: http://www.javatang.com/archives/2008/06/19/0308269.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

UUID类型的主键字段是长度为32的字符类型,Hibernate中自带自动生成UUID类型的主键,但有的时候需要自定义长32的字符串最为主键值,因此这里就有了一个分类关系:系统自带的UUID和用户自定义的UUID都有一个共性,都是一个长32的字符。我们基于此创建一个继承体系。

  1. // UUIDBase.java
  2. @MappedSuperclass
  3. public abstract class UUIDBase {
  4.  
  5.     protected String id;
  6.  
  7.     @Id
  8.     @Column(nullable=false, updatable=false, length=32)
  9.     public String getId() {
  10.         return id;
  11.     }
  12.  
  13.     public void setId(String id) {
  14.         this.id = id;
  15.     }
  16. }
  1. // UUIDSystem.java
  2. @MappedSuperclass
  3. public abstract class UUIDSystem extends UUIDBase {
  4.     @Override
  5.     @GeneratedValue(generator="system-uuid")
  6.     @GenericGenerator(name="system-uuid", strategy="uuid")
  7.     public String getId() {
  8.         return id;
  9.     }
  10. }
  1. // UUIDCustom.java
  2. @MappedSuperclass
  3. public abstract class UUIDCustom extends UUIDBase {
  4.     @Override
  5.     @GeneratedValue(generator="custom-uuid")
  6.     @GenericGenerator(name="custom-uuid", strategy="package.IDGenerator")
  7.     public String getId() {
  8.         return id;
  9.     }
  10. }
  1. // POJO.java
  2. @Entity
  3. public class POJO extends UUIDCustom {
  4.     //...
  5. }

但是如果这样做的话如果对POJO进行操作的时候,会出现如下的异常:
org.hibernate.MappingException: Repeated column in mapping for entity

如果将UUIDBase修改如下:

  1. // UUIDBase.java
  2. @MappedSuperclass
  3. public abstract class UUIDBase {
  4.  
  5.     protected String id;
  6.  
  7.     @Id
  8.     @Column(nullable=false, updatable=false, length=32)
  9.     @GeneratedValue(generator="system-uuid")
  10.     @GenericGenerator(name="system-uuid", strategy="uuid")
  11.     public String getId() {
  12.         return id;
  13.     }
  14.  
  15.     public void setId(String id) {
  16.         this.id = id;
  17.     }
  18. }

这个时候无论子类中getId()方法使用什么注解都是无效的,最终主键还是按照父类的主键生成器。

为了避免出现这样的错误,建议将主键的注解一步到位,不要使用继承扩展的方式。

本站发布包含索引功能的《CSS 2.0中文手册》

归档在: JavaPlateform — Jet @ 5:56 上午
原文出处: http://www.javatang.com/archives/2008/01/04/5606255.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

在目前广泛使用的苏沈小雨制作的《CSS 2.0中文手册》的基础上增加了索引功能,具体信息及下载请访问 CSS Handbook.

css20handbook.png

由MyEclipse内存不足谈谈JVM内存

归档在: JavaPlateform, Tools — Jet @ 3:16 下午
原文出处: http://www.javatang.com/archives/2007/12/03/1653250.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

如果没有进行设置的话,在使用MyEclipse的经常出现如下图所示内存不足的提示。
myeclipse.png
提示中说的很明白:“MyEclipse has detected that less than 5% of the 64MB of Perm Gen (Non-heap memory) space remains.”意思是说当前只有小于5%的非堆内存是空闲的。所以我们只要将这个值设置大一些就可以了。

提示中给出了设置的参数:

  1. -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M

这里有几个问题:
1. 各个参数的含义什么?
2. 为什么有的机器我将-Xmx和-XX:MaxPermSize都设置为512M之后Eclipse可以启动,而有些机器无法启动?
3. 为何将上面的参数写入到eclipse.ini文件Eclipse没有执行对应的设置?

下面我们一一进行回答

1. 各个参数的含义什么?

参数中-vmargs的意思是设置JVM参数,所以后面的其实都是JVM的参数了,我们首先了解一下JVM内存管理的机制,然后再解释每个参数代表的含义。

  • 堆(Heap)和非堆(Non-heap)内存
    按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中。
  • 堆内存分配
    JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。
  • 非堆内存分配
    JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。
  • JVM内存限制(最大值)
    首先JVM内存限制于实际的最大物理内存(废话!呵呵),假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制,这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制了。
  • 2. 为什么有的机器我将-Xmx和-XX:MaxPermSize都设置为512M之后Eclipse可以启动,而有些机器无法启动?

    通过上面对JVM内存管理的介绍我们已经了解到JVM内存包含两种:堆内存和非堆内存,另外JVM最大内存首先取决于实际的物理内存和操作系统。所以说设置VM参数导致程序无法启动主要有以下几种原因:

    1) 参数中-Xms的值大于-Xmx,或者-XX:PermSize的值大于-XX:MaxPermSize;

    2) -Xmx的值和-XX:MaxPermSize的总和超过了JVM内存的最大限制,比如当前操作系统最大内存限制,或者实际的物理内存等等。说到实际物理内存这里需要说明一点的是,如果你的内存是1024MB,但实际系统中用到的并不可能是1024MB,因为有一部分被硬件占用了。

    3. 为何将上面的参数写入到eclipse.ini文件Eclipse没有执行对应的设置?

    那为什么同样的参数在快捷方式或者命令行中有效而在eclipse.ini文件中是无效的呢?这是因为我们没有遵守eclipse.ini文件的设置规则:

    参数形如“项 值”这种形式,中间有空格的需要换行书写,如果值中有空格的需要用双引号包括起来。比如我们使用-vm C:\Java\jre1.6.0\bin\javaw.exe参数设置虚拟机,在eclipse.ini文件中要写成这样:

    1. -vm
    2. C:\Java\jre1.6.0\bin\javaw.exe

    按照上面所说的,最后参数在eclipse.ini中可以写成这个样子:

    1. -vmargs
    2. -Xms128M
    3. -Xmx512M
    4. -XX:PermSize=64M
    5. -XX:MaxPermSize=128M

    实际运行的结果可以通过Eclipse中“Help”-“About Eclipse SDK”窗口里面的“Configuration Details”按钮进行查看。

    另外需要说明的是,Eclipse压缩包中自带的eclipse.ini文件内容是这样的:

    1. -showsplash
    2. org.eclipse.platform
    3. --launcher.XXMaxPermSize
    4. 256m
    5. -vmargs
    6. -Xms40m
    7. -Xmx256m

    其中–launcher.XXMaxPermSize(注意最前面是两个连接线)跟-XX:MaxPermSize参数的含义基本是一样的,我觉得唯一的区别就是前者是eclipse.exe启动的时候设置的参数,而后者是eclipse所使用的JVM中的参数。其实二者设置一个就可以了,所以这里可以把–launcher.XXMaxPermSize和下一行使用#注释掉。

    参考资料:
    JDK5.0垃圾收集优化之–Don’t Pause
    提问:如何超越JVM内存限制?
    MemoryMXBean (Java 2 Platform SE 5.0)
    MyEclipse/Eclipse的内存优化与内存不足的解决办法
    eclipse.ini文件的问题
    eclipse 为什么报错

    SWT Ribbon - 基于SWT开发的美丽界面

    归档在: JavaPlateform, Tools — Jet @ 1:56 下午
    Tags: ,
    原文出处: http://www.javatang.com/archives/2007/10/16/5646211.html
    作者: Jet Mah from Java堂
    声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

    下面是官方说明的翻译文本:

    尽管有些简陋,但SWF Ribbon的界面看上去有种似曾相识的感觉。该项目的目的是创建一个类似于Office2007的标签式工具栏,它是基于SWT的。因为受到跨系统的限制,它只能是最大限度地来模拟。

    程序现在只发布了用于测试的alpha版本,你可以下载jar文件源代码。请记住目前的版本很可能有很多bug!源代码中提供了一个例子用来演示组件的使用方法,我对此不再提供额外的帮助,如有问题请使用Nebula新闻组。

    关于组件运行中的截屏和信息请查看这里

    根据官方的说明,这个很漂亮的界面组件目前仅仅发布了测试版本,但是抵挡不住美丽的诱惑,建议大家先尝试一下,呵呵。

    ribbon_ss1.gif

    查找接口实现类的Eclipse插件

    归档在: JavaPlateform, Tools — Jet @ 5:40 下午
    原文出处: http://www.javatang.com/archives/2007/07/04/4045184.html
    作者: Jet Mah from Java堂
    声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

    implementors.png

    很多时候我们在研究一些程序的源代码时会遇到许多接口的实现类,但是在Eclipse中上溯查找的时候只能最终查到这个接口,而不能反过来直接查找接口的实现类。通常的办法就是查阅Java Doc,或者在源代码中直接查看到底使用了哪个实现类。

    但是通过Implementors 这个Eclipse插件就可以解决上面的问题了。这是一个专门用于查找接口方法实现类的工具,非常的方便和实用。

    1. 安装

    安装有两种方式,一种是直接下载插件(implementors package)然后手动安装到eclipse中,另外一种就是在Eclipse中直接使用 Eclipse update site: http://eclipse-tools.sourceforge.net/updates/。只要是使用过Eclipse的人应该都会安装插件,具体的安装细节就不再啰嗦了。

    需要说明的是必须下载一个适用于你所使用的Eclipse版本的插件,目前最新的版本对应如下:

    Latest version for Eclipse 2.1.x or Eclipse 3.0.x: v0.0.14
    Latest version for Eclipse 3.1+: v0.0.16

    2. 使用
    1) 查看实现接口方法的类:在接口中选中待实现的方法名称,然后右键选择 Open Implementation 即可打开实现该接口方法的类。如果有多个类则会跳出一个选择列表供选择;
    2) 查看实现类所实现的接口:在接口实现类中选择方法名称,然后右键选择 Open Interface 即可打开接口中的方法。

    参考资料:
    Eclipse插件之Implementors

    Apache和Resin产生大容量日志的解决办法

    归档在: JavaPlateform, Web&Server — Jet @ 8:15 上午
    Tags: ,
    原文出处: http://www.javatang.com/archives/2007/06/20/1513177.html
    作者: Jet Mah from Java堂
    声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

    昨天服务器上网站无故无法访问,重启Apache之后过一段时间又无法访问。后来无意间看到Apache的日志文件(access.log)竟然有7G多,赶紧删除之再重启Apache就OK了。但是总是这样也不是办法,如果时间一长忘记清空日志文件的话又会造成Apache死掉,另外之前Resin也产生过这样的问题。后来综合Google后的信息采用了如下的解决方法:

    1. Apache日志
    减少日志大小有两种方法,一种是修改日志记录级别,可以将默认的warn级别提升为error级别;

    1. LogLevel error

    另外一种方法就是将日志文件按照每天创建一个文件的方式产生,这样就不会将所有的信息写入到一个文件。在Linux下可以将 httpd.conf 中 CustomLog logs/access.log common 修改为:

    1. CustomLog "|/usr/local/apache/bin/rotatelogs /usr/local/apache/logs/%Y_%m_%d.access.log 86400 480" common

    Windows下没有rotatelogs这个工具,但是可以下载一个cronolog的软件,进入官方下载页面下载Win 32 version (ZIP file) 版本,将压缩包中的cronolog.exe解压缩到apache安装目录的bin目录下面,然后可以将CustomLog logs/access.log common 修改为:

    1. CustomLog "|bin/cronolog.exe logs/access%Y%m%d.log" combined

    这样可以达到同样的效果。需要说明的是再重启Apache之后原来的cronolog.exe进程不会自动关闭,这个应该是软件的bug。官方最新的更新日期是2002-01-24,而且最新的1.6.2 版本没有windows版本,所以要耐心等待了。

    2. Resin日志
    前段时间提到过因为Resin日志巨大的问题而导致出错,过了这几天又发现jvm.log文件达到1G的容量了,照这样下去如果忘记清空日志的话又会导致程序出错。无意间在一篇文章中看到这样一句话:

    Resin启动时通过bin目录下的wrapper.pl文件进行控制,我们可以修改这个文件来加一些参数……

    后来经过测试这样的启动方式是在Linux系统下,Windows下面修改这个文件是没有作用的。记得以前我在 Resin 3.x 经验总结文章中提到在Windows下设置jvm内存的时候可以使用下面的命令:

    1. httpd.exe -Xmn100M -Xms500M -Xmx500M

    是不是上面提到的wrapper.pl文件中的httpd参数都可以这样设置呢?后来在Resin官方的新闻组里面找到了这个配置参数:

    You can use -jvm-log logfile as an option to httpd.exe

    这样的话就可以设置Resin不产生jvm.log日志文件,因为里面的信息在web程序中通过log4j获得了。

    1. httpd -jvm-log NUL

    按照以下步骤重新按照Resin的NT服务:

    1. #1 停止Resin NT服务和Apache
    2. httpd -remove
    3. #2 安装Resin NT服务
    4. httpd -jvm-log NUL -install
    5. #3 重新启动Resin和Apache

    参考资料:
    解决Apache日志文件ACCESS.LOG日益膨胀的一个办法
    jvm.log workarounds
    resin的优化

    下一页 »