catalina.out的大小控制说开去

     以前搜索过catalina.out tomcat产生的输出文件,是否可以通过tomcat自身配置的办法,达到限制它的大小,不然最终会变得超大或太大。现在回头看起来,当时有这样一个问题是非常可笑的。不过,也是早期处于的学习和理解阶段所致,呵呵。

 

     经过这么长时间的研究过程,我首先想告诉大家的是遇到这个问题时,你可以对自己进行两个反问,这样做,可能比我直接告诉你结果更能体会到知识的精妙:
1.此文件是如何产生的?
2.在操作系统意义上这个“文件”是一个什么文件?File磁盘文件、设备、Pipe?

 

对待这两个发问,我想告诉大家的是:
第一,如果这个文件是进程的输出文件的话,那么这个文件,我们很难让Tomcat自身限定的它的大小,因为它是作为tomcat的程序输出文件对待。除非有外部环境协调,自身一般不改变输入或者输出,这才是良好的程序遵循的原则。


第二,对于操作系统来讲,一个程序的输入和输出可以是多样的文件类型。不仅仅限定于File硬盘文件。程序的输出可以是另外一个程序的输出或另一个程序的输入,根据不同的场景可以由不同的变化,或者是设备或者是Pipe。各种文件类型有自己不同的限制,例如,屏幕输出文件一般具有固定的缓冲大小,新的将自动冲掉老的。

 

      但是,如果你的catalina.out是通过命令行的方式指定的话,在我的知识范围内只能告诉你,几乎没有办法限定它的大小。它只能随着Tomcat的日积月累的运行,最后变得越来越大,乃至于最后导致程序崩溃!  (我遇到一个问题就是程序输出文件写到最后形成2G的超大文件,最后导致程序运行异常)。

 

     更深一步来说,这种形式确定下来的输出文件,甚至于我们没有办法通过手工的办法删除catalina.out或者变更它的文件大小。对于一个程序来讲,这里更多地可以对应进程的概念,它的输出文件确定后,是不可变更的。而且这个文件描述符,根据unix环境高级编程的定义,它具有各自进程自己独立的当前写入位置,即使你改变它的文件大小,它也会从自己维护的位置开始写入(如果这个文件不是通过appand模式打开的话)。这样的自动行为,在很无奈的场景下,程序输出的信息会日积月累越来越长,最终将不可控制。在这个过程中,你的业务程序没有插手的机会,只有默默的输出。

 

    上面也说过,程序的输入和输出确实可以多样性,对于磁盘文件类型确实没有太好的办法。在我自己经历的一个软件中,通过java wrapper的程序实现一个java进程的console输出实际上被对应到一个文件上,而且这个文件总是能够保持当前最新日志,打印到固定的一个文件名中。神奇吧?神奇到让你对前面的介绍赶到怀疑,不是说不能这样做吗?请注意,请注意,这里仅是文件名字的一致,在实际对比中,你会发现这个具有同样名字的文件其实创建时间是多变的,它是不同的。这里确实很神奇,但也很有道理,呵呵!不过直到拿到问题的答案,这个问题也让我疑惑很久,难道出现鬼了不成?很久就对这个问题就已经很关注了,但是,一直没有时间和机会去找到它内部的机制。


    今天闲来无事,就研究了java wrapper的代码,才知道在这个过程中java wrapper通过父进程和子进程之间的关系,玩了一个魔法。Java Wrapper将JVM子进程的输出导向到一个Pipe中,我们知道操作系统是支持这种文件类型作为程序的输出的。然后java wrapper自己不断地尝试读这个Pipe,就可以保证将JVM的输出导向一个文件。而且由于有这个中间层的支持,有这样一个的机会,业务程序获得了一次截流和控制机会,则可以实现JVM输出到文件不仅仅可以满足文件名字上的不变化,而且可以实现文件大小控制和最多文件个数控制。

 

     与最初的场景不同的是,程序直接输出到Pipe,而且明显地加上业务处理代码,就产生了这里的明显变化。java wrapper将操作系统的自动机过程进行调整,在我看来对操作系统自动机服务的调整也反映了这个程序的处理能力,也就是我们人类强调的“改造自然的能力”,程序的这种能力,将自身证明了它的能力大为提升。

 

   从这两个例子的对比中,我们也可以明显看出来,如果clinata.out产生过程比较直接的话,我们确实没有办法对其限制大小,因为这这里面象铁桶一样毫无机会!一个控制机会,一个锲入的机会很重要,不然,你毫无办法!

 

    对于我们的程序设计也应该如此,留好可以控制的机会,你的使用者将很满意你的软件。

   

   对于tomcat来讲,避免将日志输出到固定文件clinata.out,将是一个好办法,例如,tomcat_start >   /dev/null   2>&1",。这样做了后,你的业务程序也要自己规划好自己的日志输出,不然,程序出现问题,你也一点办法 都没有,呵呵!

 

 ------------------------------------------------补遗

  "org.apache.catalina.logger.FileLogger" prefix="catalina."  suffix=".out" timestamp="true"/>

如果catalinaXX.out是这种性质产生的,则可以通过每天产生一个,但是,文件总数className所体现的类并没有控制,如果你想控制,则需要自己写一个类来实现,可以选择从org.apache.catalina.logger.FileLogger继承,因为tomcat要求这里的logger必须实现一个接口

 

 

你可能感兴趣的:(wrapper,tomcat,java,jvm,磁盘,file)