LogConfigurationException: User-specified log class ‘org.apache.commons.logging.impl.Log4JLogger’ cannot be found or is not useable.
問題
なぜかこういうエラーがいきなり発生するようになった。これまでは動作しており、何の変更もしてないのにいきなりである。
org.apache.commons.logging.LogConfigurationException: User-specified log class 'org.apache.commons.logging.impl.Log4JLogger' cannot be found or is not useable.
at org.apache.commons.logging.impl.LogFactoryImpl.discoverLogImplementation(LogFactoryImpl.java:804)
at org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:541)
at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:292)
at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:269)
at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:655)
at org.apache.http.conn.ssl.DefaultHostnameVerifier.<init>(DefaultHostnameVerifier.java:72)
at org.apache.http.impl.client.HttpClientBuilder.build(HttpClientBuilder.java:955)
.......
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:74)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:526)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1017)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:652)
at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1575)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1533)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Tomcatのサーブレットであるが、他のサーブレット、つまりwarファイルには様々な変更したが、この例外を出したwarファイルは一切いじっていないにもエラーになっている。
原因
いきなり出現した原因は不明だが、調べてみるとLog4Jがライブラリとして含まれていないことが明らかになった。
では、今までどうやって動いていたのだろうか???
tomcat側にLog4jがあり、これまではそれがwar側に見えていたということなのだろうか???
さっぱり事情がわからないのだが、とりあえず以下の二つを行なった。
- log4jをライブラリとして追加する。
- 最も簡単なcommons-logging + Log4jの使い方で見たように、サーブレットの実行開始時点で強制的にLog4jをプロパティに指定する。
どうも、commons-loggingは実行時にLog4jが見つかればそれを使うが、見つからなければお手上げになってしまうようだ。はなから、「きちんと指定しなければ駄目」という仕様になってくれていればこんなトラブルは起きようもなかったはずなのだが。。。。