GlassFish4でSpringBootアプリを動かすと、アプリで設定したログファイルに無限にログが出力され、サーバーのディスクを使い切るという現象に遭遇しました。
いろいろ調べてもなかなか対処方法がありませんでしたが、困った時の「stack overflow」に似たようなことで質問が上がっていたので試したら無事解決したので、その手順を紹介します。
問題の現象
GlassFishにSpringBootアプリをwarでデプロイし、アプリが起動するとアプリで設定したログファイルに次のようなものが無限に出力される。
INFO [2016-11-08 16:59:28.375] unknown.jul.logger . ____ _ __ _ _
INFO [2016-11-08 16:59:28.397] unknown.jul.logger /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
INFO [2016-11-08 16:59:28.397] unknown.jul.logger ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
INFO [2016-11-08 16:59:28.397] unknown.jul.logger \\/ ___)| |_)| | | | | || (_| | ) ) ) )
INFO [2016-11-08 16:59:28.397] unknown.jul.logger ' |____| .__|_| |_|_| |_\__, | / / / /
INFO [2016-11-08 16:59:28.398] unknown.jul.logger =========|_|==============|___/=/_/_/_/
INFO [2016-11-08 16:59:28.398] unknown.jul.logger :: Spring Boot :: (v1.3.6.RELEASE)
INFO [2016-11-08 16:59:28.398] unknown.jul.logger 2016-11-08 16:59:28.375 INFO 2466 --- [ Thread-8] unknown.jul.logger : . ____ _ __ _ _
INFO [2016-11-08 16:59:28.398] unknown.jul.logger INFO [2016-11-08 16:59:28.375] unknown.jul.logger . ____ _ __ _ _
INFO [2016-11-08 16:59:28.398] unknown.jul.logger 2016-11-08 16:59:28.397 INFO 2466 --- [ Thread-8] unknown.jul.logger : /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
INFO [2016-11-08 16:59:28.398] unknown.jul.logger INFO [2016-11-08 16:59:28.397] unknown.jul.logger /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
INFO [2016-11-08 16:59:28.399] unknown.jul.logger 2016-11-08 16:59:28.397 INFO 2466 --- [ Thread-8] unknown.jul.logger : ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
INFO [2016-11-08 16:59:28.399] unknown.jul.logger INFO [2016-11-08 16:59:28.397] unknown.jul.logger ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
INFO [2016-11-08 16:59:28.399] unknown.jul.logger 2016-11-08 16:59:28.397 INFO 2466 --- [ Thread-8] unknown.jul.logger : \\/ ___)| |_)| | | | | || (_| | ) ) ) )
INFO [2016-11-08 16:59:28.399] unknown.jul.logger INFO [2016-11-08 16:59:28.397] unknown.jul.logger \\/ ___)| |_)| | | | | || (_| | ) ) ) )
INFO [2016-11-08 16:59:28.399] unknown.jul.logger 2016-11-08 16:59:28.397 INFO 2466 --- [ Thread-8] unknown.jul.logger : ' |____| .__|_| |_|_| |_\__, | / / / /
INFO [2016-11-08 16:59:28.400] unknown.jul.logger INFO [2016-11-08 16:59:28.397] unknown.jul.logger ' |____| .__|_| |_|_| |_\__, | / / / /
INFO [2016-11-08 16:59:28.400] unknown.jul.logger 2016-11-08 16:59:28.398 INFO 2466 --- [ Thread-8] unknown.jul.logger : =========|_|==============|___/=/_/_/_/
INFO [2016-11-08 16:59:28.400] unknown.jul.logger INFO [2016-11-08 16:59:28.398] unknown.jul.logger =========|_|==============|___/=/_/_/_/
INFO [2016-11-08 16:59:28.400] unknown.jul.logger 2016-11-08 16:59:28.398 INFO 2466 --- [ Thread-8] unknown.jul.logger : :: Spring Boot :: (v1.3.6.RELEASE)
INFO [2016-11-08 16:59:28.400] unknown.jul.logger INFO [2016-11-08 16:59:28.398] unknown.jul.logger :: Spring Boot :: (v1.3.6.RELEASE)
INFO [2016-11-08 16:59:28.400] unknown.jul.logger 2016-11-08 16:59:28.398 INFO 2466 --- [ Thread-8] unknown.jul.logger : 2016-11-08 16:59:28.375 INFO 2466 --- [ Thread-8] unknown.jul.logger : . ____ _ __ _ _
INFO [2016-11-08 16:59:28.401] unknown.jul.logger INFO [2016-11-08 16:59:28.398] unknown.jul.logger 2016-11-08 16:59:28.375 INFO 2466 --- [ Thread-8] unknown.jul.logger : . ____ _ __ _ _
INFO [2016-11-08 16:59:28.401] unknown.jul.logger 2016-11-08 16:59:28.398 INFO 2466 --- [ Thread-8] unknown.jul.logger : INFO [2016-11-08 16:59:28.375] unknown.jul.logger . ____ _ __ _ _
INFO [2016-11-08 16:59:28.401] unknown.jul.logger INFO [2016-11-08 16:59:28.398] unknown.jul.logger INFO [2016-11-08 16:59:28.375] unknown.jul.logger . ____ _ __ _ _
INFO [2016-11-08 16:59:28.401] unknown.jul.logger 2016-11-08 16:59:28.398 INFO 2466 --- [ Thread-8] unknown.jul.logger : 2016-11-08 16:59:28.397 INFO 2466 --- [ Thread-8] unknown.jul.logger : /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
INFO [2016-11-08 16:59:28.401] unknown.jul.logger INFO [2016-11-08 16:59:28.398] unknown.jul.logger 2016-11-08 16:59:28.397 INFO 2466 --- [ Thread-8] unknown.jul.logger : /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
INFO [2016-11-08 16:59:28.402] unknown.jul.logger 2016-11-08 16:59:28.398 INFO 2466 --- [ Thread-8] unknown.jul.logger : INFO [2016-11-08 16:59:28.397] unknown.jul.logger /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
INFO [2016-11-08 16:59:28.402] unknown.jul.logger INFO [2016-11-08 16:59:28.398] unknown.jul.logger INFO [2016-11-08 16:59:28.397] unknown.jul.logger /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
INFO [2016-11-08 16:59:28.402] unknown.jul.logger 2016-11-08 16:59:28.399 INFO 2466 --- [ Thread-8] unknown.jul.logger : 2016-11-08 16:59:28.397 INFO 2466 --- [ Thread-8] unknown.jul.logger : ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
INFO [2016-11-08 16:59:28.402] unknown.jul.logger INFO [2016-11-08 16:59:28.399] unknown.jul.logger 2016-11-08 16:59:28.397 INFO 2466 --- [ Thread-8] unknown.jul.logger : ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
GlassFishでLoggerが認識されていないのが原因のようです。
手順
GlassFishにあるファイルを編集する前にバックアップを取りましょう。
1.GlassFishが起動している場合、停止する
glassfish4/glassfish/bin/asadmin stop-domain domain1
2.GlassFIshのlibディレクトリにlogback・slf4jライブラリを配置する
glassfish4/glassfish/lib/endorsed
jul-to-slf4j-x.x.x.jar
slf4j-api-x.x.x.jar
logback-core-x.x.x.jar
logback-classic-x.x.x.jar
3.GlassFishのconfigディレクトリにlogback.xmlを配置し、次のように定義する
vi glassfish/domains/domain1/config/logback.xml
logback.xml
<configuration debug="true"scan="true"><appender name="FILE"class="ch.qos.logback.core.FileAppender"><file>log/server.log</file><append>true</append><encoder><Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{52} - %msg%n</Pattern></encoder></appender><root><level value="INFO"/><appender-ref ref="FILE"/></root></configuration>
4.GlassFishにある「logging.properties」の一部を書き換える
管理コンソールで変更している場合、変更した値になっているので注意して下さい。
vi glassfish4/glassfish/domain1/config/logging.properties
Before
handlers=java.util.logging.ConsoleHandler
handlerServices=com.sun.enterprise.server.logging.GFFileHandler
java.util.logging.ConsoleHandler.formatter=com.sun.enterprise.server.logging.UniformLogFormatter
com.sun.enterprise.server.logging.GFFileHandler.formatter=com.sun.enterprise.server.logging.ODLLogFormatter
com.sun.enterprise.server.logging.GFFileHandler.file=${com.sun.aas.instanceRoot}/logs/server.log
com.sun.enterprise.server.logging.GFFileHandler.rotationTimelimitInMinutes=0com.sun.enterprise.server.logging.GFFileHandler.flushFrequency=1java.util.logging.FileHandler.limit=50000com.sun.enterprise.server.logging.GFFileHandler.logtoConsole=falsecom.sun.enterprise.server.logging.GFFileHandler.rotationLimitInBytes=2000000com.sun.enterprise.server.logging.GFFileHandler.excludeFields=
com.sun.enterprise.server.logging.GFFileHandler.multiLineMode=truecom.sun.enterprise.server.logging.SyslogHandler.useSystemLogging=falsejava.util.logging.FileHandler.count=1com.sun.enterprise.server.logging.GFFileHandler.retainErrorsStasticsForHours=0log4j.logger.org.hibernate.validator.util.Version=warn
com.sun.enterprise.server.logging.GFFileHandler.maxHistoryFiles=0com.sun.enterprise.server.logging.GFFileHandler.rotationOnDateChange=falsejava.util.logging.FileHandler.pattern=%h/java%u.log
java.util.logging.FileHandler.formatter=java.util.logging.XMLFormatter
After
handlers=org.slf4j.bridge.SLF4JBridgeHandler handlerServices=com.sun.enterprise.server.logging.GFFileHandler
java.util.logging.ConsoleHandler.formatter=com.sun.enterprise.server.logging.UniformLogFormatter
com.sun.enterprise.server.logging.GFFileHandler.formatter=com.sun.enterprise.server.logging.ODLLogFormatter
com.sun.enterprise.server.logging.GFFileHandler.file=${com.sun.aas.instanceRoot}/logs/server.log com.sun.enterprise.server.logging.GFFileHandler.rotationTimelimitInMinutes=0com.sun.enterprise.server.logging.GFFileHandler.flushFrequency=1java.util.logging.FileHandler.limit=50000com.sun.enterprise.server.logging.GFFileHandler.logtoConsole=falsecom.sun.enterprise.server.logging.GFFileHandler.rotationLimitInBytes=2000000com.sun.enterprise.server.logging.GFFileHandler.excludeFields=
com.sun.enterprise.server.logging.GFFileHandler.multiLineMode=truecom.sun.enterprise.server.logging.SyslogHandler.useSystemLogging=falsejava.util.logging.FileHandler.count=1com.sun.enterprise.server.logging.GFFileHandler.retainErrorsStasticsForHours=0log4j.logger.org.hibernate.validator.util.Version=warn
com.sun.enterprise.server.logging.GFFileHandler.maxHistoryFiles=0com.sun.enterprise.server.logging.GFFileHandler.rotationOnDateChange=falsejava.util.logging.FileHandler.pattern=%h/java%u.log
com.sun.enterprise.server.logging.GFFileHandler.formatter=com.sun.enterprise.server.logging.UniformLogFormatter com.sun.enterprise.server.logging.GFFileHandler.alarms=false
5.GlassFishの「domain.xml」にJVMオプションを追加する
vi glassfish4/glassfish/domains/domain1/config/domain.xml
domain.xml
# <domain>
# <configs>
# <config name="server-config">
# <java-config>配下に追加する(250行目の次)
<jvm-options>-Djava.util.logging.config.file=${com.sun.aas.instanceRoot}/config/logging.properties</jvm-options><jvm-options>-Dlogback.configurationFile=file:///${com.sun.aas.instanceRoot}/config/logback.xml</jvm-options>
6.GlassFishを起動する
glassfish4/glassfish/bin/asadmin start-domain domain1