noccylabs / logpipe
通过命名管道和套接字进行交互式日志记录
Requires
- php: >=5.4.0
- psr/log: 1.*
- symfony/console: ~2.6|~3.0
- symfony/dependency-injection: ~2.6|~3.0
- symfony/event-dispatcher: ~2.6|~3.0
- symfony/expression-language: ~2.6|~3.0
- symfony/var-dumper: ~2.6|~3.0
- symfony/yaml: ~2.6|~3.0
Requires (Dev)
- monolog/monolog: ~1.0
Suggests
- ext-mongo: For using the Bson serializer
- ext-msgpack: For using the Msgpack serializer
README
LogPipe是一个库和应用程序,用于实时监控PHP应用程序和monolog日志。这是通过序列化数据并将序列化的数据块通过支持的传输之一发送来实现的。传输端不需要在另一端有监听器;LogPipe设计为在没有影响您应用程序的情况下静默失败。一旦您想深入了解正在发生的事情,就可以启动dumper。
LogPipe设计为对性能影响最小化,因此如果发送过程中遇到任何问题,它将丢弃事件。
安装
使用composer将LogPipe安装到项目中
$ composer require noccylabs/logpipe:@stable
全局安装以用于shell脚本等
$ composer global require noccylabs/logpipe:@stable
使用LogPipe
与Monolog一起使用
要使用Monolog,将LogPipeHandler
推送到您的Logger
。
与Symfony一起使用
要使用LogPipe与Symfony,您只需将处理程序注册为服务,以便它可以用作Monolog。最好在config_dev.yml
文件中这样做。如果有services:
块,请向其中添加部分,否则创建它
services:
logpipe.handler:
class: NoccyLabs\LogPipe\Handler\LogPipeHandler
arguments: [ "tcp:127.0.0.1:6601" ]
然后在同一文件中定义处理程序。通过在config_dev.yml
中这样做,您的实时环境将不会使用LogPipe记录器。
monolog:
handlers:
...
logpipe:
type: service
id: logpipe.handler
在其他地方使用
LogPipe可以配置为自动记录异常和错误
use NoccyLabs\LogPipe\Handler\ConsoleHandler;
$handler = new ConsoleHandler("tcp:127.0.0.1:9999:serializer=json");
$handler->setExceptionReporting(true);
$handler->setErrorReporting(true);
您还可以手动编写事件:(未实现)
$handler->debug("This is a debug message!");
$handler->warning("Danger! Danger!");
转储事件
要开始在默认传输(tcp:127.0.0.1:6601
)上转储事件(监听并转储事件),只需使用dump命令即可
$ bin/logpipe dump
您还可以通过提供参数来明确指定监听特定传输
$ bin/logpipe dump tcp:0.0.0.0:9999
您可以在另一个终端中使用test命令创建一些测试事件,同时dump命令正在运行
$ bin/logpipe test
要通过对多个dumper进行启动,向dumper发送大量数据以对传输进行严重压力测试,您可以使用logpipe dump -t stress <transport>
。
要查看日志的同时保存日志,请尝试使用tee
$ bin/logpipe dump --no-ansi | tee messages.log
or:
$ bin/logpipe dump --tee messages.log
您还可以从控制台或脚本中编写事件
$ bin/logpipe write -c "cron" --error "Setup failed"
或直接从stdin传递事件
$ some_command | bin/logpipe log:pass
配置和连接字符串
连接是通过简单的连接字符串设置的,该字符串由所需的传输和任何设置所需的参数组成,并用冒号(:
)分隔。可以在最后参数之后以HTML查询字符串样式添加额外的配置
tcp:127.0.0.1:12345:serializer=json
传输
UDP
udp:<host>:<port>
默认传输是通过UDP端口6999。通过UDP发送的消息带有6字节头部,指定有效负载的大小和crc32。消息被序列化、传输,一旦完全接收并且校验和有效,就会被反序列化和解析。请注意,由于UDP的工作方式,如果在同一端口上启动另一个dumper,第一个dumper将停止接收数据而不会指示错误。
TCP
tcp:<host>:<port>
TCP传输有点像UDP传输。然而,由于TCP是面向连接的,因此如果没有dumper,可能会出现一些复杂性。这需要更多的测试。但它应该能够处理更大的消息。
管道
pipe:<path>
当在传输URI中找不到冒号时,管道传输是默认的。因此,/var/run/foo.sock
将被内部转换为pipe:/var/run/foo.sock
。listen()方法将创建命名管道并开始监听连接。只有当你确实需要时才使用管道传输。并发可能是一个问题,以及一些意外的阻塞问题。
序列化器
使用的序列化器由发送传输设置。序列化格式嵌入在消息帧中(包括校验和、大小和标志),以便调用适当的反序列化器。支持的序列化器包括
php
:内置的PHP序列化器json
:使用Json序列化数据msgpack
:类似于二进制json,应该产生更小的消息。需要php5-msgpack
bson
:类似于msgpack,但大小略大。需要php5-mongo
要使用自定义序列化器,请将其与端点URI一起提供:udp:127.0.0.1:6999:serializer=msgpack
等。由于策略是失败并忘记,如果序列化器不受支持,您将不会收到任何错误。调用不存在的序列化器将抛出异常。
交互式转储器
在交互模式下启动转储器(通过传递-i
或--interactive
)时,将提供一些额外的工具。
最后的一组消息(通常是1000,但可以在命令行上使用-Cbuffer.size=N
或在使用转储器时使用:set buffer.size N
设置)存储在缓冲区中。您可以在任何时间搜索此缓冲区并转储任何匹配项。为此,只需按下斜杠(/
)并开始键入。输入将被解析为正则表达式,因此您可以在末尾添加修饰符
/exception/i <- will perform a case independent match
目前唯一支持的命令是set
,但您可以在转储器中按冒号(:
)调用它
:set <- list all settings
:set buffer.size <- show the value of buffer.size
:set buffer.size 999 <- set buffer size to 999
常见问题(FAQ)
问:我看不到所有的日志消息!!!
如果发生错误,LogPipe将安静地失败。这包括日志事件的序列化、传输错误等。这样做是为了确保有问题的记录器或传输不会导致正在诊断的应用程序行为不当。
问:LogPipe导致我的应用程序行为不当!
请立即报告此事,除非您能够修复问题并提交拉取请求。如前所述,策略是失败并忘记,这意味着应静默消费发生的所有错误和任何错误,以防止辅助记录器导致应用程序失败或行为不当。
问:交互模式不起作用!
LogPipe使用Stty将终端从行缓冲模式切换到原始字符模式,以实现自定义readline功能。从长远来看,这意味着您可以在日志持续更新的同时输入命令或筛选表达式,但今天它意味着某些平台可能会遇到问题。