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
        

Reply via email to