Manipulação de Logs [RESOLVIDO]

1. Manipulação de Logs [RESOLVIDO]

André
arsaraiva

(usa Ubuntu)

Enviado em 06/05/2017 - 15:27h

Olá Amigos,
estou tentando tratar um arquivo de log bem grande (172mb) que tem aproximadamente 25000000 linhas.
Dentre estas linhas, diversas vezes aparecem a linha:
DEBUG (0): SORVEDOURO: [trans=6] [origem=24] [slot 0] [cont-0] [time=5005].
Onde o início não muda nunca (DEBUG (0): SORVEDOURO:).
Além desta linha, uma outra linha, dentre muitas me interessa:
DEBUG (4): ENVIAR_PKT_DADOS: destino 27 slot 3 [cont 0] no tempo=4095.
O que eu preciso fazer: Ler o arquivo de log, fazendo um split de cada linha e procurando pela linha que case exatamente com DEBUG (0): SORVEDOURO:.
Assim que encontrar, preciso armazenar 3 variáveis: origem, tempo_final e controle.
Por exemplo:
DEBUG (0): SORVEDOURO: [trans=6] [origem=24] [slot 0] [cont-0] [time=5005].
origem=24, controle=0 e tempo_final=5005

A partir daí, preciso fazer uma nova procura em todo o log pela linha que case com a origem: DEBUG (origem): ENVIAR_PKT_DADOS: destino 27 slot 3 [cont 0] no tempo=4095. (a origem é 24, vindo da primeira pesquisa). Assim que encontrar, preciso armazenar 2 variáveis:tempo_inicial e controle_no.
Por exemplo:
DEBUG (24): ENVIAR_PKT_DADOS: destino 27 slot 3 [cont 0] no tempo=4095.
tempo_inicial=4095 e controle_no=0

Após isso, preciso verificar se os dois controles são iguais
if (controle==contrloe_no): 
Caso afirmativo, uma variável tempo = tempo_final - tempo_inicial.

O ideal seria gravar esses valores em um arquivo txt, porém como não sei fazer, iria imprimir na tela mesmo e o famoso ctrl+c / ctrl+v para ajudar.
Até agora consegui fazer está parte, como muitos erros:

LOG_FILE = bd-0105.log

f = open(LOG_FILE, "r")

lines = f.readlines()
for line in lines:
s = line.split()
if (len(s) > 0):
if s[0:22] == "DEBUG (0): SORVEDOURO": #DEBUG (0): SORVEDOURO: [trans=6] [origem=24] [slot 0] [cont-0] [time=5005]. (LINHA DO LOG_FILE)
origem= int(s[42:43]) #queria pegar o valor 24 da origem=24
controle= int(s[60]) # queria pegar o valor 0 de cont-0
tempo_final= int(s[69:72]) #queria pegar o valor 5005 do time=5005
for linha in linhas:
z = linha.split()
if (len(z) > 0):
if z[0:28] == "DEBUG (origem): ENVIAR_PKT_DADOS:": #DEBUG (24): ENVIAR_PKT_DADOS: destino 27 slot 3 [cont 0] no tempo=4095. (LINHA DO LOG_FILE)
tempo_inicial= s[66:69] #queria pegar o valor 4095 do tempo=5016
controle_no= int(s[54]) # queria pegar o valor 0 de [cont 0]

if (controle == controle_no): #aqui verifico se as duas variáveis de controle são iguais
tempo=tempo_final-tempo_inicial #aqui faço a diferença de tempo

print(tempo)
#aqui entraria a segunda parte, onde gravaria em um arquivo txt o valor de cada tempo
#tempo1
#tempo2
#....


Um detalhe final é que minha origem pode ser desde 1 até 31, como o tempo é variável de 5000 em 5000, o que torna mais difícil para mim, a pesquisa. Pensei até em tentar algo como find("origem=") e retirar os caracteres após isso, mais não tenho ideia se isso funciona.


  


2. MELHOR RESPOSTA

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 14/05/2017 - 23:15h

arsaraiva escreveu:

Boa tarde Marcelo,


Consegui fazer rodar aqui, porém, ainda gera na raiz os arquivos arq_sorv, arq_pkt_dados e latencia, todos apenas com um número 1 (na pasta output ficou tudo certo).


Agora, encontrei uma falha na subtração.

Gerei um log aqui:

