Python日期时间1970-01-01 07:00:07

时间:2019-09-09 02:31:23

标签: python datetime

我有这样的代码段:

import re 
from datetime import datetime as dt 
from pprint import pprint as pp

__lin_regex = "(.*)msg='(.*)'"

events = [
    "type=USER_AUTH msg=audit(1565448223.294:46713): pid=4499 uid=0 auid=4294967295 ses=4294967295 msg='op=PAM:authentication op-test acct=\"root\" exe=\"/usr/sbin/sshd\" hostname=49.88.112.75 addr=49.88.112.75 terminal=ssh res=failed'"
]

logs = {}

for event in events:
    vm_info = ['name', 'id']

    results = ''.join(list(re.match(__lin_regex, event).groups()))

    split_results = results.split(' ')

    split_results_length = len(split_results)
    for i in range(0, split_results_length-1):
        if split_results[i].find('=') == -1:
            split_results[i - 1] = split_results[i - 1] + ' ' +  split_results[i]
            split_results.remove(split_results[i])

    pid = split_results.pop(2).split('=')[1]

    if pid not in logs:
        logs[pid] = vm_info + [pid] + [item.split('=')[1] for item in split_results]
    logs[pid][4] = dt.fromtimestamp(int(float(re.findall("([0-9.]+):", logs[pid][4])[0]))).strftime("%Y-%m-%d %H:%M:%S")

pp(logs)

但是当我有大量事件时,它们的输出是1970-01-01 07:00:07,当我尝试打印1000个数据时仍然有效,但是当我打印所有事件时,它们都无效?

1 个答案:

答案 0 :(得分:1)

请看一下您的代码,为了方便起见,替换/添加了以下几行,这些行使我可以在10,000个事件中使用相同的时间戳记,但使用不同的pid's

events = [
    "type=USER_AUTH msg=audit(1565448223.294:46713): pid=4499 uid=0 auid=4294967295 ses=4294967295 msg='op=PAM:authentication op-test acct=\"root\" exe=\"/usr/sbin/sshd\" hostname=49.88.112.75 addr=49.88.112.75 terminal=ssh res=failed'"
] * 10000

for i, event in enumerate(events):
    events[i] = event.replace("pid=4499", "pid="+str(4499+i))

所有10,000个事件的日期字符串输出都是正确的,因此我认为问题可能与(a)您的正则表达式或(b)您的输入数据有关。

如果是我,我调试它的方法是只使用pdb,然后查找您看到的示例输出,例如:

import pdb

... rest of your code ...

    logs[pid][4] = dt.fromtimestamp(int(float(re.findall("([0-9.]+):", logs[pid][4])[0]))).strftime("%Y-%m-%d %H:%M:%S")
    if logs[pid][4] == "1970-01-01 07:00:07":
        pdb.set_trace()

那时候,在交互式调试器中,您可以查看所涉及的变量并查看导致问题的输入event字符串 是什么(可能是,数据格式不如您期望的那样。如果不是很明显,您可以通过使用n逐步检查代码并检查变量分配来判断发生了什么。

如果由于调试器命令而导致名称冲突时遇到麻烦,则可以在调试器中使用!import code; code.interact(local=vars())将局部变量带入普通的python shell中。