我编写了一个Custom Log4J Appender,它负责将日志消息发送到第三方服务asyncronsly
所以预计这会被称为每毫秒
这是我的自定义Appender代码
我在这段代码上运行了 Findbugs ,它没有报告任何异常。
但在将此代码发布到生产之前,我怎么知道这段代码是否有任何问题。
是否有用于此目的的工具?
请提前感谢您分享您的想法。
package com;
import java.util.ArrayList;
import java.util.Iterator;
import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.spi.LoggingEvent;
public class MyAppender extends AppenderSkeleton {
public MyAppender() {
}
public void append(LoggingEvent event) {
ArrayList<LoggingEvent> buffer = new ArrayList<LoggingEvent>();
buffer.add(event);
flushBuffer(buffer);
}
public void flushBuffer(ArrayList<LoggingEvent> buffer) {
for (Iterator<LoggingEvent> i = buffer.iterator(); i.hasNext();) {
try {
LoggingEvent logEvent = (LoggingEvent) i.next();
String messageRecievied = (String) logEvent.getMessage();
//System.out.println(messageRecievied);
} catch (Exception e) {
}
}
}
@Override
public void close() {
}
@Override
public boolean requiresLayout() {
return false;
}
}
答案 0 :(得分:3)
测试。
弄清楚用例是什么,包括边缘情况 进行单元测试。
考虑部署环境中可能破坏代码的任何变量 创建集成测试以确保这些方案都能正常工作。
创建一个假接收器并对其进行测试 您需要为接收器创建测试,以确保它正确验证。
答案 1 :(得分:1)
能够使用任意输入预测任意代码的结果是an NP-Complete问题。因此,没有100%可靠的方法来保证代码没有问题(至少在宇宙热死之前。因此,你完全处于风险管理领域。
那你做什么?
<强> TEST 强> 单元和系统测试可以帮助您确信您的代码没有错误。使用类似JUnit的内容来执行此操作。使用此类套件,您可以提供特定输入并检查以确保输出有效。但请注意,这只会针对您提供的输入进行测试,而不是针对任何输入进行测试,因此即使是非常好的测试套件也可能会给您带来虚假的信心。因此,第二道防线是......
<强> METRICS 强> 确保您正在测量并了解您可以做的一切。如果您将新代码投入生产并且对数据库的写入增加了十倍......您可能会遇到问题。或许您的错误消息速度增加 - 或者降至零。除非您正在监控关键指标,否则无法确定系统的运行状况。但如果出现问题会发生什么?
功能控制 在您添加新功能的任何复杂系统中,对这些功能进行控制是个好主意。将此视为全局切换,可让您在旧代码路径和新代码路径之间进行选择。例如:
public void append(LoggingEvent event) {
if (FeatureController.isActive(this.FEATURE_NAME)){
ArrayList<LoggingEvent> buffer = new ArrayList<LoggingEvent>();
buffer.add(event);
flushBuffer(buffer);
}
}
这可让您在新功能出现问题时快速关闭。
答案 2 :(得分:0)
不存在这样的工具,否则它将是人工智能,并且会在不需要你的情况下编写整个代码; - )
但是如果可能的话写单元测试。通过良好的单元测试,您可以部署许多任务,并且第一次运行时没有任何错误。 (该工具称为JUnit)
第二个工具:EclEmma eclipse插件: 它显示了junit测试覆盖率。你有80%或更多的报道?没有? (对你感到羞耻; - ))
看看appache log4j的src,我记得他们有一些单元测试,也许有一些现有的appender。