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 协议》,转载必须注明作者和本文链接
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 22
leo

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

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

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

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

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

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

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

5年前 评论

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

5年前 评论
leo

@gedongdong2010 crontab -e -u www

5年前 评论

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

5年前 评论
leo

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

5年前 评论

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

5年前 评论
leo

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

5年前 评论

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

5年前 评论
leo
5年前 评论

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

5年前 评论
leo

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

5年前 评论

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

5年前 评论

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

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

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

5年前 评论

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

4年前 评论

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

4年前 评论

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

4年前 评论
leo

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

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

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

4年前 评论

@leo

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

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

4年前 评论
cc1997

报错啊,laravel 8

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!