2

ロギングにlog4jを使用するAPIがあります。プロジェクトでAPIを使用した場合、プロジェクトに関連するログステートメントはontlメソッド名で出力されますが、APIからのログステートメントは完全なパッケージ名形式で出力されます。log4j.propertiesファイルでは、「%c」(小文字)を使用しています。

すべてのプロジェクトログステートメントを強制的にメソッド名のみを出力する方法。

まあ言ってみれば;

Main.javaとAlarmCategoryImpl.javaの2つのクラスがあります。AlarmCategroryImpl.javaはAPIクラスにあり、Main.javaはプロジェクトクラスで定義されています。

 static Logger                       logger = Logger.getLogger(AlarmCategoryImpl.class);
 static Logger               logger   = Logger.getLogger(Main.class);

およびそのlog4j出力。

 2012-12-01/18:13:22.220/EET [INFO][Main->main] starting...  
2012-12-01/18:13:22.447/EET [INFO][com.monitor.base.alarmmanagement.alarmconfigurationImpl.AlarmCategoryImpl->copyStructureRecursive] Copying AlarmCategoryImpl
4

1 に答える 1

1

%c「カテゴリ名」を意味し、「ロガー名」と同義です。これは%c、ロガーの名前に拡張されることを意味します。

ロガー名は、必ずしも完全修飾クラス名である必要はありません。ロガー名は、に渡される文字列ですLogger.getLogger()。したがって、という名前のクラスがあり、次のようにx.y.z.MyClassなっている場合:

private static final Logger logger = Logger.getLogger("hello");

次に、ログステートメントが。helloの代わりにexpandedで生成され%cます。

これは、APIのクラスがを使用してgetLogger()おり、クラス名をパラメーターとして渡していることを意味します。これにより%c、ログが印刷されるときに完全修飾クラス名に展開されます。

API以外のクラス(つまり、独自のプロジェクトのクラス)は、に値を渡さないかLogger.getLogger()、ルートロガーを使用していると思います。確かに、Loggerインスタンスを取得するコードの行をここに貼り付けてください。

コメントごとに編集:

Mainさて、あなたのクラスがデフォルトのパッケージの中にある可能性はありますか?(つまり、どのパッケージにも関連付けられていません)?はいの場合、問題はありません。

[INFO][Main->main]INFOはレベル、Mainはクラス、mainはメソッドです。

[INFO][com.monitor.base.alarmmanagement.alarmconfigurationImpl.AlarmCategoryImpl->copyStructureRecursive]INFOはレベル、com.monitor.base.alarmmanagement.alarmconfigurationImpl.AlarmCategoryImplはクラス、copyStructureRecursiveはメソッドです。

于 2012-12-01T04:50:15.007 に答える