Here's the code. You can see it's short and simple; half the code is just to make it more configurable. Usage:
pyramid_includes = accesslog # Settings, all optional access.format = {response.status_int} {request.method} {request.path_qs} access.ignore = /fanstatic /_debug_toolbar access.ignore_usual = true On Thu, Mar 10, 2016 at 6:46 PM, Mike Orr <sluggos...@gmail.com> wrote: > On Thu, Mar 10, 2016 at 3:32 AM, Zsolt Ero <zsolt....@gmail.com> wrote: >> Hi, >> >> My first mailing list post, as this really puzzles me. I'd like to use a >> short format for displaying HTTP requests in development mode. >> >> Before, I used to have this snippet in my Pyramid app's __init__.py: >> >> from paste.translogger import TransLogger >> format = '%(status)s %(REQUEST_METHOD)s %(REQUEST_URI)s' >> app = TransLogger(app, format=format) >> return app >> >> >> I'd like to turn this into using an .ini file, however, I cannot specify the >> format, as the .ini file syntax needs some kind of escaping, which I cannot >> figure out. >> >> Here is a try on setting translogger format via .ini file: >> >> [filter:translogger] >> use = egg:Paste#translogger >> setup_console_handler = False >> format = %%(status)s %%(REQUEST_METHOD)s %%(REQUEST_URI)s >> >> >> >> It results in an error: >> >> ConfigParser.InterpolationMissingOptionError: Error in file >> .../development.ini: Bad value substitution: >> section: [filter:translogger] >> option : format >> key : status >> rawval : %%(status)s >> >> >> What is the right escaping method to set translogger's format via .ini file? >> >> Or if it's not possible to escape it, then I don't get it. Why does >> translogger has a format option, if you cannot actually enter anything there >> via ini? >> >> Alembic, for example supports escaping perfectly fine, for example: >> >> file_template = >> %%(year)d_%%(month).2d_%%(day).2d_%%(hour).2d_%%(minute).2d_%%(second).2d_%%(rev)s >> >> >> Here is this 4 year old issue in PasteDeploy, I think it's related: >> >> https://bitbucket.org/ianb/pastedeploy/issues/11/there-is-no-way-to-escape-character-in-the >> >> Any ideas how to solve this? > > I didn't like using middleware so I made a Pyramid tween that logs > requests. I don't have the code with me but I can get it tomorrow. > After calling the applicaiton I make a log message based on the > response and request. I probably bypassed the % parsing problem by > using str.format instead, so that I could override the format. My > logger is called 'access'. > > > -- > Mike Orr <sluggos...@gmail.com> -- Mike Orr <sluggos...@gmail.com> -- You received this message because you are subscribed to the Google Groups "pylons-devel" group. To unsubscribe from this group and stop receiving emails from it, send an email to pylons-devel+unsubscr...@googlegroups.com. To post to this group, send email to pylons-devel@googlegroups.com. Visit this group at https://groups.google.com/group/pylons-devel. For more options, visit https://groups.google.com/d/optout.
import logging from pyramid.settings import asbool, aslist FORMAT = "{response.status_int} {request.method} {request.path_qs}" IGNORE_USUAL = [ "/_debug_toolbar", "/favicon.ico", "/robots.txt", "/static", "/w3c", ] def includeme(config): settings = config.registry.settings if asbool(settings.get("access.enabled", True)): config.add_tween("accesslog.accesslog_tween_factory") def accesslog_tween_factory(handler, registry): settings = registry.settings log = logging.getLogger("access") fmt = settings.get("access.format", FORMAT) ignore = aslist(settings.get("access.ignore", [])) if asbool(settings.get("access.ignore_usual", True)): ignore.extend(IGNORE_USUAL) log.debug("Enabling access log ({}).".format(__name__)) if ignore: log.debug("Ignoring prefixes: {}".format(ignore)) def accesslog_tween(request): response = handler(request) # Raises exceptions. for prefix in ignore: if request.path.startswith(prefix): break else: msg = fmt.format(request=request, response=response) log.info(msg) return response return accesslog_tween