ARQ_SORV (primeira linha)
147620256368 0 11 11 1 2 15020 (corretíssimo)


ARQ_Pkt_Dados (linha 83 que faz casa com a linha do sorvedouro, já que o nó é o 11 e controle 2)
147517815531 11 0 1 2 15048

Latência (primeira linha)
11 2 147620256368


Repare que o tempo é o mesmo do sorvedouro, onde na verdade deveria ser 102440837 (147620256368 - 147517815531).


Acho que está linha é a responsável pela subtração

echo "$orig $cont $((inic-fina))" >> output/$ARQ_SAI 

Mais nem achei onde inic e fina são carregadas. kkk
Se puder me dar uma luz, o restante está maravilhoso.
Abraços


André, boa noite . . . .
Encontrei o erro . . . .
Já esta resolvido....
Segue:
#!/bin/bash
CVM='\x1B[0;38;5;196m'
FC='\x1B[m'

PEGA_ARQ() {
ARQ_LOG=$1
TSTAMP=$(basename "$ARQ_LOG"|cut -d"." -f1)
ARQ_SOR="ARQ_SORVE_${TSTAMP}";>$ARQ_SOR
ARQ_PKT="ARQ_PKT_DADOS_${TSTAMP}";>$ARQ_PKT
ARQ_SAI="LATENCIA_${TSTAMP}";>$ARQ_SAI
PROCESSA
}

