Message::Passing

Message::Passing 是一个仿造 Logstash 写的 Perl5 项目。项目早期甚至就直接照原样也叫 “Logstash” 的名字。

但实际上,Message::Passing 内部原理设计还是有所偏差的。这个项目整个基于 AnyEvent 事件驱动开发框架(即著名的 libev 库)完成,也要求所有插件不要采取阻塞式编程。所以,虽然项目开发不太活跃,插件接口不甚完善,但是性能方面却非常棒。这也是我从多个 Perl 日志处理框架中选择介绍这个的原因。

Message::Passing 有比较全的 input 和 output 插件,这意味着它可以通过多种协议跟 logstash 混跑,不过 filter 插件比较缺乏。对等于 grok 的插件叫 Message::Passing::Filter::Regexp( 我写的,嘿嘿)。下面是一个完整的配置示例:

  1. use Message::Passing::DSL;
  2. run_message_server message_chain {
  3. output stdout => (
  4. class => 'STDOUT',
  5. );
  6. output elasticsearch => (
  7. class => 'ElasticSearch',
  8. elasticsearch_servers => ['127.0.0.1:9200'],
  9. );
  10. encoder("encoder",
  11. class => 'JSON',
  12. output_to => 'stdout',
  13. output_to => 'es',
  14. );
  15. filter regexp => (
  16. class => 'Regexp',
  17. format => ':nginxaccesslog',
  18. capture => [qw( ts status remotehost url oh responsetime upstreamtime bytes )]
  19. output_to => 'encoder',
  20. );
  21. filter logstash => (
  22. class => 'ToLogstash',
  23. output_to => 'regexp',
  24. );
  25. decoder decoder => (
  26. class => 'JSON',
  27. output_to => 'logstash',
  28. );
  29. input file => (
  30. class => 'FileTail',
  31. output_to => 'decoder',
  32. );
  33. };