打印用于在Python中登录的时间戳



我想打印当前时间戳,无论事件在我的python脚本中是否成功。只添加。。。

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

在每行的开头,同一日期出现在每行中

[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!

(我在中间添加了time.sleep(5)

我的下一个想法是创建一个函数,调用当前时间,但我未能将此函数嵌入到print命令中。

文件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")

myapp.py 文件

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

正在打印:

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

在第一次记录任何内容之前,请执行以下操作:

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

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')
>>> 

下面这样的东西就可以了:

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

看看Python的logging模块。您不需要麻烦创建自己的日期,只需让日志模块为您完成即可。该格式化程序对象可以应用于日志处理程序,因此您可以只使用logger.info('This is an info message.')进行日志记录。不需要打印报表。

以下是我使用的样板程序:

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

日期时间是在字符串形成时计算的。所以在你的情况下,只有一次在初始化。相反,你应该这样做:

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

要登录,只需使用ok(),它每次都会重新评估日期时间。

请注意,@paidhima的建议也很好。

最新更新