[英]Cleaner debug level logging in Java?
我有没有更干净的方式编写调试级别日志语句? 从某种意义上说,字符串文字基本上是在注释代码并在一行中提供日志记录,并且它已经很干净了。 但是,在添加调试级别日志语句之后,发现代码难以上下读起来。 以以下示例为例(如果回到家用PC,我可能会更新为真实示例):
int i = 0;
logger.debug("Setting i to 0,"); //Just an example, would show something more complex
i++;
InputStream is = socket.getInputStream();
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
IOUtils.write(request, dos);
logger.debug("request written to output");
while (!is.read(buffer))
logger.debug("Reading into buffer");
logger.debug("Data read completely from socket");
CustomObject.doStuff(buffer);
logger.debug("Stuff has been done to buffer");
您可以尝试使用方面,尽管这些方面具有局限性,即您只能将日志语句放在方法调用的“周围”,即在进入和/或离开特定方法之后。
对于更详细的日志记录,恐怕没有什么办法只能是手工编码的日志消息。
一旦确定它可以按应有的方式工作(必须进行单元测试),我通常会从代码中删除不需要的调试日志语句。
问问自己我是否在其他机器/国家/地区/行星上运行此设备,但出现了问题,我所拥有的只是一个日志文件,我需要什么信息才能知道出了什么问题?
在for循环或while循环中谨慎使用调试日志。 例如,如果您要从一个文件中读取1000条记录,请对每个记录执行一次操作。 您可以在for循环之前记录“文件存在并且可读并且将要读取1000条记录”,并在处理完成后打印状态。 如果说1000000条记录,则可以说100或1000次迭代
在您的代码中,除了将i设置为0的记录器之外,其他一切对我来说都是有意义的。 如果记录器状态中的字符串难以计算,还应注意使用log.isDebugEnabled()。
例如:
if(log.isDebugEnabled) {
logger.debug("Here " + obj.aMethodCallThatTakes5MinsToEvaluateToString());
}
更新1:SLF4J仅解决了一半问题。
if(slfLog.isDebugEnabled) {
slfLog.debug(obj.getObjectThatTakes5Mins());
}
是的,可以防止toString,但是如果您记录的是由于某种计算而导致的实际对象,则不会阻止。
如果您不喜欢日志语句,将无法做很多事情。 信息需要以某种方式存在。
您可以做的是,强烈考虑要有哪些需求。 您基本上是在为日志文件阅读器写的,该阅读器的每个定义都不知道您的程序如何工作,因此信息必须简明而正确。 我个人经常将方法名称添加到log语句中。
另请注意,slf4j允许您使用{}语法,这在一定程度上有所帮助
log.debug("main() date={}, args={}", new java.util.Date(), args);
还要注意,有了单元测试,仅仅因为您知道THAT起作用,就可以将很多东西移到那里。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.