Traceback in Logging

Discussion in 'Python' started by Kottiyath, Jan 6, 2009.

  1. Kottiyath

    Kottiyath Guest

    Hi all,
    Is it possible to print traceback for all logging?
    I have created something like this:

    def trace():
    import traceback
    return ''.join(traceback.format_stack(limit=4)[1:])

    And during every logging, append it -
    self.logger.info('Data: %s, kwargs: %s Traceback: %s' %(data,
    kwargs, trace()))

    -->Result<--

    2009-01-06 18:52:21,483 - test- INFO
    ---> Data:, kwargs: {}
    Traceback: File "C:\test.py", line 48, in success
    super(testObj, self).success(reply, **kwargs)
    File "C:\test.py", line 87, in success
    self.logger.info('Data: %s, kwargs: %s Traceback: %s' %(data,
    kwargs, trace()))
    File "C:\test.py", line 151, in trace
    return ''.join(traceback.format_stack(limit=4)[1:])

    This seems somewhat kludgy. Is it possible in logging mechanism itself
    to provide traceback as default?

    I use Python2.4, so LoggingAdapter is not there too.
     
    Kottiyath, Jan 6, 2009
    #1
    1. Advertising

  2. Kottiyath

    Vinay Sajip Guest

    On Jan 6, 1:33 pm, Kottiyath <> wrote:
    > This seems somewhat kludgy. Is it possible in logging mechanism itself
    > to provide traceback as default?
    >


    No, because it's not a common use case to print tracebacks for every
    logging call. There's support for adding traceback information in
    exception handling, via use of the Logger.exception method in the
    exception handling code.


    > I use Python2.4, so LoggingAdapter is not there too.


    If you need LoggingAdapter, you can always copy and paste the relevant
    code from Python's SVN repository into your own application.

    Regards,

    Vinay Sajip
     
    Vinay Sajip, Jan 6, 2009
    #2
    1. Advertising

  3. Kottiyath

    Kottiyath Guest

    I dont want the whole traceback. I just wanted to know where the log
    was generated from i.e. which procedure and which line. I have 3/4
    points in many procedures where I encounter a small error (not an
    exception) and want to log it. So having individual names for each
    looks to be somewhat verbose - esp since the application is >10K LOC.

    This might be a good item to have in the logging system - along with
    time and level, just proc name and the line number.

    Thank you for the help.

    Regards
    K

    Vinay Sajip wrote:
    > On Jan 6, 1:33 pm, Kottiyath <> wrote:
    > > This seems somewhat kludgy. Is it possible in logging mechanism itself
    > > to provide traceback as default?
    > >

    >
    > No, because it's not a common use case to print tracebacks for every
    > logging call. There's support for adding traceback information in
    > exception handling, via use of the Logger.exception method in the
    > exception handling code.
    >
    >
    > > I use Python2.4, so LoggingAdapter is not there too.

    >
    > If you need LoggingAdapter, you can always copy and paste the relevant
    > code from Python's SVN repository into your own application.
    >
    > Regards,
    >
    > Vinay Sajip
     
    Kottiyath, Jan 6, 2009
    #3
  4. Kottiyath

    Guest

    Kottiyath> I dont want the whole traceback. I just wanted to know where
    Kottiyath> the log was generated from i.e. which procedure and which
    Kottiyath> line.

    The asyncore standard module has an undocumented compact_traceback()
    function:

    #!/usr/bin/env python

    import asyncore

    def f():
    1/0

    def g():
    f()

    def h():
    g()

    try:
    h()
    except ZeroDivisionError:
    print asyncore.compact_traceback()[3]

    Output looks like this:

    % python f.py
    [f.py|<module>|15] [f.py|h|12] [f.py|g|9] [f.py|f|6]

    Might be of interest.

    --
    Skip Montanaro - - http://smontanaro.dyndns.org/
     
    , Jan 6, 2009
    #4
  5. Kottiyath

    Vinay Sajip Guest

    On Jan 6, 4:17 pm, Kottiyath <> wrote:
    > I dont want the whole traceback. I just wanted to know where the log
    > was generated from i.e. which procedure and which line. I have 3/4
    > points in many procedures where I encounter a small error (not an
    > exception) and want to log it. So having individual names for each
    > looks to be somewhat verbose - esp since the application is >10K LOC.
    >


    Don't the funcName and lineno arguments in the format string work for
    you?

    (See http://docs.python.org/library/logging.html#id1)

    Regards,

    Vinay Sajip
     
    Vinay Sajip, Jan 6, 2009
    #5
  6. * Vinay Sajip (Tue, 6 Jan 2009 11:24:54 -0800 (PST))
    > On Jan 6, 4:17 pm, Kottiyath <> wrote:
    > > I dont want the whole traceback. I just wanted to know where the log
    > > was generated from i.e. which procedure and which line. I have 3/4
    > > points in many procedures where I encounter a small error (not an
    > > exception) and want to log it. So having individual names for each
    > > looks to be somewhat verbose - esp since the application is >10K LOC.
    > >

    >
    > Don't the funcName and lineno arguments in the format string work for
    > you?
    >
    > (See http://docs.python.org/library/logging.html#id1)


    I don't think he's interested in the "line number where the logging call
    was issued" but where the exception occurred.

    Thorsten
     
    Thorsten Kampe, Jan 6, 2009
    #6
  7. Kottiyath

    Vinay Sajip Guest

    On Jan 6, 10:19 pm, Thorsten Kampe <> wrote:
    > I don't think he's interested in the "line number where the logging call
    > was issued" but where the exception occurred.


    Well, he does say "all logging" and "every logging". And, as I
    mentioned earlier, there is already support for tracebacks by using
    the Logger.exception method in an exception handler.

    Regards,

    Vinay Sajip
     
    Vinay Sajip, Jan 7, 2009
    #7
  8. Kottiyath

    Kottiyath Guest

    The issue is that I am on Python 2.4 which doesnt support func name.
    I am using filename and lineno now. That does serve the purpose.
    Thank you, I had not checked all the parameters.

    Regards
    K

    Vinay Sajip wrote:
    > On Jan 6, 4:17 pm, Kottiyath <> wrote:
    > > I dont want the whole traceback. I just wanted to know where the log
    > > was generated from i.e. which procedure and which line. I have 3/4
    > > points in many procedures where I encounter a small error (not an
    > > exception) and want to log it. So having individual names for each
    > > looks to be somewhat verbose - esp since the application is >10K LOC.
    > >

    >
    > Don't the funcName and lineno arguments in the format string work for
    > you?
    >
    > (See http://docs.python.org/library/logging.html#id1)
    >
    > Regards,
    >
    > Vinay Sajip
     
    Kottiyath, Jan 8, 2009
    #8
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Stefan Siegl
    Replies:
    0
    Views:
    975
    Stefan Siegl
    Aug 27, 2003
  2. janne
    Replies:
    0
    Views:
    9,573
    janne
    Sep 10, 2004
  3. Christoph Haas
    Replies:
    0
    Views:
    471
    Christoph Haas
    Jun 12, 2006
  4. Joan Miller
    Replies:
    2
    Views:
    484
    Joan Miller
    Feb 9, 2010
  5. Jack Bates
    Replies:
    0
    Views:
    288
    Jack Bates
    May 2, 2011
Loading...

Share This Page