删除了配置stdoutFile的日志文件没办法自动再次生成

freely

bug描述

在初始化启动时配置了stdoutFile的日志输出文件,配置成功后,启动workerman后,也是有正常在对应的目录下生成这个日志文件,但是一但在运行中删除掉这个日志文件,那么不会再重新生成这个日志文件了,就算手工增加了相同文件名的日志文件,也是一样没有再将日志写入到这个日志文件里。必需要停止服务然后再启动服务才会又生成文件。
有啥方法可以让在运行中时,删除掉这日志文件后当有日志信息时又会自动生成这个文件呢?
而workerman本身的日志文件(workerman目录下的workerman.log)就行。删除了,会自动生成新的。

程序代码或配置

class Server{
    public function __construct(){
        Autoloader::setRootPath(__DIR__);

        // 获取插件配置
        $config = Config::get('config');

        //所有的打印输出全部保存在tmp/stdout.log文件中
        Worker::$stdoutFile = './stdout.log';

        // register 必须是text协议
        $register = new Register('text://0.0.0.0:' . $config['register_port']);

        // bussinessWorker 进程
        $worker = new BusinessWorker();
        // worker名称
        $worker->name = 'SysMsgBusinessWorker';

系统环境及workerman/webman等具体版本

TP5+workerman4.0.19+gatewayworker

863 3 1
3个回答

nitron

修改框架代码,每次写入前检测文件是否存在,不存在就创建

  • freely 2022-12-10

    这是我按workerman文档里设置stdoutFile这个文件名的,这个必需是在Worker::runAll();前执行,总不能去修改Workerman框架吧。

  • nitron 2022-12-10

    是的,修改框架源代码

北月

如果只是想清空日志文件,大可不必删掉它,可以采用一个取巧的方式:
echo '' > xxx.log

  • 暂无评论
walkor

标准输出重定向都是这样的,其他语言程序也以一样,删除后不会重新建立文件。
需要程序触发重新重定向逻辑,代码类似

$worker->onWorkerReload = function($worker) {
    unlink(Worker::$stdoutFile);
    Worker::resetStd();
}

这样每次要删除stdoutFile 的时候执行 php start.php reload 即可。

你也可以在onWorkerStart时弄个定时器,每天凌晨重置$worker::$stdoutFile = '/var/log/workerman.' . date('Y-m-d') . '.log'; 以日期分割文件,手动或自动删除之前多少天的文件。

年代过于久远,无法发表回答
🔝