次のコードを検討してください。
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);
  }
}
何をお勧めしますか?その理由は何ですか?