Re: Вопрос по логированию

51 views
Skip to first unread message

livskiy

unread,
Mar 12, 2013, 7:28:16 AM3/12/13
to django-...@googlegroups.com
Вам нужно создать каcтомную команду runserver. Сделал для разминки, она выглядит как-то так:

"""
Custom runserver command that logs out urlunquoted strings to console.
"""
import os
import sys
from datetime import datetime
 
from django.core.servers.basehttp import (WSGIRequestHandler, WSGIServer,
WSGIServerException)
from django.core.management.commands import runserver
from django.utils.six.moves import socketserver
from django.utils.http import urlunquote
 
 
class CustomLoggingWSGIRequestHandler(WSGIRequestHandler):
def log_message(self, format, *args):
"""
Heads up. Customized log method.
"""
args = list(args)
args[0] = urlunquote(args[0])
return super(CustomLoggingWSGIRequestHandler, self).log_message(
format, *args)
 
 
def run(addr, port, wsgi_handler, ipv6=False, threading=False):
server_address = (addr, port)
if threading:
httpd_cls = type(str('WSGIServer'), (socketserver.ThreadingMixIn,
WSGIServer), {})
else:
httpd_cls = WSGIServer
httpd = httpd_cls(server_address, CustomLoggingWSGIRequestHandler,
ipv6=ipv6)
httpd.set_app(wsgi_handler)
httpd.serve_forever()
 
 
class Command(runserver.Command):
"""
Custom runserver command that utilizes CustomLoggingWSGIRequestHandler.
"""
def inner_run(self, *args, **options):
from django.conf import settings
from django.utils import translation
 
threading = options.get('use_threading')
shutdown_message = options.get('shutdown_message', '')
quit_command = ['CONTROL-C', 'CTRL-BREAK'][sys.platform == 'win32']
 
self.stdout.write("Validating models...\n\n")
self.validate(display_num_errors=True)
self.stdout.write((
"%(started_at)s\n"
"Django version %(version)s, using settings %(settings)r\n"
"Development server is running at http://%(addr)s:%(port)s/\n"
"Quit the server with %(quit_command)s.\n"
) % {
"started_at": datetime.now().strftime('%B %d, %Y - %X'),
"version": self.get_version(),
"settings": settings.SETTINGS_MODULE,
"addr": self._raw_ipv6 and '[%s]' % self.addr or self.addr,
"port": self.port,
"quit_command": quit_command,
})
# django.core.management.base forces the locale to en-us. We should
# set it up correctly for the first request (particularly important
# in the "--noreload" case).
translation.activate(settings.LANGUAGE_CODE)
 
try:
handler = self.get_handler(*args, **options)
run(self.addr, int(self.port), handler,
ipv6=self.use_ipv6, threading=threading)
except WSGIServerException as e:
# Use helpful error messages instead of ugly tracebacks.
ERRORS = {
13: "You don't have permission to access that port.",
98: "That port is already in use.",
99: "That IP address can't be assigned-to.",
}
try:
error_text = ERRORS[e.args[0].args[0]]
except (AttributeError, KeyError):
error_text = str(e)
self.stderr.write("Error: %s" % error_text)
# Need to use an OS exit because sys.exit doesn't work in a thread
os._exit(1)
except KeyboardInterrupt:
if shutdown_message:
self.stdout.write(shutdown_message)
sys.exit(0)
Гист

Куда это закидывать знаете?

12 марта 2013 г., 16:03 пользователь <xupypr...@gmail.com> написал:
Здравствуйте! Сразу к сути... Есть категории реализованные через красивые урлы, но используются русские символы, и в браузере урлы отображаются хорошо, а в логе (консоли) dev сервера в виде ...%D0%D1%.... и так далее. Как настроить логгер на корректное отображение урлов?

--
Вы получили это сообщение, поскольку подписаны на группу Django russian.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес django-russia...@googlegroups.com.
Подробнее о функциях можно узнать на странице https://groups.google.com/groups/opt_out.
 
 

stealth

unread,
Mar 12, 2013, 2:51:05 PM3/12/13
to django-...@googlegroups.com
12 марта 2013 г., 14:03 пользователь <xupypr...@gmail.com> написал:
> Здравствуйте! Сразу к сути... Есть категории реализованные через красивые
> урлы, но используются русские символы, и в браузере урлы отображаются
> хорошо, а в логе (консоли) dev сервера в виде ...%D0%D1%.... и так далее.
> Как настроить логгер на корректное отображение урлов?
>

Написать собственный formatter или filter

xupypr...@gmail.com

unread,
Mar 12, 2013, 4:01:54 PM3/12/13
to django-...@googlegroups.com
Спасибо, исчерпывающе) Куда это закидывать не знаю но найду! Правда я ожидал что решение будет занимать пару строчек. Мне кажется в данном случае имеет смысл проманкипатчить стандартную команду так как она прямого отношения к проекту не имеет и изменяться вредле будет.

вторник, 12 марта 2013 г., 13:28:16 UTC+2 пользователь livskiy написал:
Вам нужно создать каcтомную команду runserver. Сделал для разминки, она выглядит как-то так:

livskiy

unread,
Mar 12, 2013, 4:22:24 PM3/12/13
to django-...@googlegroups.com
Еже ли хотите манкипатч, вот это вставьте в manage.py до секции if __name__ == "__main__":

from django.core.servers.basehttp import WSGIRequestHandler
from django.utils.http import urlunquote

old_log_message = WSGIRequestHandler.log_message


def log_message(self, format, *args):

    args = list(args)
    args[0] = urlunquote(args[0])
    return old_log_message(self, format, *args)

WSGIRequestHandler.log_message = log_message


13 марта 2013 г., 2:01 пользователь <xupypr...@gmail.com> написал:
Message has been deleted
Message has been deleted

xupypr...@gmail.com

unread,
Mar 12, 2013, 5:28:40 PM3/12/13
to django-...@googlegroups.com
Да, это самое лучше решение в этом случае! Ещё раз спасибо за развёрнутые ответы. Правда оказалось что вставлять этот код нужно как раз не до if __name__...
А после os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings")
иначе:
ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is undefined.


вторник, 12 марта 2013 г., 22:22:24 UTC+2 пользователь livskiy написал:
Reply all
Reply to author
Forward
0 new messages