用过Laravel的小伙伴一开始安装完框架后可能都遇到过daily 日志文件写入失败的问题,接下来我们就来详细说下日志文件写入失败的原因以及对应的解决方案。

在讲这个问题之前可能需要简单介绍下Linux系统下的文件的Ownership和Permission。

  • Ownership

    • User

      User是文件的所有者,默认情况下,用户创建了一个文件,该文件的所有者就是该用户。

    • Group

      一个用户组能包含多个用户,所有属于这个组的用户都有相同的权限来访问文件。假设你有一个项目,很多用户都需要访问这个项目文件的权限,你不需要手动赋予这些用户所有权限,你只需要把这些用户加到一个组里面,赋予这些组有访问文件的权限,这样一来就仅仅只有组里面的成员能对文件进行读写操作。

    • Other

      任何其他的用户都能访问文件,因此,给Other用户赋予权限,相当于所有用户都拥有这个权限。

  • Permission

    在 UNIX/Linux 系统中每一个文件和目录都有3中权限,以下就是对三个所有者的讨论。

    • Read:这个权限赋予你打开和读取文件的权限。拥有目录的读权限,你能列出其内容。
    • Write:拥有了读权限,你能修改文件的内容。拥有了目录的写权限,你能添加、移除以及重命名该目录下的文件。考虑一种场景,当你拥有文件的写权限,但是没有文件存储目录的写权限,你还是能修改文件的内容,但不能重命名、移动以及移除目录下的文件。
    • Execute:在Windows系统中,一个可执行的程序通常都有.exe后缀,你能很方便的运行它。在 UNIX/Linux 中,除非被赋予可执行权限,否则你将不能运行该程序。如果未授权可执行权限,你让然可以看并修改程序代码(被授予读和写权限),但是无法运行它。

linux下文件信息的显示截图

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 组。

我们知道很多应用系统中的日志是写文件的,且是以日期来命名文件的。所以第一次创建日志的用户就显得尤为重要,如果文件创建的 OnwerGroup 不对,其他的用户触发写入日志文件就会失败。

