2017-01-13 2 views
-1

Скажем, у меня есть файл журнала приложений, усиливающееся построчноСохранить данные из цикла for внутри программы?

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 цикла, в рамках программы? Я не храню данные в файле или какой-то БД. Поскольку генерация журналов будет слишком высокой, это повлияет на производительность этой программы.

ВОПРОС 2. Как инициировать действие со всеми данными запроса, когда запрос завершен? Я хочу вызвать действие, когда запрос будет завершен, всю информацию запроса. Я хочу создать списки переменных с переменными данными, а также не хочу сохранять данные в другом месте. И если программа остановится, данные также будут потеряны (я в порядке с этим).

+1

ВОПРОС 1. Как и в переменной? ВОПРОС 2. Выводит переменную из вопроса 1? –

+0

@JagannathNaidu Вы пытались запустить код? потому что у него есть некоторые ошибки ... –

+0

@OferArial: process1, process2 и process3, Enclose внутри кавычек, так как это строки. Исправьте орфографию от показанного до полученного. Я исправил код. Проверьте снова, он будет работать нормально –

ответ

0

Вопрос 1:

Для сохранения разыскиваемых данных, вы можете использовать словарь или список, когда служил называется (если я правильно понимаю, что это последний этап данных экономии код).

Вы должны указать global scope переменную, которая будет сохранять его:

Пример:

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

Вопрос 2:

Если вы хотите выполнить function (действие) с полученными вами данными, вызовите функцию с данными в качестве аргументов, когда вы закончите собирать свои данные (опять же, когда подано сообщение «calle» г):

Пример:

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)) 
... 
+0

Но мои входящие данные не упорядочены. * Jan 13 20:44:25 Подумайте process1: ID1: Request received user = user1 *, * Jan 13 20:44:26 Think process1: ID2: Request received user = user2 *. I.e, ** ID1: process1, ID1, process2, ID2: process1, ID2: process2, ID: process3, ID1: process3. ** В этом случае, как обслуживать данные запроса. –

+0

ПРАВИЛЬНО: Но мои входящие данные не упорядочены. * Jan 13 20:44:25 Подумайте process1: ID1: Request received user = user1 *, * Jan 13 20:44:26 Think process1: ID2: Request received user = user2 *. Я.e, ** ID1: process1, ID1: process2, ID2: process1, ID2: process2, ID2: process3, ID1: process3. ** В этом случае, как обслуживать данные запроса один (ID1) после обслуживания запроса двух (ID2). –

+0

@JagannathNaidu Это не сложно. Порядок в журналах должен быть правильным, поэтому, когда «process3» ID2 придет, данные ID2 будут проанализированы, и когда «process3» ID1 придет, данные ID1 будут проанализированы. Это произойдет так, как вы хотите –

Смежные вопросы