0

次のコードを検討してください。

if (param1 == null || param2 == null) {
  logger.error("Failed to do stuff.");
  logger.debug("param1: " + param1);
  logger.debug("param2: " + param2);
}

非常に読みやすいですが、マルチスレッド環境では、論理的にアトミックなログ メッセージが 3 つの部分に分割される可能性があります。

さて、ソリューションの一部は単純で、読みやすさはそれほど損なわれません。

if (param1 == null || param2 == null) {
  logger.error("Failed to do stuff.");
  logger.debug(
    "param1: " + param1 + System.getProperty("line.separator") 
    + "param2: " + param2
  );
}

ロガー出力を少し変更しても問題ない場合は、次のように記述できます。

if (param1 == null || param2 == null) {
  String message = "Failed to do stuff.";

  if (logger.isDebugEnabled()) {
    message += System.getProperty("line.separator")
      + "param1: " + param1 + System.getProperty("line.separator") 
      + "param2: " + param2;
  }

  logger.error(message);
}

ログをきれいにしますが、コードは醜いです...

または、次のように書くこともできます。

if (param1 == null || param2 == null) {
  synchronized (logger) {
    logger.error("Failed to do stuff.");
    logger.debug("param1: " + param1);
    logger.debug("param2: " + param2);
  }
}

何をお勧めしますか?その理由は何ですか?

4

2 に答える 2

1

出力でログ スレッドを識別するようにログ サブシステムを構成します。

timestamp process.thread_id severity Lorem ipsum dolor sit amet
                  ^^^^^^^^^

これで、ログを一緒にスレッド化するのが簡単になりました。

于 2013-05-03T15:48:57.880 に答える
0

ログテキストを保持できる「LogEntry」クラスを設計します - エントリなどを追加します。

次のロガー インスタンス呼び出しを追加します。

1) スレッドセーフな方法で「LogEntry」クラスのインスタンスを返します。'LogEntry* GetLogEntry();'.

2) スレッドセーフな方法で「LogEntry」クラス インスタンスを送信します。'void SubmitLogEntry(LogEntry* thisLog);

SubmitLogEntry() は、渡された LogEntry* をロガー スレッド (実際のログ書き込みを行う 1 つのスレッド) にキューイングする必要があります。

于 2013-05-03T12:30:32.573 に答える