接下来我们讨论下有多少种不同的用户可能创建日志文件:

  • Crontab中执行的定时任务,跟创建 Crontab 的用户有关,此时创建的文件 OwnerGroup 值分别是该用户以及默认的 Group
  • 一些常驻的后台进程,比如Laravel中的 queue work ,此时创建的日志文件 OwnerGroup 值分别是执行该进程的用户以及所属的默认 Group
  • 正常用户访问网站产生的日志文件,此时创建的日志文件的 OwnerGroup 都是 www-datawww-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)的更多相关文章

  1. linux 下执行.sh文件总是提示permission denied

      linux 下执行.sh文件总是提示permission denied 如果你是root登陆的话(不是的话,切换到root用户,对*.sh赋可执行的权限) chmod 777 *.sh or ch ...

  2. 扔掉log4j、log4j2,自己动手实现一个多功能日志记录框架,包含文件,数据库日志写入,实测5W+/秒日志文件写入,2W+/秒数据库日志写入,虽然它现在还没有logback那么强大

    讲到log4j,现在国外基本是没有开发者用这个框架了,原因大致有几点,1.功能太少:2.效率低下:3.线程锁bug等等等各种莫名其妙的bug一直都没解决. 其实最重要的是log4j的作者自己也放弃了l ...

  3. Ubuntu16.04 使用sudo cat EOF 编辑文件,提示Permission denied错误的解决办法

    一.执行命令报错 在Ubuntu16.04下,使用如下命令,修改hosts主机文件,居然提示权限错误: catty@node186:~$ sudo cat <<EOF > /etc/ ...

  4. 向vsftp服务器上传文件报“550 Permission denied”错误的解决办法

    上传文件: ftp> mput db.iso 550 Permission denied 原因:vsftp默认配置不允许上传文件. 解决:修改/etc/vsftpd.conf 将“write_e ...

  5. 【IOS】mac终端运行.sh文件总是提示permission denied

    如果我目录jni有一个list.sh文件 我直接 nxgametekiMacBook-Air:jni luonan$  ./list.sh ../../Classes 提示 permission de ...

  6. iOS编译Unity3d文件报错 Permission denied

    最近在尝试Unity3d的使用,毕竟Unity可以很好的编译出iOS代码,只用我们正常进行打包就好了. 这里遇到了个问题,分享一下. Archive快结束的时候,报了三个错误,类似于 /Users/s ...

  7. 记一次由selinux引起的使用cat查看文件报错Permission denied的问题排查

    事件起因:如下 1.在服务器上root用户,定期会生成一个文件,到/tmp目录,如:qq_5201351.txt,给other加上了r读取 2.zabbix端会周期性取这台服务器/tmp/qq_520 ...

  8. Python实现日志文件写入或者打印--类似于Java的Log4j

    开发过Java的应该都知道Log4j的重要性,尤其是在开发测试中,能够让开发和测试人员方便找的bug,Python也有和Log4j相同功能的库那就是logging库,其功能非常强大,在开发测试中很方便 ...

  9. logstash 抓取IIS日志文件写入Elasticsearch

    如果需要对IIS日志进行分析可以使用logstash从文件中抓取出来进行分析: 输入部分: input { file { type => "iis_log_monitor" ...

随机推荐

  1. 满足高密度设备存储需求 一颗ICMAXLPDDR4X 8GB就行

    通讯技术在当代无疑更新越来越快速,随着5G时代即将到来,对通讯的设备的要求也将提出更高的要求.具备AI功能的硬件设备将普及化,其智能化程度也将越来越高,同时对手机等智能移动设备的内存容量和带宽也提出了 ...

  2. 最新 centos7下zabbix 监控redis状态

    准备 先准备两台服务器,已经部署好了zabbix-sever和zabbix-agent zabbix-server 192.168.1.70 centos7.2 zabbix-agent 192.16 ...

  3. I/O:FileLock

    FileLock: /* 文件锁定要么是独占的,要么是共享的.共享锁定可阻止其他并发运行的程序获取重叠的 独占锁定,但是允许该程序获取重叠的共享锁定.独占锁定则阻止其他程序获取任一类型的重叠锁 定.一 ...

  4. [剑指offer] 3. 从头到尾打印链表

    题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 思路: 利用容器,遍历一遍加入到一个新容器里,然后反置输出. vector 用 reverse stack 则直接一个个出栈 ...

  5. Surging实践经验

    背景 在去年9月份的时候,我入职一家做航空软件产品的公司.当时公司部门领导决定构建一个技术平台(或称为技术中台),通过该技术平台进而孵化各个业务系统.说白了就是需要通过一个分布式框架或是微服务框架提高 ...

  6. React中创建组件的3种方式

    目前作者所知道的创建react组件的方式有三种: 函数式定义(无状态组件) function MyComponent(props){ return( <h1>mycomponent< ...

  7. linux初学者-磁盘加密篇

    linux初学者-磁盘加密篇 因为保密需要,一般系统中会在文件和磁盘中进行加密,但是文件的加密比较容易破解,不安全.所以在特殊需要下,会对磁盘进行加密,磁盘加密后在磁盘损坏的同时,其中的数据也会损坏, ...

  8. 用maven工具管理web项目的错误记录:org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException

    运行异常报告日志: 严重: Context initialization failedorg.springframework.beans.factory.xml.XmlBeanDefinitionSt ...

  9. kuberenetes CRD开发指南

    扩展kubernetes两个最常用最需要掌握的东西:自定义资源CRD 和 adminsion webhook, 本文教你如何十分钟掌握CRD开发. kubernetes允许用户自定义自己的资源对象,就 ...

  10. centos7上搭建zookeeper集群

    1.下载zookeeper http://www.apache.org/dyn/closer.cgi/zookeeper/  可以登录这个网站下载,然后上传到 centos上 修改成自己需要的版本 , ...