On Feb 17, 3:01 pm, Malcolm Tredinnick <malc...@pointy-stick.com> wrote: > > I think I should have clarified some more facts about my setup. > > 1- On mac, django is running on dev mode, so stdout is the console. On > > linux, it'smod_wsgi, so stdout is redirected to apache error log > > files, on which I'm issuing a "tail -f" thorough ssh. > > I was a little surprised that stdout was redirected to the error logs in > mod_wsgi, but it seems that that is indeed the case.
In default configuration mod_wsgi does not send stdout to the Apache error logs. In fact if you try and output to stdout mod_wsgi will complain and raise an exception. This is because mod_wsgi deliberately restricts writing to stdout to discourage people using 'print' for debug. This is done because by doing so you make your WSGI application less portable. In particular, your WSGI application would break in a WSGI hosting mechanism which uses stdout to communicate the response back to the web server. Such a mechanism is used for CGI-WSGI bridges. Thus, if stdout is going to the Apache error logs it is because the user made a conscious decision to redirect it there by disabling the mod_wsgi restriction on using stdout. This can be done by using WSGIRestrictStdout directive, or explicitly reassigning sys.stdout to be sys.stderr. All this stuff about stdout is described in: http://code.google.com/p/modwsgi/wiki/ApplicationIssues#Writing_To_Standard_Output http://code.google.com/p/modwsgi/wiki/DebuggingTechniques > I don't know what > mod_wsgi might be doing to character encoding on output (maybe nothing, > but maybe that's playing a role). Uses: PyArg_ParseTuple(args, "s#:write", &msg, &len) so presumably the default encoding. If the default encoding isn't UTF-8, then you may have problems in trying to output Unicode strings if it cannot be represented in whatever default encoding is. This would likely result in exception and so perhaps what you are seeing. > However, instead of using print, I > would recommend using Python's logging module and sending the results to > a dedicated logging file. > > Apache error logs aren't a great place for audit-style logging, since > there's so much other (Apache-specific) stuff in there. If the integrity of the information being logged is important, then I also would be recommending logging to your own files. The mapping of sys.stderr to Apache error logging mechanism should be seen as more of a failsafe default for minor logging. If you need a more serious logging system, implement your own. Mapping to Apache error logging mechanism has a couple of shortcomings, plus a bug in mod_wsgi 2.3. The bug stems from fact that it is trying to force data into a C API call that takes NULL terminated C strings. Forgot about that aspect of it so it is currently truncating at any embedded null in something which is logged. So, okay if text, but shove binary data down it and it will not be happy. This is addressed in mod_wsgi 3.0. All it can do though is interpret an embedded null as if it was a newline because Apache logging API doesn't understand concept of length. The reason that Apache logging API is used rather than just stuffing it direct into file descriptor for log file, is that it allows Apache to use syslog for logging or for it to be intercepted by any other custom Apache modules that want to process error log messages. Also Apache adds useful date/time information to each line. A limitation of the logging API though is that also has a maximum line length. Thus, it also throws away anything over about 8192 bytes when have a really long line. I am looking at how can easily work around this limitation for mod_wsgi 3.0. Likely will just treat it as if newline had been inserted. The problem though is knowing at what point to artificually insert the newline, as where Apache will truncate it varies based on all the prefix information it adds. Note that the above limitations also apply to wsgi.errors passed in WSGI request environment. Anything output to wsgi.errors also ends up in Apache error log, but also has client and referrer information prefix as well as date/time. It is this referrer information that makes it hard to work out to artificially truncate a line. If the limitations on what successfully gets through with stderr are a problem, then one thing you can do is restore the original Python stderr object. sys.stderr = sys.__stderr__ This will result in it going direct to the main Apache error log. You do need to ensure you explicitly flush the data in stream though to have it appear. Note that whereas sys.stderr for mod_wsgi daemon process defined in VirtualHost context goes to VirtualHost specific error log file, anything sent to sys.__stderr__ will still got to main Apache error log file. This is addressed in mod_wsgi 3.0, with it going to correct VirtualHost specific log file. Anyway, this is probably a lot more detail than what you what you want to know and which is appropriate for this list. For this sort of question a it pertains to mod_wsgi you perhaps would have been better going to the mod_wsgi list. Graham --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to django-users@googlegroups.com To unsubscribe from this group, send email to django-users+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/django-users?hl=en -~----------~----~----~----~------~----~------~--~---