Imprimă timestamp pentru logare în Python (Programare, Python)

romanzipp a intrebat.
a intrebat.

Vreau să tipăresc timestamp-ul curent, atunci când un eveniment a reușit sau nu în scriptul meu python.Prin adăugarea doar a…

datetime.datetime.now().strftime("%d.%b %Y %H:%M:%S")

…. la începutul fiecărei linii, aceeași dată apare în fiecare linie

[INFO] 04.Feb 2015 20:49:41: cl1
[ OK ] 04.Feb 2015 20:49:41: 8.8.8.8 ONLINE!
[INFO] 04.Feb 2015 20:49:41: cl2
[ OK ] 04.Feb 2015 20:49:41: 8.8.8.8 ONLINE!
[INFO] 04.Feb 2015 20:49:41: cl3
[ OK ] 04.Feb 2015 20:49:41: 8.8.8.8 ONLINE!

(Am adăugat time.sleep(5)între ele)

Următoarea mea idee a fost să creez o funcție, care să cheme ora curentă, dar nu reușesc să integrez această funcție în printcomanda.

Fișier rs.py

OK =   "[" + bc.OKGREEN + " OK "  + bc.ENDC + "] " + datetime.datetime.now().strftime("%d.%b %Y %H:%M:%S")
INFO = "[" + bc.OKBLUE  + "INFO"  + bc.ENDC + "] " + datetime.datetime.now().strftime("%d.%b %Y %H:%M:%S")
WARN = "[" + bc.WARN    + "WARN"  + bc.ENDC + "] " + datetime.datetime.now().strftime("%d.%b %Y %H:%M:%S")
ERR =  "[" + bc.ERR     + "FAIL"  + bc.ENDC + "] " + datetime.datetime.now().strftime("%d.%b %Y %H:%M:%S")
DEB =  "[" + bc.HEADER  + "DEBUG" + bc.ENDC + "] " + datetime.datetime.now().strftime("%d.%b %Y %H:%M:%S")

Fișier myapp.py

import rs # importing rs.py

print rs.OK + hostname + "is up!"
time.sleep(3)
print rs.ERR+ hostname + "is down!"

Se tipărește:

>>> [INFO] 04.Feb 2015 20:49:41: xxx is up!
>>> [ERR ] 04.Feb 2015 20:49:41: xxx is down!

Comentarii

  • Ați lua în considerare modificarea răspunsului acceptat? Răspunsul lui Gae123 pare a fi o soluție mult mai simplă. –  > Por Stevoisiak.
3 răspunsuri
gae123

Înainte de prima dată când loghezi ceva fă așa:

logging.basicConfig(
    format='%(asctime)s %(levelname)-8s %(message)s',
    level=logging.INFO,
    datefmt='%Y-%m-%d %H:%M:%S')

Exemplu pe REPL:

>>> import logging
>>> logging.basicConfig(
...         format='%(asctime)s %(levelname)-8s %(message)s',
...         level=logging.INFO,
...         datefmt='%Y-%m-%d %H:%M:%S')
>>> 
>>> logging.info('an info messge')
2017-05-25 00:58:28 INFO     an info messge
>>> logging.debug('a debug messag is not shown')
>>> 

Comentarii

paidhima

Ceva de genul celor de mai jos ar fi de ajuns:

formatter = logging.Formatter(fmt='%(asctime)s %(levelname)-8s %(message)s',
                              datefmt='%Y-%m-%d %H:%M:%S')

Aruncați o privire la logging pentru Python. Nu trebuie să vă încurcați cu crearea propriei date, lăsați modulul de logare să o facă pentru dvs. Acel obiect formator poate fi aplicat la un gestionar de logare, astfel încât să puteți pur și simplu să vă logați cu logger.info('This is an info message.'). Nu este nevoie de instrucțiuni de imprimare.

Iată o procedură tip boilerplate pe care o folosesc eu:

import logging
import sys

def setup_custom_logger(name):
    formatter = logging.Formatter(fmt='%(asctime)s %(levelname)-8s %(message)s',
                                  datefmt='%Y-%m-%d %H:%M:%S')
    handler = logging.FileHandler('log.txt', mode='w')
    handler.setFormatter(formatter)
    screen_handler = logging.StreamHandler(stream=sys.stdout)
    screen_handler.setFormatter(formatter)
    logger = logging.getLogger(name)
    logger.setLevel(logging.DEBUG)
    logger.addHandler(handler)
    logger.addHandler(screen_handler)
    return logger

>>> logger = setup_custom_logger('myapp')
>>> logger.info('This is a message!')
2015-02-04 15:07:12 INFO     This is a message!
>>> logger.error('Here is another')
2015-02-04 15:07:30 ERROR    Here is another

Comentarii

  • fără „datefmt’, cum ar afișa formatorul data și ora? Am un proiect în care nu este menționat nici un format de dată, trebuie să citesc jurnalele și văd timestamp-ul ca o valoare de 10 cifre precum „0063730209” Cum ar trebui să o citesc ca o dată reală inteligibilă pentru oameni? Am dreptul de a edita Logger-ul. Convertorul EPOCH arată ora ca o dată din 1972, care este cu siguranță o valoare invalidă și incorectă. Aveți vreo sugestie despre cum pot citi marca de timp prezentă în fișierul meu de jurnal? –  > Por user2176576.
  • Este posibil să se utilizeze modern f-strings-ca stil specificație: logging.basicConfig(level=logging.DEBUG, style='{', datefmt='%Y-%m-%d %H:%M:%S', format='{asctime} {levelname} {filename}:{lineno}: {message}') –  > Por Hans Ginzel.
Gab

Data este calculată atunci când se formează șirul. Deci, în cazul dumneavoastră, o singură dată la inițializare. În schimb, ar trebui să faceți ceva de genul acesta:

def ok(hostname=None, status=None):
    output = (
        "[" + bc.OKGREEN + " OK "  + bc.ENDC + "] " +
        datetime.datetime.now().strftime("%d.%b %Y %H:%M:%S")
    )
    if hostname is not None:
        output += ' ' + hostname
    if status is not None:
        output += ' ' + status
    print output

Pentru a înregistra, trebuie doar să folosiți ok() care va reevalua de fiecare dată datatime-ul.

Rețineți că sugestia lui @paidhima este, de asemenea, bună.

Comentarii

  • Pot să tipăresc această funcție în afară de o ieșire de text, cum ar fi print ok() + Started! sau trebuie să editez funcția astfel încât ok("Started!") să se tipărească [ OK ] 2015-03-02 ... Started!? –  > Por romanzipp.
  • @HerrAusragend Mi-am actualizat răspunsul pentru a corespunde nevoilor tale. Să pui totul în funcția care tipărește în jurnal este o idee bună dacă vrei să păstrezi toată logica de logare într-o singură funcție. Dacă nu, funcția ar putea returna un șir de caractere în loc să tipărească și apoi poți face ce vrei cu șirul. –  > Por Gab.

Tags: