[Haskell-cafe] Network.FastCGI does not emit stderr outputs to lighttpd's error.log?

Bjorn Bringert bjorn at bringert.net
Tue Nov 4 04:32:18 EST 2008


On Thu, Jul 31, 2008 at 6:37 PM, Don Stewart <dons at galois.com> wrote:
> agentzh:
>> On Thu, Jul 31, 2008 at 1:56 AM, Don Stewart <dons at galois.com> wrote:
>> >
>> > We've had no problems with this and apache at least. Is lighttpd
>> > doing something funny with error logging?
>>
>> It seems that Apache is doing something funny :) According to my
>> teammate chaoslawful, apache redirects stderr to its error log files
>> (if any) but the fastcgi spec actually says everything should go
>> through the socket. And lighttpd seems to be following the spec
>> exactly :)
>>
>> chaoslawful++ finally come up with the following patch for lighttpd
>> 1.4.19 to make lighttpd behave in the same way as apache. Devel.Debug
>> is now finally working for me for my Haskell fastcgi hacking :))
>>
>>  --- lighttpd-1.4.19/src/log.c    2007-08-22 01:40:03.000000000 +0800
>> +++ lighttpd-1.4.19-patched/src/log.c    2008-07-31 15:13:10.000000000 +0800
>> @@ -83,9 +83,14 @@
>>         /* move stderr to /dev/null */
>>         if (close_stderr &&
>>             -1 != (fd = open("/dev/null", O_WRONLY))) {
>> -            close(STDERR_FILENO);
>> +                // XXX: modified by chaoslawful, don't close stderr
>> when log into file
>> +            close(STDERR_FILENO);
>> +                if (srv->errorlog_mode == ERRORLOG_FILE &&
>> srv->errorlog_fd >=0 ) {
>> +                    dup2(srv->errorlog_fd,STDERR_FILENO);
>> +                } else {
>>             dup2(fd, STDERR_FILENO);
>> -            close(fd);
>> +                }
>> +                close(fd);
>>         }
>>         return 0;
>>     }
>>
>> Best,
>> -agentzh
>
> Interesting result, thanks for looking into this.

You could also handle this issue without modifying Lighttpd by
redirecting stderr to a file. Put this in your Haskell program:

import System.Posix.Files
import System.Posix.IO

stderrToFile :: FilePath -> IO ()
stderrToFile file =
    do let mode = ownerModes `unionFileModes` groupReadMode
`unionFileModes` otherReadMode
       fileFd <- openFd file WriteOnly (Just mode) (defaultFileFlags {
append = True })
       dupTo fileFd stdError
       return ()

main = do stderrToFile "my-fastcgi-log.log"
                 runFastCGI ...

Another way is to have a small wrapper shell script around your
FastCGI program that does the same redirection.

/Björn


More information about the Haskell-Cafe mailing list