it-swarm.com.de

Konfigurationsdatei für die Python-Protokollierung

Ich habe anscheinend Probleme, als ich versuchte, die Anmeldung in meinem Python-Projekt zu implementieren.

Ich versuche einfach die folgende Konfiguration zu imitieren:

Python-Protokollierung an mehreren Zielen

Anstatt dies innerhalb von Code zu tun, möchte ich es in einer Konfigurationsdatei haben.

Unten ist meine Konfigurationsdatei:

[loggers]
keys=root

[logger_root]
handlers=screen,file

[formatters]
keys=simple,complex

[formatter_simple]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s

[formatter_complex]
format=%(asctime)s - %(name)s - %(levelname)s - %(module)s : %(lineno)d - %(message)s

[handlers]
keys=file,screen

[handler_file]
class=handlers.TimedRotatingFileHandler
interval=midnight
backupCount=5
formatter=complex
level=DEBUG
args=('logs/testSuite.log',)

[handler_screen]
class=StreamHandler
formatter=simple
level=INFO
args=(sys.stdout,)

Das Problem ist, dass meine Bildschirmausgabe folgendermaßen aussieht:
2010-12-14 11: 39: 04,066 - root - WARNUNG - 3
2010-12-14 11: 39: 04,066 - root - ERROR - 4
2010-12-14 11: 39: 04,066 - root - CRITICAL - 5 

Meine Datei wird ausgegeben, sieht jedoch genauso aus wie oben (allerdings mit den zusätzlichen Informationen). Die Debug- und Info-Ebenen werden jedoch nicht an beide ausgegeben.

Ich bin auf Python 2.7

Hier ist mein einfaches Beispiel, das Fehler zeigt:

import os
import sys
import logging
import logging.config

sys.path.append(os.path.realpath("shared/"))
sys.path.append(os.path.realpath("tests/"))

class Main(object):

  @staticmethod
  def main():
    logging.config.fileConfig("logging.conf")
    logging.debug("1")
    logging.info("2")
    logging.warn("3")
    logging.error("4")
    logging.critical("5")

if __== "__main__":
  Main.main()
29
Scott

Es sieht so aus, als hätten Sie die Stufen für Ihre Handler festgelegt, nicht jedoch Ihren Logger. Die Logger-Stufe filtert jede Nachricht, bevor sie ihre Handler erreichen kann. Der Standardwert ist WARNING und höher (wie Sie sehen können). Wenn Sie die Stufe des Root-Loggers auf NOTSET setzen und DEBUG (oder was auch immer die niedrigste Stufe ist, die Sie protokollieren möchten) einstellen, sollte das Problem behoben sein.

20
bdeniker

Das Hinzufügen der folgenden Zeile zum Root-Logger hat mein Problem gelöst: 

level=NOTSET
12
Scott
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import logging
import logging.handlers
from logging.config import dictConfig

logger = logging.getLogger(__name__)

DEFAULT_LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
}
def configure_logging(logfile_path):
    """
    Initialize logging defaults for Project.

    :param logfile_path: logfile used to the logfile
    :type logfile_path: string

    This function does:

    - Assign INFO and DEBUG level to logger file handler and console handler

    """
    dictConfig(DEFAULT_LOGGING)

    default_formatter = logging.Formatter(
        "[%(asctime)s] [%(levelname)s] [%(name)s] [%(funcName)s():%(lineno)s] [PID:%(process)d TID:%(thread)d] %(message)s",
        "%d/%m/%Y %H:%M:%S")

    file_handler = logging.handlers.RotatingFileHandler(logfile_path, maxBytes=10485760,backupCount=300, encoding='utf-8')
    file_handler.setLevel(logging.INFO)

    console_handler = logging.StreamHandler()
    console_handler.setLevel(logging.DEBUG)

    file_handler.setFormatter(default_formatter)
    console_handler.setFormatter(default_formatter)

    logging.root.setLevel(logging.DEBUG)
    logging.root.addHandler(file_handler)
    logging.root.addHandler(console_handler)



[31/10/2015 22:00:33] [DEBUG] [yourmodulename] [yourfunction_name():9] [PID:61314 TID:140735248744448] this is logger infomation from hello module

Ich denke, Sie sollten die disable_existing_loggers zu false hinzufügen.

1
wcc526

Fügen Sie einfach Protokollebene in [logger_root] hinzu. Es ist gearbeitet.

[logger_root]
level=DEBUG
handlers=screen,file
1
P113305A009D8M