【问题标题】:Save data from for loop within program?从程序中的for循环保存数据?
【发布时间】:2017-01-13 18:51:10
【问题描述】:

说,我有一个应用程序日志文件,逐行增加

Jan 13 20:44:25 Think process1: ID1: Request received user=user1
Jan 13 20:44:26 Think process1: ID2: Request received user=user2
Jan 13 20:44:27 Think process2: ID1: user accessed file=file1
Jan 13 20:44:28 Think process1: ID3: Request received user=user3
Jan 13 20:44:29 Think process3: ID1: Request Served token=tok1
Jan 13 20:44:30 Think process2: ID2: user accessed file=file2
Jan 13 20:44:31 Think process3: ID2: Request Served token=tok2
Jan 13 20:44:32 Think process2: ID3: user accessed file=file3
.....
Jan 13 20:59:24 Think process3: ID**N**: user accessed file=file**N**

而我的代码如下

from sh import tail

def received(input_message):
    user1 = input_message[2].split('=')
    user = user1[1].replace('\n', '')
    return(user)

def accessed(input_message):
    file1 = input_message[2].split('=')
    file = file1[1].replace('\n', '')
    return(file)

def served(input_message):
    tok1 = input_message[2].split('=')
    tok = tok1[1].replace('\n', '')
    return(tok)

for line in tail("-f", "/opt/jagan/app.log", _iter=True):
    column = line.split(' ')
    date = column[0] + ' ' + column[1] + ' ' + column[2]
    host = column[3]
    process = column[4]
    ID = column[5]
    message = column[6:]
    if "process1" in process:
         username = received(message)
         print("Username is:" +(username))
    if "process2" in process:
         filename = accessed(message)
         print("filename is:" +(filename))
    if "process3" in process:
         token = served(message)
         print("Token is:" +(token))

在此,ID 对于每个请求都是唯一的。它会经历所有的过程。 因此,当一个请求完成时,我想在处理请求时打印所有必需的数据。

喜欢:

>['user1','file1','tok1']
['user**N**','file**N**','tok**N**']

问题 1. 如何在程序中存储来自for 循环的数据?我不将数据存储在文件或某些数据库中。因为,日志生成量太高,会影响这个程序的性能。

QUESTION 2. 当一个请求完成时,如何用请求的所有数据触发一个动作?我想触发一个动作,当一个请求完成时,请求的所有信息。说我想用可变数据创建变量列表,也不想将数据保存在其他地方。如果程序停止,数据也会丢失(我可以接受)。

【问题讨论】:

  • 问题 1. 像变量一样? QUESTION 2. 输出问题 1 中的变量?
  • @JagannathNaidu 您是否尝试运行代码?因为它有一些错误......
  • @OferArial:process1、process2 和 process3,用引号引起来,因为它们是字符串。将reveived 的拼写更正为received。我已经更正了代码。再次检查,它会正常工作
  • @JulienB.:是的,就像在变量中一样。

标签: python python-2.7 python-3.x subprocess


【解决方案1】:
logs=[]
for line in tail...
    ...
    logs.append([filename, username, token])

【讨论】:

    【解决方案2】:

    问题 1:

    要保存所需数据,您可以使用字典或列表,无论何时调用服务(如果我理解正确,那是您的数据保存代码的最后阶段)。

    您应该指定一个global scope 变量,它将保存它:

    示例:

    data_list = []
    data_dict = {} # Use the ID as a key, and all values of data as the value
    

    问题 2:

    如果您想对收到的数据执行function(action),请在完成收集数据后调用以数据为参数的函数(同样,在调用服务时):

    示例:

    def parse_data(line):
        pass # Your parsing code
    
    # And your function call
    for line in tail("-f", "/opt/jagan/app.log", _iter=True):
    ...
    if "process3" in process:
         token = served(message)
         parse_data(line)
         print("Token is:" +(token))
    ...
    

    【讨论】:

    • 但是我传入的数据没有排序。 Jan 13 20:44:25 Think process1: ID1: Request received user=user1, Jan 13 20:44:26 Think process1: ID2: Request received user=user2。即ID1:process1,ID1,process2,ID2:process1,ID2:process2,ID:process3,ID1:process3。在这种情况下,如何提供请求一的数据。
    • 正确:但是我的传入数据没有排序。 Jan 13 20:44:25 Think process1: ID1: Request received user=user1, Jan 13 20:44:26 Think process1: ID2: Request received user=user2。即ID1:process1,ID1:process2,ID2:process1,ID2:process2,ID2:process3,ID1:process3。 在这种情况下,如何在服务请求后服务请求一(ID1)的数据两个 (ID2)。
    • @JagannathNaidu 这并不复杂。日志中的顺序一定要正确,所以当ID2的“process3”来时,会解析ID2的数据,当ID1的“process3”来时,会解析ID1的数据。它会按照你想要的方式发生
    • 条件是顺序不能正确。如果可能,请分享代码。无论如何谢谢。发现可以实现,于是继续使用外部数据库。
    猜你喜欢
    • 2021-09-22
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    • 2014-04-30
    相关资源
    最近更新 更多