artisan日志 root 权限解决办法

php artisan 生成的日志是 root 权限,导致正常的系统日志没有权限写入,解决办法是根据用户来区分不同的日志,在 bootstrap/app.php 中写入以下配置:

$app->configureMonologUsing(function(Monolog\Logger $monolog) {
    $filename = storage_path('logs/laravel-'.php_sapi_name().'.log');
    $handler = new Monolog\Handler\RotatingFileHandler($filename);
    $monolog->pushHandler($handler);
});
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 22
leo

正确的做法应该是用 www 用户执行 artisan 命令,因为不光是日志,还有可能有缓存、 storage 等文件可能被 root 用户创建而导致 www 用户无权操作。

6年前 评论
drp3292 5年前
leo (作者) 5年前
drp3292 5年前
leo (作者) 5年前

不想使用单独的用户配置 crontab,也可以这么干,比如:配置在 root 账号下

su www -s /bin/bash -c “php artisan schedule:run”
6年前 评论
leo

正确的做法应该是用 www 用户执行 artisan 命令,因为不光是日志,还有可能有缓存、 storage 等文件可能被 root 用户创建而导致 www 用户无权操作。

6年前 评论
drp3292 5年前
leo (作者) 5年前
drp3292 5年前
leo (作者) 5年前

除了楼上所说的一系列问题,还有安全问题不容忽视,用 root 账号执行命令,脚本所拥有权限非常大,如果遭遇恶意脚本,整站就呵呵了

6年前 评论

@leo 请教一下,我把脚本写在 crontab 中的,如果我想用 www 用户执行 artisan 命令,我应该怎么写 crontab 呢

6年前 评论
leo

@gedongdong2010 crontab -e -u www

6年前 评论

@leo 如果用这个方式的话可能后续有人接手很容易落下。。。。

6年前 评论
leo

@gedongdong2010 那你现在用的什么方法不容易落下?

6年前 评论

@leo 起码放在 git 仓库里的会跟着代码走,但是这个配置如果 crontab -e 看不到很可能会落下

6年前 评论
leo

@gedongdong2010 大哥,我是让你在这里配置 artisan schedule:run,不是单独配置每个定时任务啊

6年前 评论

artisan schedule:run 写在 crontab -e -u www 里吗?
@leo

6年前 评论
leo
6年前 评论

@leo 我的意思是 crontab -e -u www 和 crontab -e 编辑不是 crontab 文件,后者看不到前者编辑的内容,一般情况下我可能不知道 crontab -e -u www 里还有东西,甚至不会去看,所以容易落下

6年前 评论
leo

@gedongdong2010 那说明你们的权责不明确,这个事情要么运维全权负责,和开发没有关系,要么开发自己管但需要在内部通气。如果都做不到那就怎么爽怎么来吧,等到多踩几次坑就会记住了。

6年前 评论

@leo 哈哈 666,我们运维就是吃 xx 的,啥用也没有

6年前 评论

不想使用单独的用户配置 crontab,也可以这么干,比如:配置在 root 账号下

su www -s /bin/bash -c “php artisan schedule:run”
6年前 评论
panda-sir

php cli 或者 fpm 都是用 www 用户去执行 就不会出现你这个问题的

6年前 评论

日志的配置里面,写名文件权限 0646 或者 0777 就可以了

6年前 评论

composer yarn artisan 全部都用 www 用户执行

6年前 评论

@leo 用了 supervisor 队列,root 用户时执行正常,但写入日志是 root 权限的,改为 www 用户时,队列就不运行了,是不是 www 用户必须给予登录系统的权限才行?

6年前 评论
leo

@haibin_hu 那你得看看 supervisor 输出什么

6年前 评论
leo (作者) 6年前
haibin_hu 6年前
haibin_hu 6年前

给 artisan 命令设置一个 alias ,su www 不就没那么多问题了

6年前 评论

@leo

try{
    Log::notice('test');
}catch (\exception $e){
    return $e->getMessage(). '|'. $e->getFile() . '|' .$e->getLine();
}

访问包含这段代码的控制器

5年前 评论
cc1997

报错啊,laravel 8

4年前 评论