我们正在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)。由于这种解决方案从长远来看是不可接受的,我们希望找到这种情况的原因。
答案 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用户无权写入日志文件。