Hi --
I am a new user of MP2. Pardon my basic questions.
Here's my situation:
My Apache generates 4 sets of logs.
Three of them are generated by Apache directly: access, error, and a custom log tracking access for certain file types.
The fourth is made by a MP2 handler dealing with redirects. Here's the snippet of relevant code.
sub mylog { my (@fields) = @_; my $entry = join ( "|", @fields ); open my $fh, ">>" . &MYLOG or die "can't open " . &MYLOG . ": $!"; flock $fh, LOCK_EX; print $fh $entry . "\n"; close $fh; }
Currently I'm rolling my logs "manually" -- a process renames the four sets of logs, waits, then
restarts the server.
I am considering using piped logs
http://httpd.apache.org/docs-2.0/logs.html#piped
with rotatelogs
http://httpd.apache.org/docs-2.0/programs/rotatelogs.html
instead to avoid the restart.
I understand how to instruct Apache to log via a pipe
to rotatelogs.
My questions relate to the mylog() function:
Can I / should I direct output to a pipe? Would this do anything unpleasant to MP2 or AP2?
Not, unless you load the mod_soul module ;)
If doing this is OK, do I just open the pipe like a file?
<untested code> open my $fh, "|bin/rotatelogs /var/logs/%y_%m_%d_%H_%M_%S 14400" or die "can't open pipe to rotatelogs: $!"; </untested code>
that's a *very* bad idea, as you will spawn a new process on each request. You need to open your log handler during the PerlOpenLogsHandler as explained here:
http://perl.apache.org/docs/2.0/user/handlers/server.html#Startup_Phases_Demonstration_Module
http://perl.apache.org/docs/2.0/user/handlers/server.html#PerlOpenLogsHandler
and then just log things at request time. So you will change the open call to log into the rotator.
I'd remove the FLOCK, yes?
Several processes writing to the same file at the same time will mess things up, unless /bin/rotatelogs handles the flocking (you need to check that). But since in the suggested above solution, you will end up with several processes writing to the same pipe, you must flock it.
I think I need to add flocking the examples I've referenced above. it's needed in the child_init and child_exit phases, where there are several processes.
Also I didn't see in your code where you import LOCK_EX. Make sure you don't write:
use POSIX
http://perl.apache.org/docs/1.0/guide/performance.html#Global_vs__Fully_Qualified_Variables but:
use Fcntl qw(:flock);
If I do this, should I close the pipe after use, as I do now in mylog() with close $fh?
Are there any speed or stability concerns logging through a rotatelog, vs. to a file?
I'd think that it the difference should be insignificant, unless you have a really high vollume traffic, in which case benchmarking should help to tell the exact difference.
__________________________________________________________________ Stas Bekman JAm_pH ------> Just Another mod_perl Hacker http://stason.org/ mod_perl Guide ---> http://perl.apache.org mailto:[EMAIL PROTECTED] http://use.perl.org http://apacheweek.com http://modperlbook.org http://apache.org http://ticketmaster.com
-- Reporting bugs: http://perl.apache.org/bugs/ Mail list info: http://perl.apache.org/maillist/modperl.html List etiquette: http://perl.apache.org/maillist/email-etiquette.html