bshanks
bshanks

Reputation: 1248

Python logging: how to represent newlines in the format string in a logging config file?

I'm configuring my Python logging from a file (see http://www.python.org/doc//current/library/logging.html#configuration-file-format ).

From the example on that page, i have a formatter in the config file that looks like:

[formatter_form01]
format=F1 %(asctime)s %(levelname)s %(message)s
datefmt=
class=logging.Formatter

How do i put a newline in the "format" string that specifies the formatter? Neither \n nor \\n work (e.g. format=F1\n%(asctime)s %(levelname)s %(message)s does not work). Thanks

Upvotes: 12

Views: 12235

Answers (6)

Whois7pi
Whois7pi

Reputation: 181

Just add "\n" before the closing apostrophe of basicConfig function

logging.basicConfig(level=logging.DEBUG, format=' %(levelname)s - %(message)s\n')

log message with newline after the message

Upvotes: 0

Alex_Alex
Alex_Alex

Reputation: 199

import logging
logformat = "%(asctime)s %(message)s\n\r"
logging.basicConfig(level=logging.DEBUG, format=logformat,filename='debug.log', filemode='w')           
logging.debug (Your String here)

Debug text in the file will be written with new line.

Upvotes: 0

ekhumoro
ekhumoro

Reputation: 120798

The logging.config module reads config files with ConfigParser, which has support for multiline values.

So you can specify your format string like this:

[formatter_form01]
format=F1
    %(asctime)s %(levelname)s %(message)s
datefmt=
class=logging.Formatter

Multilines values are continued by indenting the following lines (one or more spaces or tabs count as an indent).

Upvotes: 9

Andrew_1510
Andrew_1510

Reputation: 13556

This might be an easy way:

import logging
logformat = """%(asctime)s ... here you get a new line
    ... %(thread)d .... here you get another new line
    %(message)s"""
logging.basicConfig(format=logformat, level=logging.DEBUG)

I tested, the above setting gives two new lines for each logging message, as it shown in the codes. Note: %(asctime)s and things like this is python logging formatting strings.

Upvotes: 0

mgibsonbr
mgibsonbr

Reputation: 22007

My best bet would be using a custom formatter (instead of logging.Formatter)... For reference, here's the source code for logging.Formatter.format:

def format(self, record):
    record.message = record.getMessage()
    if string.find(self._fmt,"%(asctime)") >= 0:
        record.asctime = self.formatTime(record, self.datefmt)
    s = self._fmt % record.__dict__
    if record.exc_info:
        # Cache the traceback text to avoid converting it multiple times
        # (it's constant anyway)
        if not record.exc_text:
            record.exc_text = self.formatException(record.exc_info)
    if record.exc_text:
        if s[-1:] != "\n":
            s = s + "\n"
        s = s + record.exc_text
    return s

It's pretty clear to me that, if self._fmt is read from a text file (single line), no escapping of any kind would be possible. Maybe you can extend from logging.Formatter, override this method and substitute the 4th line for something like:

s = self._fmt.replace('\\n', '\n') % record.__dict__

or something more general, if you want other things to be escaped as well.

EDIT: alternatively, you can do that in the init method, once (instead of every time a message is formatted). But as others already pointed out, the ConfigParser support multiple lines, so no need to go this route...

Upvotes: 0

Rob Wouters
Rob Wouters

Reputation: 16327

The logging configuration file is based on the ConfigParser module. There you'll find you can solve it like this:

[formatter_form01]
format=F1
   %(asctime)s %(levelname)s %(message)s
datefmt=
class=logging.Formatter

Upvotes: 7

Related Questions