考虑以下代码:
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);
}
}
你推荐什么以及为什么?
答案 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 *排队到记录器线程 - 执行实际日志写入的一个线程。