日志文件写入失败(permission denied)
用过Laravel的小伙伴一开始安装完框架后可能都遇到过daily 日志文件写入失败的问题,接下来我们就来详细说下日志文件写入失败的原因以及对应的解决方案。
在讲这个问题之前可能需要简单介绍下Linux系统下的文件的Ownership和Permission。
Ownership
User
User是文件的所有者,默认情况下,用户创建了一个文件,该文件的所有者就是该用户。
Group
一个用户组能包含多个用户,所有属于这个组的用户都有相同的权限来访问文件。假设你有一个项目,很多用户都需要访问这个项目文件的权限,你不需要手动赋予这些用户所有权限,你只需要把这些用户加到一个组里面,赋予这些组有访问文件的权限,这样一来就仅仅只有组里面的成员能对文件进行读写操作。
Other
任何其他的用户都能访问文件,因此,给Other用户赋予权限,相当于所有用户都拥有这个权限。
Permission
在 UNIX/Linux 系统中每一个文件和目录都有3中权限,以下就是对三个所有者的讨论。
- Read:这个权限赋予你打开和读取文件的权限。拥有目录的读权限,你能列出其内容。
- Write:拥有了读权限,你能修改文件的内容。拥有了目录的写权限,你能添加、移除以及重命名该目录下的文件。考虑一种场景,当你拥有文件的写权限,但是没有文件存储目录的写权限,你还是能修改文件的内容,但不能重命名、移动以及移除目录下的文件。
- Execute:在Windows系统中,一个可执行的程序通常都有.exe后缀,你能很方便的运行它。在 UNIX/Linux 中,除非被赋予可执行权限,否则你将不能运行该程序。如果未授权可执行权限,你让然可以看并修改程序代码(被授予读和写权限),但是无法运行它。


