3

ロギングを行う多数のクラスでApache Commons Loggingとlog4jを使用するプロジェクトがあります。ログの 95% が同じプレフィックスで表示される

log4j.appender.MyCompany.layout.ConversionPattern=[%d][%-5p][%c] %m%n

[2010-08-05 11:44:18,940][DEBUG][com.mycompany.projectname.config.XMLConfigSource] [filepath] から設定を読み込んでいます
[2010-08-05 12:05:52,715][情報][com.mycompany.projectname.management.ManagerCore] ログ エントリ 1
[2010-08-05 12:05:52,717][情報][com.mycompany.projectname.management.ManagerCore] ログ エントリ 2

%c{1} の場合、カテゴリの最後の部分 (つまり、クラス名) だけを表示できますが、そのパッケージの各ログから共通部分 'com.mycompany.projectname' を切り取る方法はありますか? 、各行でどれだけのスペースを占めるかを考慮して?

4

2 に答える 2

3

Log4j 1.2.16を使用している場合は、レイアウトをEnhancedPatternLayoutに変更できます。これにより、categoryパラメーターにの値を指定できます。ドキュメントから:

たとえば、カテゴリ名「alpha.beta.gamma」の場合...%c {-2}は、[前面から] 2つの要素を削除し、「gamma」を残します。

より完全な例を次に示します。

log4j.appender.C.layout=org.apache.log4j.EnhancedPatternLayout
log4j.appender.C.layout.ConversionPattern=%d{ABSOLUTE} %-5p [%t] [%c{-3}] %m%n

あなたの場合、これは切り落とす必要がありますcom.mycompany.projectname

ただし、これは、コードからのものでなくても、ログに記録されるすべてのメッセージに適用されます。つまり、カテゴリorg.hibernate.engine.query.HQLQueryPlanはにトリミングされますがquery.HQLQueryPlan、これは希望どおりではない可能性があります。

これを完全に制御する必要がある場合(つまり、すべてのメッセージから「com.mycompany.projectname」というテキストを具体的に削除したい場合)、独自のLayoutクラスを実装する必要があります。このような何かがそれを行う必要があります:

import org.apache.log4j.PatternLayout;
import org.apache.log4j.spi.LoggingEvent;

public class MyPatternLayout extends PatternLayout
{
  @Override
  public String format(LoggingEvent event)
  {
    String msg = super.format(event);
    msg = msg.replace("com.mycompany.projectname", "");

    return msg;
  }
}

幸運を!

于 2010-08-05T21:21:58.957 に答える
0

%c{2} または %C{2} を使用してください。number は、保持する右端のコンポーネントの数を指定します。

http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.htmlを参照してください。

于 2010-08-05T18:55:21.573 に答える