多线程环境中连续记录器调用的最佳实践

时间:2013-05-03 12:16:28

标签: multithreading logging conventions

考虑以下代码:

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);
  }
}

你推荐什么以及为什么?

2 个答案:

答案 0 :(得分:1)

配置日志记录子系统以在其输出中标识日志记录线程

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

现在可以很容易地将日志连接在一起。

答案 1 :(得分:0)

设计一个可以保存日志文本的“LogEntry”类 - 追加条目等。

添加以下记录器实例调用:

1)以线程安全的方式返回'LogEntry'类实例,例如。 'LogEntry * GetLogEntry();'。

2)以线程安全的方式提交“LogEntry”类实例,例如。 'void SubmitLogEntry(LogEntry * thisLog);

SubmitLogEntry()应该将传递的LogEntry *排队到记录器线程 - 执行实际日志写入的一个线程。

相关问题