- PR -

log4j設定ファイル log4j.xmlの設置場所

1
投稿者投稿内容
未記入
会議室デビュー日: 2007/01/01
投稿数: 2
投稿日時: 2007-01-01 19:17

Tomcat、Strutsを使用してWebアプリを作成しています。

そこで、log4jを使用して、ログをとろうと考えています


log4j設定ファイル log4j.xmlについてお聞きしたいのですが、

クラスから読み込むときに

DOMConfigurator.configure("./log4j.xml");

と指定するとファイルが見つかりませんとエラーがでます

エラーメッセージは

log4j:ERROR Could not parse file [./log4j.xml].
java.io.FileNotFoundException: C:\Program Files\All-In-One Eclipse\.\log4j.xml (指定されたファイルが見つかりません。)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(Unknown Source)
at java.io.FileInputStream.<init>(Unknown Source)
at sun.net.www.protocol.file.FileURLConnection.connect(Unknown Source)
at sun.net.www.protocol.file.FileURLConnection.getInputStream(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
at org.apache.log4j.xml.DOMConfigurator$1.parse(DOMConfigurator.java:598)
at org.apache.log4j.xml.DOMConfigurator.doConfigure(DOMConfigurator.java:711)
at org.apache.log4j.xml.DOMConfigurator.doConfigure(DOMConfigurator.java:604)
at org.apache.log4j.xml.DOMConfigurator.configure(DOMConfigurator.java:733)
at action.BunkatuTestAction.execute(BunkatuTestAction.java:22)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at encoding.EncodingFilter.doFilter(EncodingFilter.java:26)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Unknown Source)

といった感じです。

エラーが起きているにもかかわらず、設定ファイルで指定した場所にlogは作成されていました。

ファイルの指定を絶対パスにした場合はエラー等はなしでそのままできました。

サーバにデプロイする場合絶対パスではまずいと思うのです


何か解決方法があれば教えてください

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-01-01 22:43
引用:

未記入さんの書き込み (2007-01-01 19:17) より:

コード:

    C:\Program Files\All-In-One Eclipse\.\log4j.xml



そもそも、ここにファイルは存在しているのでしょうか。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
風晶
会議室デビュー日: 2005/10/08
投稿数: 5
お住まい・勤務地: 東京都立川市
投稿日時: 2007-01-02 18:18
"./log4j.xml"と指定されているようですが、log4j.xmlは実際どこにありますでしょうか。
例えばWebアプリの/WEB-INF/classes/直下にあるとすれば、log4j側で勝手に読み込んでくれる筈です。(LogManagerクラスのstaticブロックとか読めば、log4jが設定ファイルをどういった順番で探索するのか分かる・・・筈、です)

ちなみにWebアプリのServlet内から、"."や".."を "Webアプリのカレントディレクトリ" みたいな意識で使うことはできないと思います。Webサーバあるいはそれを動かしているJavaVMにとっての"."や".."なので、Webサーバの設定ディレクトリや実行ディレクトリ、JavaVMのディレクトリになっていたような気が・・・あ、ですからAll-In-One Eclipseのディレクトリが出てきたわけですか。
ServletContext#getRealPath()などから、URLに対応する物理PATHを取り出せるはずですので、調べてみて下さい。
未記入
会議室デビュー日: 2007/01/01
投稿数: 2
投稿日時: 2007-02-25 20:32
返事が遅れました。申し訳ありません。

返答ありがとうございます

アドバイス通りに

アプリの/WEB-INF/classes/直下に置いて

DOMConfigurator.configure("log4j.xml");

と記述しサーバにデプロイして実行してみたのですが、結果は


log4j:ERROR Could not parse file [log4j.xml].
java.io.FileNotFoundException: C:\apache-tomcat-5.5.17\bin\log4j.xml (指定されたファイルが見つかりません。)

C:\apache-tomcat-5.5.17\binにはファイルを置いていません

置いてある場所は

C:/apache-tomcat-5.5.17/webapps/WEB-API/WEB-INF/classes

にlog4j.xmlはおいてあります

何か設定が足りないのでしょうか?
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-02-25 21:12
DOMConfigurator.configure() の仕様を確認しましょう。
クラスパスからではなく、ファイルシステムから設定を読み込むメソッドなのではないでしょうか?
なので Tomcat の起動ディレクトリからファイルを読み込もうとしているのだと思います。
こくぼ
大ベテラン
会議室デビュー日: 2003/08/11
投稿数: 229
お住まい・勤務地: 国境の南、太陽の西。
投稿日時: 2007-02-25 21:47
https://svn.apache.org/repos/asf/logging/log4j/trunk/
log4jのコードを見てみたら、DOMConfigurator.configure()の中身はこうなってました。
コード:

final public void doConfigure(final String filename, final LoggerRepository repository) {
ParseAction action = new ParseAction() {
public void parse(final SAXParser parser, final DefaultHandler handler) throws SAXException, IOException {
parser.parse(new File(filename), handler);
}
};
doConfigure(action, repository);
}


new File(filename)しているから、起動ディレクトリに置かないとダメっぽいですね。
それかServletContext#getRealPath()使うか、Thread.currentThread().getContextClassLoader().getResource()を使うとか。

#というか、trunkではDOMConfiguratorは@deprecatedだけど…。


_________________
『Life's rich Tapestry!!』

[ メッセージ編集済み 編集者: こくぼ 編集日時 2007-02-25 21:50 ]
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-02-26 01:25
DOMConfigurator#configure(java.net.URL)
っていうメソッドもありますね。
コード:
ClassLoader loader = Thread.currentThread().getContextClassLoader()
DOMConfigurator.configure(loader.getResource("log4j.xml"));


もしくはDOMConfigurator#configure(String)の場合、
コード:
ServletContext context = getServletContext()
DOMConfigurator.configure(context.getRealPath("WEB-INF/classes/log4j.xml"));


で大丈夫でしょう。

私の場合は設定ファイルが、クラスパス上に配置されているのなら、
前者を採用し、WEB-INF直下なら後者を採用します。
1

スキルアップ/キャリアアップ(JOB@IT)