如果我正确理解,CloudWatch Agent会使用批量处理方式将事件发布到CloudWatch,其大小由the two params指定:
batch_count:
指定批处理中的最大日志事件数,最多为10000 默认值为1000。
batch_size
指定批处理中的日志事件的最大大小(以字节为单位) 1048576字节。默认值为32768字节。这个尺寸是 计算为UTF-8中所有事件消息的总和加上26个字节 对于每个日志事件。
我想,为了消除在EC2实例终止的情况下丢失任何日志数据的可能性,batch_count
应该等于1
(因为在实例终止的情况下,所有日志都将是破坏)。我是对的,这只是实现它的一种方式,以及它如何影响性能?它会有明显的副作用吗?
答案 0 :(得分:1)
是的,这是一个坏主意。这样可能会丢失数据。代理使用的PutLogEvents API每个日志流(source)每秒限制5个请求。 @Bean
public FlowDefinitionRegistry flowRegistry() {
return getFlowDefinitionRegistryBuilder() //
.setBasePath("classpath:flows") //
.addFlowLocationPattern("/**/*-flow.xml") //
// .addFlowLocation("/organiser-register-flow.xml", "organiser/register")
.setFlowBuilderServices(this.flowBuilderServices()) //
.build();
}
@Bean
public FlowExecutor flowExecutor() {
return getFlowExecutorBuilder(this.flowRegistry()) //
.build();
}
@Bean
public FlowBuilderServices flowBuilderServices() {
return getFlowBuilderServicesBuilder() //
.setViewFactoryCreator(this.mvcViewFactoryCreator())
.setValidator(this.localValidatorFacotryBean).build();
}
// ----------------------------------------------------------
@Bean
public FlowHandlerMapping flowHandlerMapping() {
FlowHandlerMapping handlerMapping = new FlowHandlerMapping();
handlerMapping.setOrder(-1);
handlerMapping.setFlowRegistry(this.flowRegistry());
return handlerMapping;
}
@Bean
public FlowHandlerAdapter flowHandlerAdapter() {
FlowHandlerAdapter handlerAdapter = new FlowHandlerAdapter();
handlerAdapter.setFlowExecutor(this.flowExecutor());
handlerAdapter.setSaveOutputToFlashScopeOnRedirect(true);
return handlerAdapter;
}
@Bean
public ViewFactoryCreator mvcViewFactoryCreator() {
MvcViewFactoryCreator factoryCreator = new MvcViewFactoryCreator();
factoryCreator.setViewResolvers(Collections.singletonList(this.viewResolver));
factoryCreator.setUseSpringBeanBinding(true);
return factoryCreator;
}
}
为1时,您每秒只能发布5个日志事件。如果应用程序要持续产生更多的数据,则代理将无法跟上。
如果您绝对负担不起丢失任何日志数据,则也许应该将这些数据写入数据库。即使batch_count
为1,也始终存在丢失日志数据的风险。在代理程序轮询日志文件之前,主机总是会崩溃...默认情况下,BTW是每5秒一次({{3 }}。