kohana日志文件权限:不可写入组

时间:2013-11-26 08:58:43

标签: logging filesystems file-permissions

我们正在Kohana开发一个API,我们遇到的问题是我们的日志文件没有该组的写权限。这是11月目录的样子:

.../application/logs/2013/11$ ls -al
total 2520
drwxr-sr-x 2 xyz wwwxyz    4096 Nov 26 09:12 .
drwxr-sr-x 9 xyz wwwxyz    4096 Nov 14 09:55 ..
-rw-r--r-- 1 xyz wwwxyz    5769 Nov 14 09:55 04.php
-rw-r--r-- 1 xyz wwwxyz 2511368 Nov 14 09:55 05.php
-rw-r--r-- 1 xyz wwwxyz     876 Nov 14 09:55 06.php
-rw-r--r-- 1 xyz wwwxyz     876 Nov 14 09:55 12.php
-rw-r--r-- 1 xyz wwwxyz     300 Nov 14 09:55 13.php
-rw-r--r-- 1 xyz wwwxyz    1961 Nov 26 08:45 14.php
-rw-r--r-- 1 xyz wwwxyz    1961 Nov 26 08:45 22.php
-rw-rw-r-- 1 xyz wwwxyz   21165 Nov 26 09:25 26.php

wwwxyz是apache用户。已手动修改今日日志文件(2013年11月26日)以使应用程序能够运行。

这就是我们在应用程序中手动使用日志文件的方式:

  

Log :: instance() - > add(Log :: INFO,$ content);

这是一个访问日志(它存储所有API命令日志)

  

Log :: instance() - > add(Log :: ERROR,$ e-> getFile()。':'。$ e-> getLine()。''。$ e-> getMessage ());

这是一个错误日志(在try / catch语句中)。

目前,我们需要为新创建的日志文件手动设置组的可写权限(g + w)。由于这种解决方案从长远来看是不可接受的,我们希望找到这种情况的原因。

1 个答案:

答案 0 :(得分:0)

我想我终于找到了解决方案。 Kohana的默认日志文件编写器如下所示:

public function write(array $messages)
{
    // Set the yearly directory name
    $directory = $this->_directory.date('Y');

    if ( ! is_dir($directory))
    {
        // Create the yearly directory
        mkdir($directory, 02777);

        // Set permissions (must be manually set to fix umask issues)
        chmod($directory, 02777);
    }

    // Add the month to the directory
    $directory .= DIRECTORY_SEPARATOR.date('m');

    if ( ! is_dir($directory))
    {
        // Create the monthly directory
        mkdir($directory, 02777);

        // Set permissions (must be manually set to fix umask issues)
        chmod($directory, 02777);
    }

    // Set the name of the log file
    $filename = $directory.DIRECTORY_SEPARATOR.date('d').EXT;

    if ( ! file_exists($filename))
    {
        // Create the log file
        file_put_contents($filename, Kohana::FILE_SECURITY.' ?>'.PHP_EOL);

        // Allow anyone to write to log files
        chmod($filename, 0666);
    }

    foreach ($messages as $message)
    {
        // Write each message into the log file
        // Format: time --- level: body
        file_put_contents($filename, PHP_EOL.$message['time'].' --- '.$this->_log_levels[$message['level']].': '.$message['body'], FILE_APPEND);
    }
}

如果您的logs目录为空,它可以正常工作 - 创建年目录,然后是月目录,最后是日志文件(所有权限都具有适当的权限,覆盖umask设置)。我们的问题是由于部署 - 我们使用rsync而不是jenkins。我们有-rl个标志而不是-rlp(保留权限)。在jenkins测试期间,我们运行了间接创建日志文件的cURL测试。没有-p标志日志文件是使用umask复制的,后者应用g-w,因此apache用户无权写入日志文件。