记一次monolog的RotatingFileHandler使用

Posted shqhdmr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记一次monolog的RotatingFileHandler使用相关的知识,希望对你有一定的参考价值。

需求如下:

1.需要一种日记格式,能把同一次请求的日记归在一起,请求间的日记以空行隔开,即使并发操作也不会像laravel默认的日记一样很"被动"的记录(不同请求的日记可能被交替记录).

2.还应该像laravel日记的daily驱动那样,把每天的日记都新建一个文件,并删除旧日记.

--------------------------------------------------

参考一篇文章与laravel日记文档:

https://learnku.com/articles/3567/monolog-optimization-and-elk-friendly-log-format

https://learnku.com/docs/laravel/5.6/logging/1374#creating-custom-channels

文章用的是monolog的BufferHandler继承自StreamHandler的自定义Handler(参考monolog文档),这样可以实现需求1,但是要实现需求2,自定义Handler应该继承自RotatingFileHandler.

要特别注意,调用RotatingFileHandler的write(array $record)方法时,$record一定要有键名为‘datetime‘的键值对(参考文章传入[‘formatted‘=>$log],我传入[‘formatted‘=>$log, ‘datetime‘=>Datetime(‘now‘)]).

因为追溯monolog的源码,RotatingFileHandler的write()方法需要在记录日志时根据传入的datetime来判断是否该rotate(即清除过期日记),不传datetime则write()会抛异常,但是日记不是在请求进程中进行的,所以请求能正常被响应(前端不会看到500),但是会发现日记那边却没有任何反应.monolog文档只有StreamHandler的示例,写的有些简单...

 monolog跑通后,只用在laravel的config/logging中自定义一个channel(custom驱动),并via刚刚跑通的自定义Handler即可.

 

以上是关于记一次monolog的RotatingFileHandler使用的主要内容,如果未能解决你的问题,请参考以下文章

记一次OOM排查过程

记一次Win. Anaconda Prompt Error

Monolog - Logging for PHP

记一次 Vue2 迁移 Vue3 的实践总结

记一次Selectable的误用

zabbix记一次简单的部署包方式安装一次过