2017-08-28 2 views
-2

Ich versuche, eine grundlegende Logger zu schaffen, die ohne externe Pakete gefärbt werden,Wie die aktuelle Protokollebene in Python Logging-Modul bekommen

# these have to be the first functions so I can use it in the logger settings 
def create_log_name(log_path="{}/log", filename="zeus-log-{}.log"): 
    if not os.path.exists(log_path.format(os.getcwd())): 
     os.mkdir(log_path.format(os.getcwd())) 
    find_file_amount = len(os.listdir(log_path.format(os.getcwd()))) 
    full_log_path = "{}/{}".format(log_path.format(os.getcwd()), filename.format(find_file_amount + 1)) 
    return full_log_path 


def set_color_value(levelname): 
    log_set = { 
     "INFO": "\033[92m{}\033[0m", 
     "WARNING": "\033[93m{}\033[0m", 
     "DEBUG": "\033[94m{}\033[0m", 
     "ERROR": "\033[91m{}\033[0m", 
     "CRITICAL": "\033[91m{}\033[0m" 
    } 
    return log_set[levelname].format(levelname) 

logger = logging.getLogger("zeus-log") 
logger.setLevel(logging.DEBUG) 
file_handler = logging.FileHandler(
    filename=create_log_name(), mode="a+" 
) 
file_handler.setLevel(logging.DEBUG) 
console_handler = logging.StreamHandler() 
console_handler.setLevel(logging.DEBUG) 
file_format = logging.Formatter(
    '%(asctime)s;%(name)s;%(levelname)s;%(message)s' 
) 
console_format = logging.Formatter(
    "[%(asctime)s {}] %(message)s".format(set_color_value()), "%H:%M:%S" 
) 
file_handler.setFormatter(file_format) 
console_handler.setFormatter(console_format) 
logger.addHandler(console_handler) 
logger.addHandler(file_handler) 

So wie der gerade jetzt, alles, was ich tun muß, ist, die aktuelle Protokollebene erhalten, die in den logging.Formatter gesetzt werden und es zu meiner kleinen Funktion senden:

console_format = logging.Formatter(
    "[%(asctime)s {}] %(message)s".format(set_color_value()), "%H:%M:%S" 
) 

Ist es möglich, die aktuelle Protokollebene aus dem Logging-Paket zu bekommen?


Zum Beispiel kann sagen, dass ich logger.INFO("test") passieren brauche ich einen Weg, um diesen INFO Teil zu bekommen als String von dort set_color_value("INFO") zurückkehren soll:

enter image description here

Antwort

2

Ich entschied mich, dies auf eine andere Weise zu tun und Farbe durch die Strin hinzuzufügen g selbst mit einer Level-Nummer:

def set_color(org_string, level=None): 
    color_levels = { 
     10: "\033[36m{}\033[0m",  # DEBUG 
     20: "\033[32m{}\033[0m",  # INFO 
     30: "\033[33m{}\033[0m",  # WARNING 
     40: "\033[31m{}\033[0m",  # ERROR 
     50: "\033[7;31;31m{}\033[0m" # FATAL/CRITICAL/EXCEPTION 
    } 
    if level is None: 
     return color_levels[20].format(org_string) 
    else: 
     return color_levels[int(level)].format(org_string) 

So zum Beispiel:

logger.info(set_color("test")) 
logger.debug(set_color("test", level=10)) 
logger.warning(set_color("test", level=30)) 
logger.error(set_color("test", level=40)) 
logger.fatal(set_color("test", level=50)) 

Will Ausgang:

enter image description here

2

Ja, können Sie überprüfen, der Logger-Level von

level = logger.level 
+0

Ist das nicht das Niveau zeigen, dass der aktuelle Logger gesetzt zu? Ich brauche einen Weg, um die Logging-Informationen von jedem String aus dem Logger zu bekommen, zum Beispiel sagen wir, dass ich 'logger.FATAL ("test") übergeben 'Ich brauche das' FATAL' Teil als String übergeben – wahwahwah

+1

Diese Antwort beantwortet Was die Frage gestellt hat. Ihre Frage muss verbessert werden, seit ich hier angekommen bin, um nach dieser Antwort zu suchen. –

+0

** Einverstanden. ** Der Inhalt Ihrer Frage steht im Widerspruch zum Titel Ihrer Frage, @wahwahwah. Letzteres dürfte für StackOverflowers (einschließlich mir) interessanter sein. Es ist * seltsamerweise nicht orthogonal, dass die 'logging'-API' setLevel() 'und' getEffectiveLevel() '-Methoden aber * no *' getLevel() '-Methode definiert, wenn sie einfach ein triviales' getLevel (self): return self.level' Methode. '' –

Verwandte Themen