我有一组分散在多个服务器上的dockerized应用程序,并尝试使用ELK设置生产级集中式日志记录.我对ELK部件本身没问题,但我对如何将日志转发到我的logstashes有点困惑.我正在尝试使用Filebeat,因为它具有loadbalance功能.我还想避免将Filebeat(或其他任何东西)打包到我的所有码头工人中,并保持它分离,对接或不用.
我该怎么办?
我一直在尝试以下方面.我的Docker登录stdout所以配置了非dockerized Filebeat从stdin读取我做:
docker logs -f mycontainer | ./filebeat -e -c filebeat.yml
这似乎在开始时起作用.第一个日志将转发到我的logstash.我想是缓存的.但在某些时候它会卡住并继续发送相同的事件
这只是一个错误还是我朝错误的方向前进?你设置了什么解决方案?
我面临的情况是,我们有很多非常长的方法,1000行或更多.
为了给你提供更多细节,我们有一个传入的高级命令列表,每个命令都生成一个较长(有时很大)的低级命令列表.有一个工厂为每个传入命令创建一个类的实例.每个类都有一个处理方法,其中生成所有较低级别的命令按顺序添加.正如我所说,这些命令序列及其参数经常导致处理方法达到数千行.
有很多重复.许多命令模式在不同命令之间共享,但代码反复重复.这让我觉得重构是一个非常好的主意.
相反,我们的规格与当前代码完全相同.每个传入命令的命令列表很长.当我尝试一些重构时,我开始对规格感到不舒服.我想念规范和代码之间的明显比喻,并浪费时间深入研究新创建的公共类.
那么这里的问题是:一般来说,你认为这么长的方法总是需要重构,或者在类似的情况下它是可以接受的吗?(遗憾的是,重构规范不是一种选择)
编辑:我删除了每个"生成"的引用,因为它实际上令人困惑.它不是自动生成的代码.
class InCmd001 {
OutMsg process ( InMsg& inMsg ) {
OutMsg outMsg = OutMsg::Create();
OutCmd001 outCmd001 = OutCmd001::Create();
outCmd001.SetA( param.getA() );
outCmd001.SetB( inMsg.getB() );
outMsg.addCmd( outCmd001 );
OutCmd016 outCmd016 = OutCmd016::Create();
outCmd016.SetF( param.getF() );
outMsg.addCmd( outCmd016 );
OutCmd007 outCmd007 = OutCmd007::Create();
outCmd007.SetR( inMsg.getR() );
outMsg.addCmd( outCmd007 );
// ......
return outMsg;
}
}
Run Code Online (Sandbox Code Playgroud)
这里是一个传入命令类的示例(用伪c ++手动编写)
我正在这里阅读问题和答案几天.我已经看过Parashift中的c ++ faq lite已被多次提及.就个人而言,我一直认为这是一个很好的参考,不是我最喜欢的,但肯定是有用的.在这里,我看到有人提出建议,但许多人反而反对.有人提到它充满了错误.如果有的话,请指出那里的主要错误是哪些?
当一个或两个输入容器是具有重复对象的多个集合时,算法std:set_union的返回是什么?重复丢失了吗?
我们假设例如:
multiset<int> ms1;
ms1.insert(1);
ms1.insert(1);
ms1.insert(1);
ms1.insert(2);
ms1.insert(3);
multiset<int> ms2;
ms2.insert(1);
ms2.insert(1);
ms2.insert(2);
ms2.insert(2);
ms2.insert(4);
vector<int> v(10);
set_union( ms1.begin(), ms1.end(), ms2.begin(), ms2.end(), v.begin() );
Run Code Online (Sandbox Code Playgroud)
输出会是什么?
我需要一个像std :: auto_ptr这样的类来表示一个unsigned char*数组,用new []分配.但是auto_ptr只调用delete而不是delete [],所以我不能使用它.
我还需要一个创建并返回数组的函数.我在类ArrayDeleter中出现了我自己的实现,我在这个例子中使用了它:
#include <Utils/ArrayDeleter.hxx>
typedef Utils::ArrayDeleter<unsigned char> Bytes;
void f()
{
// Create array with new
unsigned char* xBytes = new unsigned char[10];
// pass array to constructor of ArrayDeleter and
// wrap it into auto_ptr
return std::auto_ptr<Bytes>(new Bytes(xBytes));
}
...
// usage of return value
{
auto_ptr<Bytes> xBytes(f());
}// unsigned char* is destroyed with delete[] in destructor of ArrayDeleter
Run Code Online (Sandbox Code Playgroud)
有更优雅的方法来解决这个问题吗?(即使使用另一个"流行"图书馆)
我知道不应该使用自动指针的容器,这可能会导致问题.这是什么原因?是否还有其他类型的"智能"指针可以安全地在容器中使用?