Glassfish4日志轮换“最大历史文件”问题

时间:2014-12-19 06:25:01

标签: glassfish-4

环境: Glassfish 4.0(只有一个DAS),Windows Server 2012 R2,Java 1.7.0_51 使用create-service子命令创建DAS实例服务。

问题: 已设置最大历史记录文件属性,但由于锁定文件server.log.lck,Glassfish Server无法删除旧的日志文件

路径 - > C:\ glassfish4 \ GlassFish的\域\ DOMAIN1 \设置\ logging.properties com.sun.enterprise.server.logging.GFFileHandler.maxHistoryFiles = 10

日志摘录:

[2014-12-10T18:00:39.372+0900] [glassfish 4.0] [SEVERE] [] [] [tid: _ThreadID=16 _ThreadName=Thread-5] [timeMillis: 1418202039372] [levelValue: 1000] [[
  java.util.logging.ErrorManager: 0: FATAL ERROR: COULD NOT DELETE LOG FILE.]]

[2014-12-10T18:00:39.372+0900] [glassfish 4.0] [SEVERE] [] [] [tid: _ThreadID=16 _ThreadName=Thread-5] [timeMillis: 1418202039372] [levelValue: 1000] [[
  java.io.IOException: Could not delete log file: C:\glassfish4\glassfish\domains\domain1\logs\server.log.lck
    at com.sun.enterprise.server.logging.GFFileHandler.cleanUpHistoryLogFiles(GFFileHandler.java:725)
    at com.sun.enterprise.server.logging.GFFileHandler$4.run(GFFileHandler.java:802)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.enterprise.server.logging.GFFileHandler.rotate(GFFileHandler.java:744)
    at com.sun.enterprise.server.logging.GFFileHandler$1.run(GFFileHandler.java:301)
    at com.sun.enterprise.server.logging.LogRotationTimerTask.run(LogRotationTimerTask.java:68)
    at java.util.TimerThread.mainLoop(Timer.java:555)
    at java.util.TimerThread.run(Timer.java:505)]]

调查结果:

1,如果日志文件夹中存在锁定文件“server.log.lck”,则会出现问题,并且每当Glassfish服务器尝试删除旧日志文件时,都可以在日志中找到上述错误。如果日志文件夹中没有“server.log.lck”,则没有任何问题并且正常工作。

2,如果通过命令“asadmin start-domain domain1”启动DAS实例,则日志文件夹中不会生成锁定文件“server.log.lck”。但是如果在Windows服务中启动DAS实例,则会自动生成锁定文件“server.log.lck”并保留0KB直到停止服务,此文件将自动删除。

3,如果DAS实例由添加了watchdog选项的“asadmin start-domain -w domain1”命令启动,则将自动生成锁定文件“server.log.lck”,直到停止服务为止。

4,当出现锁定文件“server.log.lck”时,总会有一个java.exe进程存在。因此,从Windows服务启动DAS实例时,进程中运行两个“java.exe”,其中一个使用“server.log.lck”。

问题:

1,我想通过Windows服务启动/停止DAS实例,而不是使用子命令。此外,我不想将所有Glassfish日志保留在我的服务器上,这将导致磁盘已满问题,因此我更愿意打开Glassfish日志记录最大历史文件选项。有没有解决方法或解决方案呢?

2,这是Glassfish的缺陷还是仅仅是一个设置问题?我确实尝试在其他服务器上安装,但都有同样的问题。

3,为什么从Windows Server启动时有两个运行的java.exe进程是第二个用于“看门狗”的进程?

非常感谢您的帮助,如果您想了解更多信息或希望我做其他测试,请告诉我。

1 个答案:

答案 0 :(得分:1)

如果有人还在努力,我找到了解决方案。 通过asadmin create-service在Windows环境中创建GF服务时,GF会在domain1Service.xml中创建一个文件glassfish\domains\domain1\bin,其中包含要启动服务器的参数。 它看起来像下面的

    <service>
      <id>domain1</id>
      <name>domain1 GlassFish Server</name>
      <description>GlassFish Server</description>
      <executable>C:/Supertel-NMSv3/glassfish-4.1/glassfish/lib/nadmin.bat</executable>
      <logpath>C:\\Supertel-NMSv3\\glassfish-4.1\\glassfish\\domains/domain1/bin</logpath>
      <logmode>reset</logmode>
      <depend>tcpip</depend>
      <startargument>start-domain</startargument>
          <startargument>--watchdog</startargument>
      <startargument>--domaindir</startargument>
          <startargument>C:\\Supertel-NMSv3\\glassfish-4.1\\glassfish\\domains</startargument>
      <startargument>domain1</startargument>
          <stopargument>stop-domain</stopargument>
      <stopargument>--domaindir</stopargument>
          <stopargument>C:\\Supertel-NMSv3\\glassfish-4.1\\glassfish\\domains</stopargument>
      <stopargument>domain1</stopargument>
    </service>         

<startargument>--watchdog</startargument>负责启动监视程序进程,以防止删除日志文件。 你不能只删除这个startargument部分(该服务不会开始),但你可以通过设置false这样的标志来关闭它

<startargument>--watchdog=false</startargument>

之后,服务将通过手动启动域命令启动,无需看门狗进程。 你应该在每次创建服务后都这样做,这可能非常烦人,所以我做了进一步的研究。 事实证明,asadmin通过使用位于glassfish\lib\install\templates的模板创建特定于操作系统的domainService.xml。这些模板也是特定于操作系统的。 Windows的模板(名为Domain-service-winsw.xml.template)看起来像这样

    <service>
      <id>%%%NAME%%%</id>
      <name>%%%DISPLAY_NAME%%%</name>
      <description>GlassFish Server</description>
      <executable>%%%AS_ADMIN_PATH%%%</executable>
      <logpath>%%%LOCATION%%%/%%%ENTITY_NAME%%%/bin</logpath>
      <logmode>reset</logmode>
      <depend>tcpip</depend>
      <startargument>%%%START_COMMAND%%%</startargument>
      <startargument>--watchdog</startargument>
      %%%CREDENTIALS_START%%%%%%LOCATION_ARGS_START%%%<startargument>%%%ENTITY_NAME%%%</startargument>
      <stopargument>%%%STOP_COMMAND%%%</stopargument>
      %%%CREDENTIALS_STOP%%%%%%LOCATION_ARGS_STOP%%%<stopargument>%%%ENTITY_NAME%%%</stopargument>
    </service>

因此,您可以通过设置参数--watchdog=false直接编辑模板,此更改将反映在将来创建的所有文件中domainService.xml

希望它有所帮助。