gateway workerman reload.sh 后没有日志,日志不写了。

书生帅气的程序员

具体原因没有找到,怀疑是workerman的bug。

需求是workerman 里的业务逻辑代码需要写日志,贪图方便,用echo var_dump输出。
但是workerman默认不记录。

logFile默认在Workerman上一级目录里。stdoutFile默认是/dev/null 也即是不保存

所以,自己写了一个方法,直接写入文件。追加到原先的日志里。

以下代码加到Events.php的Events类后面:

/**
 * 打印日志
 * @return void
 */
if (!function_exists('_do_log')) {
    function _do_log($msg, $type='默认')
    {
        $str = date('Y-m-d H:i:s') . PHP_EOL
            . '类型:' . $type . PHP_EOL
            . arraytostr($msg) . PHP_EOL;
        file_put_contents('./Applications/make_speed/'.date('Y-m-d').'log.log', $str, FILE_APPEND);
    }
}
// 数组转合适的字符串输入
function arraytostr($data)
{
    $str = '';

    if (is_array($data)) {
        $str .=  '[';
        foreach ($data as $key => $value) {
            if (is_array($value)) {
                $str .= $key .' => '.arraytostr($value).',';
            } else {
                $str .=  $key .' => '.$value.',';
            }

        }
        $str = rtrim($str, ',');
        $str .=  ']';
    } else {
        $str = (string) $data;
    }

    return $str;
}

截图

796 3 0
3个评论

ximengxuan

谢谢分享。
这里面有一个小问题,就是日志目录需要手动创建。建议改为自动创建。
另外,我对代码做了适当调整。

function _do_log($msg, $type = 'logd')
    {
        $str = '[' . date('Y-m-d H:i:s')  . '] [' . $type . '] ' . arraytostr($msg) . PHP_EOL;
        file_put_contents('./Applications/runtime/' . date('Y-m-d') . '.log', $str, FILE_APPEND);
    }

打印日志内容如下:

[2023-06-12 00:37:01] [logd] WorkerStart_
[2023-06-12 00:37:01] [loge] WorkerStart_
[2023-06-12 00:37:01] [logw] WorkerStart_
[2023-06-12 00:37:01] [logi] WorkerStart_
  • 暂无评论
ximengxuan

下面是经过我优化的代码,增加了自动创建目录,增加了日志的级别。


/**
 * 打印日志
 * https://www.workerman.net/a/1428
 * @return void
 */
if (!function_exists('_do_log')) {

    /**
     * @param string $msg 日志内容
     * @param string $type 日志类型:logd(调试)/loge(错误)/logw(警告)/logi(信息)
     */
    function _do_log($msg, $type = 'logd')
    {
        $str = '[' . date('Y-m-d H:i:s')  . '] [' . $type . '] ' . arraytostr($msg) . PHP_EOL;

        // 自动创建日志目录
        $upload_path = './runtime/';
        if (!is_dir($upload_path)) {
            mkdir($upload_path, 0777, true);   //使用递归方式逐级创建目录
        };
        file_put_contents('./runtime/' . date('Y-m-d') . '.log', $str, FILE_APPEND);
    }
}

function logd($msg){
    _do_log($msg, 'logd'); 
}

function loge($msg){
    _do_log($msg, 'loge'); 
}

function logw($msg){
    _do_log($msg, 'logw'); 
}

function logi($msg){
    _do_log($msg, 'logi'); 
}
  • 暂无评论
six
file_put_contents('./Applications/make_speed/'.date('Y-m-d').'log.log', $str, FILE_APPEND);

php-cli相对路径和php-fpm不一样,php-fpm是相对于当前文件。php-cli是相对于执行目录。
例如在 /path/a/目录下 执行reload.sh,file_put_contents('./Applications/make_speed/'.date('Y-m-d').'log.log',...) 会写到 /path/a/Applications 下,在/path/目录下执行reload.sh会写到 /path/Applications 下。这就是为啥感觉日志不写了,因为可能写到其它目录去了。

解决办法,绝对路径,file_put_contents(绝对路径, ...);

  • 暂无评论

书生帅气的程序员

220
积分
0
获赞数
0
粉丝数
2022-11-08 加入
🔝