以上的截图显示了一个文件和文件夹的信息,我们可以看到:
r代表可读,w代表可写,x代表可执行。- 第一位文件显示
-,文件显示d。 - 上面第一张图片,
rw-rw-r-—中。第一组rw-表示文件的所有者对文件有可读、可写、不可执行的权限。第二组rw-表示文件所属的组内用户对该文件有可读、可写、不可执行的权限。第三组r-—表示其他任何用户对该文件有可读、不可写、不可执行的权限。 rw-rw-r--用二进制表示为664,每一位如有权限则为1,否则为0,第一个三位rw-用二进制表示为110转化为十进制就是6,后面两组依次类推,最后得到664。- 上面第一张图片的
dior www-data表示该文件的所有者是dior用户,文件属于www-data组。
我们知道很多应用系统中的日志是写文件的,且是以日期来命名文件的。所以第一次创建日志的用户就显得尤为重要,如果文件创建的 Onwer和 Group 不对,其他的用户触发写入日志文件就会失败。
接下来我们讨论下有多少种不同的用户可能创建日志文件:
Crontab中执行的定时任务,跟创建Crontab的用户有关,此时创建的文件Owner和Group值分别是该用户以及默认的Group。- 一些常驻的后台进程,比如Laravel中的
queue work,此时创建的日志文件Owner和Group值分别是执行该进程的用户以及所属的默认Group。 - 正常用户访问网站产生的日志文件,此时创建的日志文件的
Owner和Group都是www-data,www-data用户是web服务器默认的用户。
由以上的分析,我们大概已经找到了解决问题的方法。
- 执行用户创建日志文件的权限为
664比较恰当,这就需要当前用户的umask为0002。 - 当前执行用户的默认
Group应该设置为www-data。
下面就说下我的具体解决方案:
指定www-data用户执行crontab:
sudo crontab -u www-data -e
Laravel中修改创建日志文件的权限:
编辑 confog/logging.php 文件
添加 'permission' => 0664
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.log'),
'level' => 'debug',
'days' => 14,
'permission' => 0664,
],
你有什么更好的方法么?欢迎留言!
日志文件写入失败(permission denied)的更多相关文章
- linux 下执行.sh文件总是提示permission denied
linux 下执行.sh文件总是提示permission denied 如果你是root登陆的话(不是的话,切换到root用户,对*.sh赋可执行的权限) chmod 777 *.sh or ch ...
- 扔掉log4j、log4j2,自己动手实现一个多功能日志记录框架,包含文件,数据库日志写入,实测5W+/秒日志文件写入,2W+/秒数据库日志写入,虽然它现在还没有logback那么强大
讲到log4j,现在国外基本是没有开发者用这个框架了,原因大致有几点,1.功能太少:2.效率低下:3.线程锁bug等等等各种莫名其妙的bug一直都没解决. 其实最重要的是log4j的作者自己也放弃了l ...
- Ubuntu16.04 使用sudo cat EOF 编辑文件,提示Permission denied错误的解决办法
一.执行命令报错 在Ubuntu16.04下,使用如下命令,修改hosts主机文件,居然提示权限错误: catty@node186:~$ sudo cat <<EOF > /etc/ ...
- 向vsftp服务器上传文件报“550 Permission denied”错误的解决办法
上传文件: ftp> mput db.iso 550 Permission denied 原因:vsftp默认配置不允许上传文件. 解决:修改/etc/vsftpd.conf 将“write_e ...
- 【IOS】mac终端运行.sh文件总是提示permission denied
如果我目录jni有一个list.sh文件 我直接 nxgametekiMacBook-Air:jni luonan$ ./list.sh ../../Classes 提示 permission de ...
- iOS编译Unity3d文件报错 Permission denied
最近在尝试Unity3d的使用,毕竟Unity可以很好的编译出iOS代码,只用我们正常进行打包就好了. 这里遇到了个问题,分享一下. Archive快结束的时候,报了三个错误,类似于 /Users/s ...
- 记一次由selinux引起的使用cat查看文件报错Permission denied的问题排查
事件起因:如下 1.在服务器上root用户,定期会生成一个文件,到/tmp目录,如:qq_5201351.txt,给other加上了r读取 2.zabbix端会周期性取这台服务器/tmp/qq_520 ...
- Python实现日志文件写入或者打印--类似于Java的Log4j
开发过Java的应该都知道Log4j的重要性,尤其是在开发测试中,能够让开发和测试人员方便找的bug,Python也有和Log4j相同功能的库那就是logging库,其功能非常强大,在开发测试中很方便 ...
- logstash 抓取IIS日志文件写入Elasticsearch
如果需要对IIS日志进行分析可以使用logstash从文件中抓取出来进行分析: 输入部分: input { file { type => "iis_log_monitor" ...
随机推荐
- Ubuntu 18.04 root 使用ssh密钥远程登陆
前言: Ubuntu默认是禁止root用户远程登陆 本教程解决Ubuntu 18.04版本 root用户 使用ssh密钥无法远程登陆的问题 问题发生的环境: 腾讯云,重装Ubuntu服务器时选择使用s ...
- SSH框架,xml配置实现动态定时器
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-// ...
- Web前端三大框架_vue源码笔记
一.VUE 1.1 MVVM VUE也是基于MVVM模式实现的.特点就是数据双向绑定 在MVVM模式中,分成三个部分: M 模型 model V 视图 view VM 视图-模型 view-model ...
- css基础5
今天在这里跟大家分享css基础最核心的部分,浮动和定位.话不多说,直接上干货! 一.浮动 定义:定位元素是相对于其正常位置应该出现的位置.定位元素的位置是相对于自身.父级元素位置.其他元素以及浏览器窗 ...
- 1.低权限的程序向高权限的程序发消息 2.慎用setcurrentdirectory
1.低权限的程序向高权限的程序发消息 2.慎用setcurrentdirectory
- Excel催化剂开源第45波-按原图大小导出图片
从Excel中导出图片,是一个很常规的需求,也有一些久旧不衰的界面操作法小技巧从OpenXml文件中批量导出,在VBA开发中,也会使用Chart对象的背景图的技巧来导出.总体来说,和真正想要的效果还是 ...
- python-if条件判断与while/for循环
条件判断if 让计算机像人一样,能判断是非对错,根据条件做一些事情. if ''' ------ if代码结构:------- if 条件: 代码体 tips:同一缩进范围内的代码被视作同一代码体,p ...
- HTML 去调table表单里面td之间的间距
首先为大家展示一下最原始的代码和效果.直接在table中用td划分的表格会默认隐藏边框. 接下来我们用css来增加样式,为table增加边框. table { border: 1px solid # ...
- Java面试题-基础篇三(干货)
这些JAVA基础题确定都会了吗? 31.String s = new String("xyz");创建了几个StringObject?是否可以继承String类? 两个或一个都有可 ...
- python基础——字符串(string)
字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 创建字符串很简单,只要为变量分配一个值即可. str1 = 'python' str2 = " ...