Позвольте мне сначала заявить, что это вообще плохая идея, поскольку у вас будет один файл на IP-адрес.Вы можете подумать, что это круто и легко управлять, и все, пока у вас не будет более 2 миллионов уникальных посетителей на вашем сайте, и вы не столкнетесь с серьезными проблемами.Эти проблемы включают в себя: очень низкую производительность диска, невозможность легко ls
и rm
в каталоге журналов и возможность исчерпания inode перед тем, как закончится свободное место на диске.Вы были предупреждены.
Тем не менее, если вы действительно все еще хотите это сделать, apache имеет директиву CustomLog
:
http://httpd.apache.org/docs/current/logs.html#piped
С этим вы можете сделать что-то вроде этого:
CustomLog "|/path/to/script" common
Где /path/to/script
- это программа, которая читает stdin и записывает файлы на основе заданного IP-адреса.Вы должны написать это сами, так как я не знаю ничего доступного для этого.Это может выглядеть примерно так (perl):
#!/usr/bin/perl
while (<STDIN>) {
if ($_ =~ /^(\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b)/) {
open FILE, ">>", "/path/to/log/dir/" . $1 . ".txt";
print FILE $_;
close FILE;
} else {
print STDERR "invalid input format!\n";
}
}
Этот скрипт является лишь примером, так как он будет иметь условия гонки и проблемы с производительностью, так как он открывает и закрывает файл при каждой записи.Однако будьте осторожны, как будто у вас слишком много открытых файловых дескрипторов одновременно, вы больше не сможете открывать.