PROCESSA() {
grep -E -B1 'SORVEDOURO:' $ARQ_LOG |sed '/--/d'|sed 'N;s/\n/ /'|sed -r 's/[[:alpha:]]|[[:punct:]]//g;s/[ ]+/ /g;s/^ //' >> $ARQ_SOR
grep -E -B2 'ENVIAR_PKT_DADOS:' $ARQ_LOG|sed '/SLOT_ATIVO:\|--/d'|sed 'N;s/\n/ /'|sed -r 's/[[:alpha:]]|[[:punct:]]//g;s/[ ]+/ /g;s/^ //' >> $ARQ_PKT
while IFS=" " read -r inic debug trans orig slot cont time;do
DADOS_PKT=$(awk '{if($2=="'$orig'" && $5=="'$cont'") print $0}' $ARQ_PKT)
if ((${#DADOS_PKT} > 0));then
fina=$(cut -d" " -f1 <<< "$DADOS_PKT")
echo "$orig $cont $((inic-fina))" >> $ARQ_SAI
else
echo "$orig $cont 0 (não foi encontrado)" >> $ARQ_SAI
fi
done<$ARQ_SOR
}

PEGA_ARQ $1

Marquei em negrito, onde são atribuidas as VAR's "inic" e "fina".
gera na raiz os arquivos arq_sorv, arq_pkt_dados e latencia, todos apenas com um número 1 (na pasta output ficou tudo certo).
Poste o script q vc está usando . . . . Para que eu analise ....

mso


3. Re: Manipulação de Logs

André
arsaraiva

(usa Ubuntu)

Enviado em 07/05/2017 - 18:01h

Boa tarde amigos,

evoluiu bastante meu código:
f = open("bd.log", "r")
origem=6

for line in f:
s = line.split()
ini= (s[0]+s[1])
if (len(s) > 0):
if (ini == "DEBUG(0):") and (s[2] == "SORVEDOURO:"):
origem_raiz=s[3]
print (origem_raiz)
controle=s[6]
print(controle)
tempo_final=s[7]
print (tempo_final)
no="DEBUG("+str(origem)+"):"
print (no)
elif (ini == no) and (s[2] == "ENVIAR_PKT_DADOS:"):
print (s[2])
#controle_no=s[8]
#print (controle_no)
#tempo_inicial=s[10]
#print (tempo_inicial)


A primeira parte, até o elif está 100%. Porém, quando chega no elif, diz que "NameError: name 'no' is not defined". Até entendi que se a condição do primeiro if não for satisfeita, vai pular para o elif e a variável no não será inicializada.
Bem, minha pergunta é como fazer essa verificação dentro do if, pois se coloco apenas o if (ini == no) and (s[2] == "ENVIAR_PKT_DADOS:"): dentro do primeiro if, ini nunca será igual a no (ini já vem carregado com DEBUG(0): e no deverá se carregado com DEBUG(valor da variável origem do primeiro if):)

Alguém se habilita em me ajudar.
Mais uma vez agradeço.


4. Re: Manipulação de Logs [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 07/05/2017 - 20:16h

arsaraiva escreveu:

Boa tarde amigos,

evoluiu bastante meu código:
f = open("bd.log", "r")
origem=6

for line in f:
s = line.split()
ini= (s[0]+s[1])
if (len(s) > 0):
if (ini == "DEBUG(0):") and (s[2] == "SORVEDOURO:"):
origem_raiz=s[3]
print (origem_raiz)
controle=s[6]
print(controle)
tempo_final=s[7]
print (tempo_final)
no="DEBUG("+str(origem)+"):"
print (no)
elif (ini == no) and (s[2] == "ENVIAR_PKT_DADOS:"):
print (s[2])
#controle_no=s[8]
#print (controle_no)
#tempo_inicial=s[10]
#print (tempo_inicial)


A primeira parte, até o elif está 100%. Porém, quando chega no elif, diz que "NameError: name 'no' is not defined". Até entendi que se a condição do primeiro if não for satisfeita, vai pular para o elif e a variável no não será inicializada.
Bem, minha pergunta é como fazer essa verificação dentro do if, pois se coloco apenas o if (ini == no) and (s[2] == "ENVIAR_PKT_DADOS:"): dentro do primeiro if, ini nunca será igual a no (ini já vem carregado com DEBUG(0): e no deverá se carregado com DEBUG(valor da variável origem do primeiro if):)

Alguém se habilita em me ajudar.
Mais uma vez agradeço.


Boa noite arsaraiva.
Infelizmente não conheço PYTHON, mas vamos tentar ajudar . . .
Qto a var "no", não definida, a lógica é o que vc relatou....
Se o "elif" satisfizer a condição . . . não tem "no".
Não é possivel declarar as variáveis antes do condicional?
No shellScript , por exemplo, eu faria:
while IFS=" " read -r C1 C2 C3 C4 . . . ;do
Ai comparara o campo especifico, tipo:
if [ C1 == "DEBUG(0)" ];then . . .
Outro detalhe que estava testando aqui:
Limpar a linha, exemplo:
echo "DEBUG (0): SORVEDOURO: [trans=6] [origem=24] [slot 0] [cont-0] [time=5005]"|sed -r 's/\[|\]|:|\)//g;s/-/=/;s/ \(/=/;s/slot /slot=/'
DEBUG=0 SORVEDOURO trans=6 origem=24 slot=0 cont=0 time=5005
Limparia no while . . . Obvio que, com as devidas alterações . . .

marcelo oliver






5. Manipulação de Logs

André
arsaraiva

(usa Ubuntu)

Enviado em 07/05/2017 - 22:24h

Olá Marcelo,

Eu não conheço nada de shellscript ou outra linguagem. Comecei a pouco tempo com python e é a única linguagem que já vi.
poderia me explicar melhor sua ideia.
Grato


6. Re: Manipulação de Logs

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 08/05/2017 - 10:34h

arsaraiva escreveu:

Olá Marcelo,

Eu não conheço nada de shellscript ou outra linguagem. Comecei a pouco tempo com python e é a única linguagem que já vi.
poderia me explicar melhor sua ideia.
Grato


Bom dia.
Vamos lá.

#"PADRONIZAR/Limpar o Log",
sed -r 's/\[|\]|:|\)//g;s/-/=/;s/ \(/=/;s/slot /slot=/' arquivo.log >> arquivo_temp.log
#Pegar linha a linha e gerar uma var do tipo array com cada campo
#Exemplo, na linha "DEBUG=0 SORVEDOURO trans=6 origem=24 slot=0 cont=0 time=5005"
#Temos 07 variáveis, ${fld[0]} a ${fld[6]}
while IFS=" " read -a fld;do
#Neste ponto, fazer os condicionais,
if [[ ${fld[0]} = "DEBUG=0" && ${fld[0]} = "SORVEDOURO" ]];then
eval ${fld[3]} #define a var origem
eval ${fld[5]} #define a var cont
eval ${fld[6]} #define a var time
#BUSCA POR origem "nn" em arquivo_temp.log
LINHA=$(grep -E "^DEBUG=${origem}" arquivo_temp.log)
#GERAR VARS REQUERIDAS..... A PARTIR DA VAR "LINHA", GERADA ACIMA
.
.
.
fi
done<arquivo_temp.log

A lógica é essa . . . .
Para facilitar, poste umas linhas do log....

Att.:
marcelo oliver


7. Manipulação de Logs

André
arsaraiva

(usa Ubuntu)

Enviado em 08/05/2017 - 16:03h

Olá Marcelo, repare em algumas linha do log (manipulei essas linhas para produzir um exemplo)

WALLTIME 0
DEBUG (13): BOOT_NO: No 13 boot no slot 0
DEBUG (13): No 13 no hops 255
WALLTIME 17323464
DEBUG (8): BOOT_NO: No 19 boot no slot 0
DEBUG (8): No 19 no hops 255
WALLTIME 40406986
DEBUG (9): BOOT_NO: No 9 boot no slot 0
DEBUG (9): No 9 no hops 255
WALLTIME 192827266753
DEBUG (8): SLOT_ATIVO: No 8 no slot [3] com tempo=19668.
DEBUG (8): ENVIAR_PKT_DADOS: destino 6 slot 1 [cont 3] no tempo=19668.
WALLTIME 196230790386
DEBUG (28): SLOT_ATIVO: No 28 no slot [0] com tempo=20042.
DEBUG (28): ENVIAR_PKT_DADOS: destino 0 slot 0 [cont 3] no tempo=20042.
WALLTIME 196230790486
DEBUG (20): TIME_TO_SEND [0]: tempo para enviar o pkt=20009.
WALLTIME 196231466075
DEBUG (20): SLOT_ATIVO: No 20 no slot [0] com tempo=20009.
DEBUG (20): SEND_BEACON: [numseq 149], slot 0 no tempo=20009.
WALLTIME 196231466175
DEBUG (0): SLOT_INATIVO: No 0 no slot [34] com tempo=20009.
WALLTIME 196266144222
DEBUG (6): SLOT_ATIVO: No 6 no slot [0] com tempo=20064.
DEBUG (6): ENVIAR_PKT_DADOS: destino 0 slot 0 [cont 3] no tempo=20064.
WALLTIME 196334795776
DEBUG (28): TIME_TO_SEND [1]: tempo para enviar o pkt=20053.
WALLTIME 196338212261
DEBUG (28): SLOT_ATIVO: No 28 no slot [1] com tempo=20053.
DEBUG (28): SEND_BEACON: [numseq 156], slot 1 no tempo=20053.
WALLTIME 196338212361
DEBUG (20): TIME_TO_SEND [1]: tempo para enviar o pkt=20020.
WALLTIME 196338887950
DEBUG (20): SLOT_ATIVO: No 20 no slot [1] com tempo=20020.
DEBUG (20): ENVIAR_PKT_DADOS: destino 0 slot 1 [cont 3] no tempo=20020.
WALLTIME 196338888050
DEBUG (0): TIME_TO_SEND [0]: tempo para enviar o pkt=20020.
WALLTIME 196348116024
DEBUG (0): SLOT_ATIVO: No 0 no slot [0] com tempo=20020.
DEBUG (0): SEND_BEACON: [numseq 151], slot 0 no tempo=20020.
WALLTIME 196365167299
DEBUG (0): SORVEDOURO: [trans 6] [origem 8] [slot 0] [cont 3] [time 20022].

Olhando no log, é possível perceber que o pacote com controle 3 [cont 3] foi originário do nó 8 (DEBUG (0): SORVEDOURO: [trans 6] [origem 8] [slot 0] [cont 3] [time 20022]), passou pelo nó 6 ([trans 6]) até chegar no destino (sorvedouro).
Bem, o sorvedouro sempre será o destino final. Pensei em fazer um varredura no arquivo para localizar o DEBUG (0): SORVEDOURO (tem que ser sorvedouro, já que o DEBUG(0) faz outras coisas também) que não muda nunca e a partir dele, carregar 3 variáveis, origem que servirá para a próxima consulta, controle que serve para ver se o pacote é o mesmo da origem para o destino (pode acontecer do DEBUG (0) me retornar uma origem 8 mais o controle for 2, isso quer dizer que o pacote com controle 1 foi perdido) e tempo que servirá para calcular o tempo que demorou para este pacote chegar.
Uma vez carregadas as variáveis, varreria novamente o arquivo a procura do DEBUG (valor de origem que foi carregado, ex.: DEBUG (8): ENVIAR_PKT_DADOS:)(se for possível, varrer do DEBUG (0) para trás já que antes de receber, o pacote tem que ser enviado e também tem que ser ENVIAR_PKT_DADOS). Localizado a primeira ocorrência do DEBUG (8): ENVIAR..., iria carregar um variável controle2, faria a verificação se controle == controle2, se positivo, carrega o tempo2 e faz a operação tempo - tempo2 para retornar o tempo que este pacote demorou. Caso a verificação dos controles retorne falso (controle != controle2), continua a verificação até próxima ocorrência do DEBUG (8): ENVIAR...ou até chegar ao fim, que neste caso retorna "perdido".
Importante reparar que não me interesso pelos nó intermediários (DEBUG (6).
Outro detalhe é que são uns 2000 DEBUG (0): SORVEDOURO, então tenho que fazer essa verificação repetir n vezes (até o fim do arquivo)

Espero que tenha conseguido explicar. Obrigadão pela ajuda. Acredito que por script irá ficar mais rápida a consulta, pois o log tem aproximadamente 25000000 linhas.


8. Re: Manipulação de Logs [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 08/05/2017 - 17:00h

arsaraiva escreveu:

Olá Marcelo, repare em algumas linha do log (manipulei essas linhas para produzir um exemplo)

WALLTIME 0
DEBUG (13): BOOT_NO: No 13 boot no slot 0
DEBUG (13): No 13 no hops 255
WALLTIME 17323464
DEBUG (8): BOOT_NO: No 19 boot no slot 0
DEBUG (8): No 19 no hops 255
WALLTIME 40406986
DEBUG (9): BOOT_NO: No 9 boot no slot 0
DEBUG (9): No 9 no hops 255
WALLTIME 192827266753
DEBUG (8): SLOT_ATIVO: No 8 no slot [3] com tempo=19668.
DEBUG (8): ENVIAR_PKT_DADOS: destino 6 slot 1 [cont 3] no tempo=19668.
WALLTIME 196230790386
DEBUG (28): SLOT_ATIVO: No 28 no slot [0] com tempo=20042.
DEBUG (28): ENVIAR_PKT_DADOS: destino 0 slot 0 [cont 3] no tempo=20042.
WALLTIME 196230790486
DEBUG (20): TIME_TO_SEND [0]: tempo para enviar o pkt=20009.
WALLTIME 196231466075
DEBUG (20): SLOT_ATIVO: No 20 no slot [0] com tempo=20009.
DEBUG (20): SEND_BEACON: [numseq 149], slot 0 no tempo=20009.
WALLTIME 196231466175
DEBUG (0): SLOT_INATIVO: No 0 no slot [34] com tempo=20009.
WALLTIME 196266144222
DEBUG (6): SLOT_ATIVO: No 6 no slot [0] com tempo=20064.
DEBUG (6): ENVIAR_PKT_DADOS: destino 0 slot 0 [cont 3] no tempo=20064.
WALLTIME 196334795776
DEBUG (28): TIME_TO_SEND [1]: tempo para enviar o pkt=20053.
WALLTIME 196338212261
DEBUG (28): SLOT_ATIVO: No 28 no slot [1] com tempo=20053.
DEBUG (28): SEND_BEACON: [numseq 156], slot 1 no tempo=20053.
WALLTIME 196338212361
DEBUG (20): TIME_TO_SEND [1]: tempo para enviar o pkt=20020.
WALLTIME 196338887950
DEBUG (20): SLOT_ATIVO: No 20 no slot [1] com tempo=20020.
DEBUG (20): ENVIAR_PKT_DADOS: destino 0 slot 1 [cont 3] no tempo=20020.
WALLTIME 196338888050
DEBUG (0): TIME_TO_SEND [0]: tempo para enviar o pkt=20020.
WALLTIME 196348116024
DEBUG (0): SLOT_ATIVO: No 0 no slot [0] com tempo=20020.
DEBUG (0): SEND_BEACON: [numseq 151], slot 0 no tempo=20020.
WALLTIME 196365167299
DEBUG (0): SORVEDOURO: [trans 6] [origem 8] [slot 0] [cont 3] [time 20022].

Olhando no log, é possível perceber que o pacote com controle 3 [cont 3] foi originário do nó 8 (DEBUG (0): SORVEDOURO: [trans 6] [origem 8] [slot 0] [cont 3] [time 20022]), passou pelo nó 6 ([trans 6]) até chegar no destino (sorvedouro).
Bem, o sorvedouro sempre será o destino final. Pensei em fazer um varredura no arquivo para localizar o DEBUG (0): SORVEDOURO (tem que ser sorvedouro, já que o DEBUG(0) faz outras coisas também) que não muda nunca e a partir dele, carregar 3 variáveis, origem que servirá para a próxima consulta, controle que serve para ver se o pacote é o mesmo da origem para o destino (pode acontecer do DEBUG (0) me retornar uma origem 8 mais o controle for 2, isso quer dizer que o pacote com controle 1 foi perdido) e tempo que servirá para calcular o tempo que demorou para este pacote chegar.
Uma vez carregadas as variáveis, varreria novamente o arquivo a procura do DEBUG (valor de origem que foi carregado, ex.: DEBUG (8): ENVIAR_PKT_DADOS:)(se for possível, varrer do DEBUG (0) para trás já que antes de receber, o pacote tem que ser enviado e também tem que ser ENVIAR_PKT_DADOS). Localizado a primeira ocorrência do DEBUG (8): ENVIAR..., iria carregar um variável controle2, faria a verificação se controle == controle2, se positivo, carrega o tempo2 e faz a operação tempo - tempo2 para retornar o tempo que este pacote demorou. Caso a verificação dos controles retorne falso (controle != controle2), continua a verificação até próxima ocorrência do DEBUG (8): ENVIAR...ou até chegar ao fim, que neste caso retorna "perdido".
Importante reparar que não me interesso pelos nó intermediários (DEBUG (6).
Outro detalhe é que são uns 2000 DEBUG (0): SORVEDOURO, então tenho que fazer essa verificação repetir n vezes (até o fim do arquivo)

Espero que tenha conseguido explicar. Obrigadão pela ajuda. Acredito que por script irá ficar mais rápida a consulta, pois o log tem aproximadamente 25000000 linhas.


Boa tarde arsaraiva.
Pelo que entendi, o processo todo é iniciado em,
DEBUG (0): SORVEDOURO: . . . . .
É isso mesmo?
Caso positivo, por questões de processamento, é interessante varrer o arquivo de log e gerar um temporário com essas ocorrencias,
é a partir desse temp, buscar no log original as demais informações/variáveis.

Qtas ocorrências de DEBUG (0): SORVEDOURO: . . . . . tem no arquivo de log?
Rode o comando:
grep -c '^DEBUG (0): SORVEDOURO:' arquivo_log

No aguardo,
mso



9. Manipulação de Logs

André
arsaraiva

(usa Ubuntu)

Enviado em 08/05/2017 - 17:32h

Olá Marcelo,

Realmente, o processo se inicia no DEBUG (0): SORVEDOURO e depois meio que "anda para trás", pois imagine que você esta fazendo uma viagem, para saber o tempo gasto, você espera chegar para subtrair do momento que saiu da origem. è isso que estou tentando fazer, pegar a chegada (DEBUG (0):SORVEDOURO....), localizar a saída (DEBUG (origem dada pelo sorvedouro):ENVIAR_PKT_DADOS e fazer as operações.
o valor exato de quantos DEBUG (0)´s vai depender de cada log.
Alguns logs tem em torno de 2000 DEBUG (0): SORVEDOURO
outras tem 500, como também 4000.
Concordo com você, em gerar um temporário, só não sei como fazer isso.

Obrigado


10. Re: Manipulação de Logs [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 08/05/2017 - 23:19h

arsaraiva escreveu:

Olá Marcelo,

Realmente, o processo se inicia no DEBUG (0): SORVEDOURO e depois meio que "anda para trás", pois imagine que você esta fazendo uma viagem, para saber o tempo gasto, você espera chegar para subtrair do momento que saiu da origem. è isso que estou tentando fazer, pegar a chegada (DEBUG (0):SORVEDOURO....), localizar a saída (DEBUG (origem dada pelo sorvedouro):ENVIAR_PKT_DADOS e fazer as operações.
o valor exato de quantos DEBUG (0)´s vai depender de cada log.
Alguns logs tem em torno de 2000 DEBUG (0): SORVEDOURO
outras tem 500, como também 4000.
Concordo com você, em gerar um temporário, só não sei como fazer isso.

Obrigado


Saraiva, boa noite.
Estou desenvolvendo a seguinte lógica:
Varre o ARQ.log, "BUSCA" por "DEBUG (0): SORVEDOURO:",
"Limpa e PADRONIZA" => gera temp
Pega "linha a linha" do temp, gera as variáveis,
origem, cont e time
busca no log original por "DEBUG=${origem} ENVIAR_PKT_DADOS:"

Pergunta:
Só existirá uma ocorrência com "DEBUG (origem): ENVIAR_PKT_DADOS"?

marcelo


11. Manipulação de Logs

André
arsaraiva

(usa Ubuntu)

Enviado em 09/05/2017 - 09:51h

Bom dia Marcelo,

na verdade não, podem existir n ocorrências "DEBUG (origem): ENVIAR_PKT_DADOS", como outras.
O que garante que a ocorrência encontrada é a que queremos é a variável cont que tem que ser igual no SORVEDOURO e no ENVIAR_PKT_DADOS.

Isso ocorre porque durante o tempo de simulação o DEBUG (origem) cria pacotes de dados, de controle e ACK. Para facilitar, a cada 5000ms é gerado um pacote de dados.


12. Re: Manipulação de Logs [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 09/05/2017 - 16:04h

arsaraiva escreveu:

Bom dia Marcelo,

na verdade não, podem existir n ocorrências "DEBUG (origem): ENVIAR_PKT_DADOS", como outras.
O que garante que a ocorrência encontrada é a que queremos é a variável cont que tem que ser igual no SORVEDOURO e no ENVIAR_PKT_DADOS.

Isso ocorre porque durante o tempo de simulação o DEBUG (origem) cria pacotes de dados, de controle e ACK. Para facilitar, a cada 5000ms é gerado um pacote de dados.


Boa tarde arsaraiva.
Além de gerar o arquivo "ARQ_SORVED.txt", optei por criar o ARQ_PKT_DADOS.txt, acredito que agilize o processo . . . .

Segue o script para testes/avaliação . . .
#!/bin/bash
OLDIFS="IFS"
CVM="\x1B[0;38;5;196m"
CVD="\x1B[0;38;5;2m"
FC="\x1B[m"
COLS=$(($(tput cols)/2))

LINE() {
printf '%*s' "${COLS}" '' | sed "s/ /—/g"
}

#PEGA AS OCORRÊNCIAS DEBUG (0): SORVEDOURO: "PADRONIZA/Limpa" e GERA "ARQ_SORVED.txt".
sed -n '/^DEBUG (0): SORVEDOURO:/p' INPUT_FILE.txt|sed -r 's/([ ])([0-9]+)/=\2/g;s/\[|\]|:|\)|\.//g;s/ \(/=/' >> ARQ_SORVED.txt

#PEGA DEBUG (nn): ENVIAR_PKT_DADOS: - "PADRONIZA/Limpa" E GERA ARQ_PKT_DADOS.TXT
grep -E 'DEBUG \([0-9]+\): ENVIAR_PKT_DADOS:' INPUT_FILE.txt |sed -r 's/\(|\)|:|\.|\[|\]//g;s/([ ])([0-9]+)/=\2/g' >> ARQ_PKT_DADOS.txt

while IFS=" " read -a FLD00;do
eval ${FLD00[3]} #define a var origem
eval ${FLD00[5]} #define a var cont
eval ${FLD00[6]} #define a var time

#BUSCA POR PKT_DADOS, EM: ARQ_PKT_DADOS.txt
CONTROLE="${FLD00[5]}"
ORIGEM="DEBUG=${origem}"
DADOS_PKT=$(awk '{if($1=="'$ORIGEM'" && $5=="'$CONTROLE'") print $0}' ARQ_PKT_DADOS.txt)
if ((${#DADOS_PKT} > 0));then
IFS=" ";read -a FLD01 <<< "$DADOS_PKT";IFS="$OLDIFS"
eval ${FLD01[6]} #define a var tempo, linha abaixo, subtrai e mostra o resultado.
echo -e "${CVD}$(LINE)\n Origem: $ORIGEM\n Controle: $CONTROLE\n Tempo Gasto: $((time-tempo))\n$(LINE)${FC}"
else
echo -e "${CVM}$(LINE)\n Origem: $ORIGEM\n Controle: $CONTROLE\n ENVIAR_PKT_DADOS NãO ENCONTRADO\n$(LINE)${FC}"
fi
done<ARQ_SORVED.txt


No aguardo,
Marcelo






01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts