grep end de vários arquivos

0

Eu tenho vários arquivos de log (20-500) de um aplicativo que falha. Todos os arquivos de log são de uma execução do aplicativo - é altamente multithread, com cada thread gravando em seu próprio arquivo. Mas os logs são grandes . (Pode ser 100s de MB cada em alguns casos)

Agora, um dos segmentos está falhando e, quando isso acontece, grava uma mensagem nas últimas centenas de linhas de seu arquivo de log. Às vezes, todos os segmentos terminam OK e essa linha nunca é escrita.

Meu script de wrapper que executa o aplicativo com falha está no bash e Gostaria de detectar quando o aplicativo trava dessa maneira para que eu possa reiniciá-lo. Posso fazer algo melhor que:

# We want to run at least once
CRASHED=1
while [ CRASHED -eq 1 ]
    # Run the app
    run_application
    # Check the end of all the logs for KEY
    CRASHED=0
    for x in logs/* ; do
      if tail -n 100 $x | grep "KEY" ; then
        CRASHED=1
        # We'll only find it once, so may as well bail out now
        break
      fi
    done
done  

Estou principalmente interessado em substituir o loop pelos arquivos de log por algo embutido. Não posso usar apenas

grep "KEY" logs/* 

porque os arquivos são muito grandes para que isso seja eficiente.

    
por Michael Anderson 08.11.2016 / 03:32

3 respostas

0

No final, eu fui com alguns dos métodos dos comentários. Tirar o rabo do loop principal permitiu simplificar ainda mais a lógica: o que acabei fazendo foi algo como:

while true
    echo "Starting the application"
    run_application
    echo "Application exited - checking logs for KEY"
    if ! tail -qn 100 logs/* | grep -q "KEY"
    then
      echo "Failed without KEY in the logs - exiting"
      break
    fi
    echo "Failed with KEY in the logs - restarting"
done 
    
por 15.11.2016 / 02:28
0

Use;

tail --follow -n 100 *.log | grep -q key

omitir - seguir se o aplicativo realmente sair em caso de falha. link

    
por 08.11.2016 / 05:18
0

Como você já tem a capacidade de pausar até o aplicativo sair, é possível pesquisar apenas os arquivos de log recentemente modificados . Você pode restringir ainda mais esse conjunto por número ou por hora.

Aqui estão algumas soluções alternativas que assumem que os nomes dos arquivos de log são razoavelmente saudáveis.

  1. Supondo que os nomes dos arquivos de log não contenham espaço em branco e que a mensagem de falha seja gravada em algum lugar em um dos últimos (6) arquivos gravados:

    if grep -q "KEY" $(ls -dt logs/* | head -6)
    then echo FOUND; else echo NOT FOUND
    fi
    
  2. Supondo que os nomes dos arquivos de log podem conter espaços, mas que a mensagem de falha é gravada em um dos últimos (6) arquivos gravados

    ls -t logs | head -6 | (
        while IFS= read -r f
        do
            grep -q "KEY" logs/"$f" && break
        done
        exit 1
    )
    if [[ $? -eq 0 ]]; then echo FOUND; else echo NOT FOUND; fi
    
  3. Supondo que os nomes dos arquivos de log podem conter espaços, mas que a mensagem de falha é gravada na última parte (400 linhas) de um dos últimos (6) arquivos gravados

    ls -t logs | head -6 | (
        while IFS= read -r f
        do
            tail -n400 logs/"$f" | grep -q "KEY" && break
        done
        exit 1
    )
    if [[ $? -eq 0 ]]; then echo FOUND; else echo NOT FOUND; fi
    
  4. Supondo que os nomes dos arquivos de log não contenham espaço em branco e que a mensagem de falha seja gravada em um dos arquivos gravados nos últimos (5) minutos

    if grep -q "KEY" $(find logs -type f -min -5)
    then echo FOUND; else echo NOT FOUND
    fi
    
  5. Supondo que os nomes dos arquivos de log podem conter espaços, mas que a mensagem de falha é gravada em um dos arquivos gravados nos últimos (5) minutos

    find logs -type f -min -5 | (
        while IFS= read -r f
        do
            grep -q "KEY" "$f" && break
        done
        exit 1
    )
    if [[ $? -eq 0 ]]; then echo FOUND; else echo NOT FOUND; fi
    
  6. Supondo que os nomes dos arquivos de log podem conter espaços, mas que a mensagem de falha é gravada na última parte (400 linhas) dos arquivos gravados nos últimos (5) minutos

    find logs -type f -min -5 | (
        while IFS= read -r f
        do
            tail -n400 "$f" | grep -q "KEY" && break
        done
        exit 1
    )
    if [[ $? -eq 0 ]]; then echo FOUND; else echo NOT FOUND; fi
    
por 09.11.2016 / 11:05

Tags