はLog4Jのロガーを設定することができる?
-
09-06-2019 - |
質問
を使用していJava1.4Log4J.
私のコードを直列化さとdeserializing値のオブジェクト(POJOs).
ひとりひとりのPOJOsことを宣言し、ロガー
private final Logger log = Logger.getLogger(getClass());
の双苦情のorg.apache.log4j.ロガーは直列化可能です。
どちらを使うべき
private final transient Logger log = Logger.getLogger(getClass());
ょうか?
解決
どを用いた静的なロガー?いが必要になり異なるロガーの参照のための各インスタンスです。ではないStaticフィールドは直列化されたデフォルトできる明示的に宣言の分野にserializeときは、static、finalの配列 ObjectStreamField
名前 serialPersistentFields
. 見Oracle書
追加コンテンツ:お使いいただいた getLogger(getClass()), は、同一のロガーの各インスタンス.を利用する場合は別のロガーのための各インスタンスごとの差別化の名前のロガーは、getLogger()を試みた。例えばgetLogger(getClass()が成立します。getName()+hashCode()).してくださいをご利用の過渡的な属性を付けられることがないよう、ロガーはない直列化されます。
他のヒント
ロガーの必静;このような非直列化可能です。
理由はありませんで作るロガーの非静的な場合を除き、強い理由の一つになってしまったので。
の場合 本当に いを行ってみてはいかがでしょう過渡的なアプローチが必要となりまをリセットするログがオブジェクトが直列化復元.の方法は、次のメソッドを実装してい:
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException;
のjavadocs用 直列化可能 の情報この方法です。
の実装が見えてしまうようなもの:
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException {
log = Logger.getLogger(...);
in.defaultReadObject();
}
えば、認めなければならないのでこのプログラミングはnull後deserializing御オブジェクトです。
のいずれかを宣言するのに貴ロガーとして静的または一過性です
両方を確保するwriteObject()メソッドはためのものではありませんのフィールドを出力ストリーム中の直列化します。
通常のロガーの分野ではstaticとして宣言されたものの、請求-お問い合わせはこちられるインスタンスの分野だけを宣言するので過渡的として、通常は行われず、直列化可能でないます。に直列化復元のロガーフィールドはnullものだから実施するreadObject()メソッドで初期化されているかもしれない
作ったロガーの静的です。よいしていた上部に持ち直列化ですので取り扱いクラスローダを使用します。
これらの種類の場合、EJB、一般的にベストを扱え地元のスレッドの状態です。通常の利用場合は何か、といった特定の取引であるとの出会いが問題と必要なものを一層高めてログインをデバッグのためのその操作のような形を生成することができます詳細なロギングの問題は動作します。を一部のスレッドの状態の取引に使用するを選択し、正しいlogger.正直わからない場合について、有益と思われる設定のレベルのインスタンスがこの環境でのマッピングのインスタンスを取るべきコンテナレベル機能となって制御するインスタンスが使用される取引。
場合であってもんを取り扱うDTOではない、一般には良いアイデアをデザインシステムのように指定された特定のインスタンスが必要なのは、デザインで簡単に進化させる方法が悪い選択です。きん月がかかるとともに、効率性への配慮(キャッシュ又はその他の生活サイクルの変化する最適化)様お休み頂きますので予め想定のマッピングのインスタンスを単位とする。
ご希望の場合はLoggerれたインスタンスを有していく過渡んserializeだけます。Log4Jのロガーを用いない直列化可能なバージョンのLog4Jしているところをとにかくいかない場合にはおLogger分野の過渡しょ例外に直列化します。
ロガーは直列化可能な利用の過渡時の格納してインスタンス。を復元する場合は、復元するロガーの後直列化復元できるレベル(文字列)indideオブジェクトにおいて取得されます。
が足りる相当の理由があるインスタンスを使用するlogger.一つの非常に良い使用の場合は、できることを宣言のロガー、スーパークラスを使ってすべてのサブクラスにあるログからスーパークラスによるサブクラスでは通常見やすいします。
(その他上記利用静的または一過性).