- PR -

Loggerをラップしたクラスだと出力される行がラップしたクラスの行になってしまうのを回避する方法はありま

1
投稿者投稿内容
やまろう
常連さん
会議室デビュー日: 2003/10/13
投稿数: 35
お住まい・勤務地: 埼玉・東京
投稿日時: 2006-07-21 20:51
ログの共通クラスを作成しています。1から作るのではなくLog4jを使用します。後でLog4jから他のLogプロダクトに切り替えるかもしれないのCommonsLoggerを使おうと思います。CommonsLoggerをラップしたクラスを作ろうと思います。ラップしたい理由としては出力内容の加工等をさせるためです。

ラッパーは以下のようにcommons.loggingのLogをフィールドに保持して委譲する形になります。

public class CommonLogger {
 /** commons.loggingのLog */
 private Log log;
 
 public static CommonLogger getLogger(Class clazz) {
  return new CommonLogger(clazz);
 }

 private CommonLogger(Class clazz){
  log = LogFactory.getLog(clazz);
 }

 public void debug(Object o) {
  log.debug(o);
 }

 public void info(Object o) {
  log.info(o);
 }
 ・・・続く

使う側のコードは

 CommonLogger logger = CommonLogger.getLogger(Hoge.class);
 logger.debug("Start Hoge.something");

になります。出力されるログは

2006-07-21 10:28:54,828 (CommonLogger.java:25) Start Hoge.something

のようにCommonLogger.java:25とラップしたクラスのファイル名と行になってしまいます。本当はHoge.java:35のようにCommonLoggerを使用したクラスのファイル名と行を出力させたいのですが、良い方法はありますか?

まず考えたのは
commons.loggingのLog4jラッパーである
org.apache.commons.logging.impl.Log4JLogger
をCommonLoggerで継承させることです。委譲するとその行が出力されてしまうので継承なら、呼び出した行になるんじゃないと思いました。

しかし、org.apache.commons.logging.impl.Log4JLogger
はfinalクラスなため継承出来ませんでした。

commons.loggingに限らず、Loggerをラッパーして行等が直にLoggerを使うのと同じように動作させる方法がありましたら、教えてください。よろしくお願いします。
アティ
ベテラン
会議室デビュー日: 2003/08/14
投稿数: 91
お住まい・勤務地: KANAGAWA
投稿日時: 2006-07-24 12:49
Commons Loggingだとメソッドなさそうなのでだめっぽいですが、Log4jだとlogメソッドを使用すると目的の動作が実現できます。
やまろう
常連さん
会議室デビュー日: 2003/10/13
投稿数: 35
お住まい・勤務地: 埼玉・東京
投稿日時: 2006-08-13 14:21
アティさん、どうもありがとうございます!!

そのほかにも以前のスレッド
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=15170&forum=12


>1.org.apache.log4j.spi.LocationInfoというクラスを修正
>2.自前のLocationInfoを作成し[Logger.java:35] の部分を自作し、
>  出力レイアウトには[%F:%L] を指定しない。

で2.が簡単でいいんじゃないのということでした。
で、やってみました。↓
http://yamarou.at.infoseek.co.jp/javanawake/046.html

Log4jに限定すればアティさんの方法のが簡単でよさそうですね。

[ メッセージ編集済み 編集者: やまろう 編集日時 2006-08-15 16:27 ]
1

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