• 締切済み

Log4jで機能毎に別ファイルへ出力する方法

こんにちは。 Log4jで複数のログファイルを出力する方法について質問させてください。 やりたい事としては・・・ WebアプリケーションからLog4jを使用して、ログ出力する際に サブアプリAからはsub-A.log サブアプリBからはsub-B.log などとログファイルを出力させたいと思っています。 Log4j.xmlでappenderタグを複数定義すれば良いだけかも知れませんが Java側でどうやって別のログオブジェクトを生成するのかが分かりません。 どの様にして別のオブジェクトの取得が出来るのでしょうか? それとも見当違いのことを質問していますでしょうか? よろしくご教授ください。 これが実現できれば… SQLだけのログ(DBバックアップ用) 例外だけのログ(監視用) などの用途に使えるのかと思っています。 よろしくお願いします。

みんなの回答

回答No.2

ソース上で、Log4jを使用するとき、 (1)private static Logger logger = Logger.getLogger(クラス名.class); または、 (2)private static Logger logger = Logger.getLogger(クラス名.class.getName()); と、ログ出力用にstaticインスタンスを生成していると思います。 Logger.getLogger(Class)は、内部でLogger.getLogger(String)を呼んでいるので、 この(2)のパターンで話を進めます。この引数で渡すStringによって ログインスタンスに名前を与えることになります。この名前決めがLog4jでは重要で、ログの出力先を分けたり、出力するしないを決めたりします。 log4j.xmlでは、 <appender>要素 と <category>要素 を設定します。 <appender>要素 は、出力について決めます。リソースはファイルなのか?コンソールなのか?メールなのか?どんな書式で出力するのか?などです。 複数のファイルに出力するなら、FileAppender系のappenderを複数用意して、それぞれ異なるname属性を与えます。 一方、<category>要素 は、どのログとappenderを紐付けるか設定します。 <appender-ref>要素で、参照するappenderをref属性で指定します。複数あれば(コンソールに出しつつ、ファイルに出すとか)、<appender-ref>要素を並べます。 「どのログ」との紐付けは、<category>要素のname属性で指定します。 このname属性 で指定した文字列が Logger.getLogger(String) で指定したログ名称に「前方一致」すれば、紐付けされる仕組みというわけです。 この「前方一致」ということで重要で、通常、ログ名称は、パッケージ名を含んだ完全名称となりますね。で、クラス名は、"jp.co.会社名.大分類.中分類.・・.クラス名"になりますね。 なので、<category>要素のname属性に"jp.co.会社名.大分類1"と与えたら、jp.co.会社名.大分類1 パッケージ以下のクラスのログが有効になり、"jp.co.会社名.大分類1.中分類2"と与えたら、jp.co.会社名.大分類1.中分類2 パッケージ以下のクラスのログが有効になります。 このことから、パッケージ分けが機能単位、アプリ単位で分かれていれば、ログを有効にしたい、特定のログしか出力しないログファイルを作りたい、という要望に答えられます。 たとえば、下のような、log4j.xmlを組めば、test.log4j.daoパッケージ以下のクラスのログ(より正確には、名前が test.log4j.dao で始まるログ)だけが、ファイル dao.logに出力されます。 ちなみに<root>要素は、すべてのログについて設定になります。下の例では、すべてのログ(dao.logに出力したログも含めて)コンソールとファイルkanshi.logに出力されます。 ただし、<appender>要素は、<param name="threshold">要素によって、<category>要素、<root>要素は、<priority>要素によって、出力するログレベルの下限を設定しています。これによって、コンソールはすべてのログがでますが、dao.logにはinfo以上、kanshi.logにはerror以上のログしか出力されません。 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>  <!-- デバッグ用。   コンソールログを出力するConsoleAppenderとして定義。-->  <appender name="debugAppender"    class="org.apache.log4j.ConsoleAppender" >   <!-- ログレベル:INFO以上 -->   <param name="threshold" value="INFO"/>   <!-- ログの出力形式を指定 -->   <layout class="org.apache.log4j.PatternLayout">    <param name="ConversionPattern"     value="%d %-5p [%t] (%F:%L) - %m%n"/>   </layout>  </appender>  <!-- DAO用 appender -->  <appender name="daoAppender"    class="org.apache.log4j.DailyRollingFileAppender">   <!-- ログのファイル名 -->   <param name="file" value="sql.log" />   <!-- ログレベル:DEBUG以上 -->   <param name="threshold" value="DEBUG" />   <!-- すでにログが存在する場合、ファイルにログを追加 -->   <param name="append" value="true" />   <!-- ログの出力形式を指定 -->   <layout class="org.apache.log4j.PatternLayout">    <param name="ConversionPattern" value="%c, %p, %d, %m%n" />   </layout>  </appender>  <!-- 監視用 appender -->  <appender name="kanshiAppender"    class="org.apache.log4j.DailyRollingFileAppender">   <!-- ログのファイル名 -->   <param name="file" value="kanshi.log" />   <!-- ログレベル:ERROR以上 -->   <param name="threshold" value="ERROR" />   <!-- すでにログが存在する場合、ファイルにログを追加 -->   <param name="append" value="true" />   <!-- ログの出力形式を指定 -->   <layout class="org.apache.log4j.PatternLayout">    <param name="ConversionPattern" value="%c, %p, %d, %m%n" />   </layout>  </appender>  <!-- DAO用ログのカテゴリ -->  <category name="test.log4j.dao">   <priority value="info" />   <appender-ref ref="daoAppender"/>  </category>  <!-- すべてのログ -->  <root>   <priority value="debug" />   <appender-ref ref="debugAppender" />   <appender-ref ref="kanshiAppender" />  </root> </log4j:configuration> もし、パッケージ分けではどうしても、ログの区分けがしづらい場合には、名称に区分けが判るプレフィックスをつけた Loggerインスタンスを生成します。 private static Logger logger = Logger.getLogger("プレフィックス" + クラス名.class.getName()); そして、設定ファイル側も、<category name="プレフィックス"> といった形で、そのプレフィックスがついているログを受け持つカテゴリを設定します。

