GlassFish4でSpringBootアプリを動かすと、アプリで設定したログファイルに無限にログが出力され、サーバーのディスクを使い切るという現象に遭遇しました。
いろいろ調べてもなかなか対処方法がありませんでしたが、困った時の「stack overflow」に似たようなことで質問が上がっていたので試したら無事解決したので、その手順を紹介します。
動作環境
SpringBoot | 1.3.6 |
---|---|
Logback | 1.1.7 |
SLF4j | 1.7.21 |
GlassFish | 4.1.1 Full Profile |
※GlassFishは、PayaraServer 163 Fullのdomain1を使用
問題の現象
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
<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
補足
SpringBootアプリには、「jul-to-slf4j」は含んでいません。
logback.xmlは、SpringBootのbase.xmlを読み込み、独自設定を追加しています。
application.propertiesの「logging.file」は、設定していません。
logging.properties(alarms以外)、jvm-optionは、管理コンソールの「server-config」で設定できます。
まとめ
ネットにあった内容をそのまま試して日本語に起こしただけです。
詳しいことは分からないので聞かないようにお願いしますw
この記事で関連する書籍

Java EE 7徹底入門 標準Javaフレームワークによる高信頼性Webシステムの構築
- 作者:寺田佳央,猪瀬淳,加藤田益嗣,羽生田恒永,梶浦美咲,小田圭二
- 出版社/メーカー:翔泳社
- 発売日: 2015/12/16
- メディア:大型本
- この商品を含むブログ (7件) を見る

Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発
- 作者:株式会社NTTデータ
- 出版社/メーカー:翔泳社
- 発売日: 2016/07/20
- メディア:Kindle版
- この商品を含むブログ (1件) を見る