0

考虑这段代码:

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

它可读性很强,但在多线程环境中,逻辑原子日志消息可以分为三个部分。

现在,部分解决方案很简单,并且可读性不会受到太大影响:

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* 排队到记录器线程 - 执行实际日志写入的一个线程。

于 2013-05-03T12:30:32.573 回答