2013-11-10 2 views
2

Я пытаюсь разделить файлы журнала доступа на моем сервере Nginx.Журнал доступа не будет регистрироваться после замены новым файлом журнала

Для формулировки файла я просто переименую исходный файл журнала доступа и создаю новый файл журнала доступа, чтобы я ничего не пропустил.

Но после замены файла Nginx ничего не записывает в этот файл, но работает до тех пор, пока не заменит файл.

Nginx снова запускает запись в замененный файл после перезапуска Nginx.

Я не вижу, что я делаю неправильно, любая помощь?

Первый бит PHP кода

if(rename("access.log", $tempname)){ // I'm renaming the access log file 
    $fp = fopen("access.log","wb"); 
    if($fp == false){ 

    }else{ 
     fwrite($fp,$content); // I'm creating a new access log file 
     fclose($fp); 
    } 
    // I'm phrasing the renamed file here 
} 
+1

Не уверен, но я бы предположил, что nginx хранит дескриптор открытого файла для файла, поэтому он открывается только при перезагрузке nginx? –

+0

Итак, я прочитал исходный код для nginx, и он выглядит так, как файл журнала открывается только при запуске программы, а затем дескриптор файла сохраняется для любого добавления к файлу. См. Https://github.com/nginx/nginx/blob/master/src/core/nginx.c#L280 –

ответ

1

Как я уже говорил в моих комментариях, вероятно, не возможно удалить файл из-за характера Nginx, мое предложение было бы использовать тот же подход, но не на самом деле удаление файла журнала. Вместо этого просто очистите его.

псевдокоде

file = open "nginx.log", READ 
new_file = open tmpname, WRITE 
new_file.write file.contents 
file.close 
new_file.close 
sys_command "cat /dev/null > nginx.log" 

Или с помощью сценария

#!/bin/bash 
cp nginx.log nginx.backup.log 
cat /dev/null > nginx.log 

Таким образом, вы не разрушая файл, и дескриптор файла, который Nginx имеет еще будет действительным.

+0

Отлично! Спасибо, я просто принял вашу концепцию и применил ее к существующему скрипту PHP. –

+0

Я скопировал access.log в другой файл с помощью функции copy() и использовал функцию @ftruncate PHP для очистки содержимого исходного файла access.log. Спасибо снова Хьюго. –

+0

Np, удачи в проекте :) –

Смежные вопросы