全文を見る
すると、全ての回答が全文表示されます。
noname#33813
noname#33813
回答No.1

log4j.xmlで設定したことはないのですが、 log4j.propertiesで ・log4j.logger.sub-A=DEBUG,stdout ・log4j.logger.sub-B=DEBUG,stdout としていたら ・Logger loggerA = Logger.getLogger("sub-A") ・Logger loggerB = Logger.getLogger("sub-B") でそれぞれの設定が使われますよ。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Javaでlog4jを使ってログ出力を行っています。

    Javaでlog4jを使ってログ出力を行っています。 環境は以下の通りです。 j2sdk1.4.2 log4j1.2.8 log4j.xml内で指定したログファイル(test.log)を別のアプリで開いた状態で Javaプログラムを実行するとコンソールに以下のエラーが出力されます。 【エラー発生処理】 DOMConfiturator.configure(log4j.xml); 【エラー内容】 log4j:ERROR setFile(null, true) call failed java.io.FileNotFoundException : test.log(プロセスはファイルにアクセスできません。 別のプロセスが使用中です。) ファイルを開いているために書き込めず、エラーになってしまうのは良いのですが、 ログを出力しないだけで処理自体は続行してしまいます。 (ログを書き込めなかったらそこで処理を終了したいです。) 「書き込めなかった場合に例外をcatchする」等のことは可能でしょうか?

    • ベストアンサー
    • Java
  • log4jでログファイルに出力されないです。

    log4jでログファイルに出力されないです。 ただ、まったく出力されないわけではなく、特定のWebアプリから出力されていないようです。 複数のWebアプリケーションから、同じログファイルapp.logに書き込むようlog4j.propertiesに設定しています。 もしかして、これがよくないのでしょうか。 ひとつのWebアプリケーションがログファイルを確保したら、ほかのWebアプリケーションはもう書き込みができないのでしょうか? どうか、よろしくお願いいたします。

    • ベストアンサー
    • Java
  • java log4jの環境設定

    調べてみたのですが、参考になるページが見当たらなかったので(私が理解できなかっただけかもしれませんが。。) ご質問させていただきます。 表題の件です。javaのサーブレットを用いてログ出力する為にlog4jを使用しています。 そのため、log4j.xmlにファイルの出力先やらなんやらを記述しています。(これが通常だと思います) tomcatのWEBアプリケーションパッケージですので、DB接続等の設定は「META-INF/context.xml」に記述(Javaアプリ側で名前解決してDatasourceとして取得)しています。 上記からDB接続情報、ログの出力先情報はそれぞれ別ファイル(XML)から取得していますが、環境依存する値なので、編集するならひとつのファイルから行いたいです。 できれば、log4jのファイル出力先情報等をcontext.xmlにて記述して解決したいです。 (理由:tomcat6/servlet2.5を使用しており、tomcat6のdbcpを使用してコネクションプーリングしている為、DB接続の方法は変更したくない為) 以上、ご存知の方ご教授お願いできますでしょうか。

    • ベストアンサー
    • Java
  • log4jの機能について

    log4jに関して2点質問があります 1. log4jを利用して日付でローテーションしたいのですが   DailyRollingFileAppender を使用したいのですが最大ファイル数が設定できないため   ログファイルが無限に増えていくようです。検索してみると、自分でAppenderを作成して   いたりする人もいましたが(古いバージョンのlog4jにて)現在のバージョンでも   日付ローテーションで最大ファイル数がしていできるAppenderは用意されていないの   でしょうか。 2.機能ごとに出力するファイルを変えたいと思い log4j.properties に   以下設定を書いてみました(Aだけならちゃんと動くことは確認できましたが   設定Aと設定Bを共存させるとうまくうごかない)。   そもそもなんですがプロパティファイルにAとBの設定を書いて   Javaのクラス側では設定Aでログを出力するかBを出力するかはどうやって   決めればよろしいでしょうか。また、設定Aと設定Bを使い分けるためにはプロパティファイルの   記述はどう書けばよろしいでしょうか。    log4j.rootCategory=INFO,A,B ##設定A log4j.appender.A=org.apache.log4j.RollingFileAppender log4j.appender.A.File=/log/TestLog.log log4j.appender.A.MaxFileSize=200MB log4j.appender.A.MaxBackupIndex=10 log4j.appender.A.Append=true log4j.appender.A.layout=org.apache.log4j.PatternLayout log4j.appender.A.layout.ConversionPattern=%d %5p %c{1} - %m%n ##設定B log4j.appender.B=org.apache.log4j.RollingFileAppender log4j.appender.B.File=/log/TestLog2.log log4j.appender.B.MaxFileSize=200MB log4j.appender.B.MaxBackupIndex=10 log4j.appender.B.Append=true log4j.appender.B.layout=org.apache.log4j.PatternLayout log4j.appender.B.layout.ConversionPattern=%d %5p %c{1} - %m%n

    • ベストアンサー
    • Java
  • Javaでlog4jを使ってログを出力させてます。

    Javaでlog4jを使ってログを出力させてます。 複数のログを出力したいので、同一propertiesに複数のAppenderを定義しています。 内容は以下の通りです。 log4j.logger.processA=DEBUG, A log4j.appender.A=org.apache.log4j.DailyRollingFileAppender log4j.appender.A.File=a.log log4j.appender.A.DatePattern='.'yyyy-MM-dd-HH-mm log4j.appender.A.Append=true log4j.appender.A.layout=org.apache.log4j.PatternLayout log4j.appender.A.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss} %-5p %c - %m%n log4j.logger.processB=DEBUG, B log4j.appender.B=org.apache.log4j.DailyRollingFileAppender log4j.appender.B.File=b.log log4j.appender.B.DatePattern='.'yyyy-MM-dd-HH-mm log4j.appender.B.Append=true log4j.appender.B.layout=org.apache.log4j.PatternLayout log4j.appender.B.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss} %-5p %c - %m%n log4j.logger.processC=DEBUG, C log4j.appender.C=org.apache.log4j.DailyRollingFileAppender log4j.appender.C.File=c.log log4j.appender.C.DatePattern='.'yyyy-MM-dd-HH-mm log4j.appender.C.Append=true log4j.appender.C.layout=org.apache.log4j.PatternLayout log4j.appender.C.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss} %-5p %c - %m%n processAやらprocessB、processCは同一サーバ内で非同期で動くプロセスです。 つまり、動作するプロセス毎にログ出力先を変えてます。 各プロセスを動かすと、ちゃんと想定したログファイルに出力されるんですが、 ローテートの時に「log4j:ERROR Failed to rename ~」のエラーが出て、 正常にローテートしません。 なぜだろうと思って、一度全てのログファイルを削除して、 processAだけ動かしてみました。 すると、a.logだけが出力されると思いきや、 b.logとc.logまで0kbではありますが出力されたんです。 つまり、データこそ出力しないけど、 他プロセスで出力するファイルをロックしてたんです。 これって、同一propertiesに書いているのが悪いんでしょうか? それとも、設定が不足している為、そうなってしまってるんでしょうか? ご存知の方、お知恵をお貸し下さい。

    • ベストアンサー
    • Java
  • log4jのログ出力先について

    log4jを使用してログ出力しています。 log4j.xmlはWEB-INFの下に設定してあります。 現在、ログの出力先がtomcatの直下になっています。 それをWEB-INFの配下辺りに出したいのですがどうしたらいいのでしょうか? なぜtomcatの下でログが出力されるようになっているのでしょうか? すいません、教えてください。

    • ベストアンサー
    • Java
  • Log4jでログ生成時の日時付きファイル名

    Javaプログラムの実行履歴をLog4jに記録させたいのですが、 このプログラムは常に動いているものではなく、月に2回バッチで動かすのと、 DBからデータが必要になった時に手動で実行(同じく月2回程度)するものです。 プログラムを実行したタイミングでログファイルを新たに生成して、且つ ファイル名のプレフィックス(orポストフィックス)にログファイル生成時の日時を付加したいのですが、 log4j.xmlにはどのように記述すれば良いでしょうか?? (別途Javaファイルが必要であればそれも。) また、上記の事を説明しているサイトのURLなどあれば教えてください。

    • ベストアンサー
    • Java
  • log4jでのエラーコード

    log4jを使用してWEBシステムを開発しています。 log4jで出力するエラーメッセージを、設定ファイルに記述しておくことはできるのでしょうか。 複数のモジュールから出力されるエラーメッセージを統一するために、 xmlなどの形で設定を行うことができれば。。。と考えています。 宜しくお願い致します。

  • log4j.xmlファイルの読込で。。。

    log4Jの設定ファイルの読込を DOMConfigurator.configure("log4j.xml"); とJavaで記述していますが以下のエラーが表示されます。 log4j:ERROR Could not parse file [log4j.xml]. java.io.FileNotFoundException: C:\WINDOWS\System32\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 org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(Unknown Source) at org.apache.xerces.impl.XMLVersionDetector.determineDocVersion(Unknown Source) atorg.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) at org.apache.xerces.parsers.DOMParser.parse(Unknown Source) at org.apache.xerces.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 HttpTestServlet.doPost(HttpTestServlet.java:31) どこに原因があるのかわかりませんので、 どなたかわかる方がいらっしゃいましたらご指摘願います。

  • [log4j]ログ出力クラスでのメソッド名出力方法

    お世話になっております。 現在log4jを使用したログの出力を検討しております。 その中で1点質問させてください。 Javaの初心者のため、質問がわかりにくいかもしれません。 申し訳ございません。 【質問】 クラスAのinit処理の中でログ出力用クラスBをインスタンス化し、 クラスAのメソッドCの中で、ログ出力用クラスBのログ出力メソッドDを実行することでログ出力させる方法を考えております。 ここでメソッドDで出力させるログの中にメソッドCの名前を出力させたいのですが、 方法がわかりません。 わかる方、教えていただけないでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • Java