glycoinfo / GlycanBuilder2

7 stars 5 forks source link

FileNotFoundException occur when running the GlycanBuilder2 #56

Open e15d5605 opened 1 year ago

e15d5605 commented 1 year ago

GlycanBuilder2を実行すると、以下のエラーが必ず発生している。この課題ではFileNotFoundExceptionへの対応の経緯と原因、対策について整理する。

log4j:ERROR setFile(null,true) call failed.
java.io.FileNotFoundException: /srv/www/tomcat_production/MsdbWeb/hibernate.log (No such file or directory)
    at java.base/java.io.FileOutputStream.open0(Native Method)
    at java.base/java.io.FileOutputStream.open(FileOutputStream.java:292)
    at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:235)
    at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:156)
    at org.apache.log4j.FileAppender.setFile(FileAppender.java:294)
    at org.apache.log4j.FileAppender.activateOptions(FileAppender.java:165)
    at org.apache.log4j.config.PropertySetter.activate(PropertySetter.java:307)
    at org.apache.log4j.config.PropertySetter.setProperties(PropertySetter.java:172)
    at org.apache.log4j.config.PropertySetter.setProperties(PropertySetter.java:104)
    at org.apache.log4j.PropertyConfigurator.parseAppender(PropertyConfigurator.java:842)
    at org.apache.log4j.PropertyConfigurator.parseCategory(PropertyConfigurator.java:768)
    at org.apache.log4j.PropertyConfigurator.configureRootCategory(PropertyConfigurator.java:648)
    at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:514)
    at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:580)
    at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:526)
    at org.apache.log4j.LogManager.<clinit>(LogManager.java:127)
    at org.apache.log4j.Logger.getLogger(Logger.java:117)
    at org.eurocarbdb.application.glycanbuilder.ThemeManager.<clinit>(ThemeManager.java:22)
    at org.eurocarbdb.application.glycanbuilder.GlycanBuilder.<init>(GlycanBuilder.java:94)
    at org.eurocarbdb.application.glycanbuilder.GlycanBuilder.main(GlycanBuilder.java:894)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:567)
    at com.intellij.uiDesigner.snapShooter.SnapShooter.main(SnapShooter.java:58)
e15d5605 commented 1 year ago

このエラーはLoggerを初期化する時に渡されたログファイルのパスを、ファイルハンドラーで展開しようとして見つからなかったため発生している。Loggerは以下のクラスで実装されている。

GB2の起動時にログに関わるエラーが発生していたのは、インターフェイスを生成するThemeManagerでLoggerを初期化するためである。Loggerの初期化時にログファイルのパスが見つからずエラーを出力していた。このエラーが発生する他の条件を探ってみたところ、糖鎖構造の編集時にも同様のエラーが発生していたことを確認した。糖鎖構造の編集ではBookingManagerを呼び出している。ThemeManagerおよびBookingManagerの共通点として、いずれのクラスでもLoggerを初期化していた.。 一方で、ICON_PATHやLogUtilsは呼び出し箇所が非常に多く、条件を絞り込むことができていない。これらのクラスでもLoggerを初期化していたため、FileNotFoundExceptionの発生が予想される。

GB2実行時のFileNotFoundExceptionは開発初期の段階で確認していた。当時はエラーの原因や解決方法が全くわからなかったため対応することができなかった。GB2の利用者を混乱させないための応急処置として、上記のクラスのLoggerをコメントアウトして例外メッセージを出力するようにした。

e15d5605 commented 1 year ago

Loggerについて簡単に調査したところ、ログを出力するための設定やメッセージの構成をプロパティファイルで設定するようである。GlycanBuilder2の場合は、log4j.propertiesというファイルで以下のように設定されていた。

log4j.rootCategory=DEBUG, Appender1
log4j.appender.Appender1=org.apache.log4j.FileAppender
log4j.appender.Appender1.File=/srv/www/tomcat_production/MsdbWeb/hibernate.log
log4j.appender.Appender1.layout=org.apache.log4j.PatternLayout
log4j.appender.Appender1.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss.SSS} [%t] %-6p %m%n

FileNotFoundExceptionで表示されているファイルパスが以下のように設定されている。

log4j.appender.Appender1.File=/srv/www/tomcat_production/MsdbWeb/hibernate.log

予想ではあるが...このログファイルのパスは、GBをEurocarbに関わるサービスで公開していた時に設定されたと考えらられる。解決策として、GB2の直下にログを書き込むためのファイルを用意し、プロパティファイルで指定しているパスを変更することが挙げられる。しかしながら、ログのプロパティに関する知識が浅いため、もう少し調査が必要である。

e15d5605 commented 1 year ago

参考になりそうなサイト: