Jump to content
Omar~

Apagar determinadas linhas randômicas em arquivo de texto

Recommended Posts

É o seguinte, vou fazer certos registros de LOG em arquivos de texto, para não salvar no banco. Serão erros mais delicados como falha em uma query ou erros de execução que eventualmente possa ocorrer no sistema. Assim mantendo uma manutenção mais eficaz.

Então o melhor mesmo é salvar em um arquivo de texto mesmo.

Mas é o seguinte... Como na consulta dos erros quero criar uma espécie de tabela que vai listar todos erros que ocorreram. Logo então adicionar um botão para apagar aquele determinado trecho escrito. Para fazer tudo online mesmo. Entra aqui meu problema, porque não sei como fazer para apagar somente aquele trecho do documento que é um TXT.

 

Esse é o método que fiz para dar mais autonomia ao registro:

Spoiler

    public static function logRegister($desc) {
        $text = "\r\n========================================"
                . "\r\n = Data: " . date('d-m-Y')
                . "\r\n = Hora: " . date('h:i:s')
                . "\r\n========================================"
                . "\r\n Descrição do erro:"
                . "\r\n{$desc}"
                . "\r\n";
        $openFile = fopen(__DIR__ . '/../../logs/error.txt', 'a');
        fwrite($openFile, $text);
        fclose($openFile);
    }

 

 

O que gera um texto similar a esse mas o conteúdo é baseado no que é enviado por parâmetro para o método

Spoiler

========================================
 = Data: 2018-02-11
 = Hora: 07:38:13
========================================
Descrição do erro:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

aaaaaaaaaaaaaaaaaaaaaaaaaaa

 

========================================
 = Data: 2018-02-11
 = Hora: 07:38:19
========================================
Descrição do erro:
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

 

========================================
 = Data: 2018-02-11
 = Hora: 07:38:20
========================================
Descrição do erro:
cccccccccccccccccccccccccccccccccccccccccc

ccccccccccccc

 

 

 

Digamos então que eu tenha essas 3 entradas que serão listadas, aí vai lá eu e quero apagar a segunda entrada, como seria isso (No código PHP)

 

Na verdade até que eu fazia isso, antes do MySql para fazer registros como se fosse em um banco de dados usado hoje em dia, só que já faz tantos anos que nem lembro mais, nem sei se ainda é possível fazer isso nas versões atuais do PHP.

Share this post


Link to post
Share on other sites

Eu não armazenaria logs em arquivos.

Um banco de dados permite que você analise, filtre, trate e exiba muito mais eficientemente.

Para criar uma solução de logs do zero, eu iria sugerir o MongoDb.

 

Se você quer usar arquivos e ainda lidar com exibição e manipulação desses logs via web, você não deveria se preocupar com a apresentação crua deles (o conteúdo real dentro dos arquivos), isso significa que você deveria:

 

1 - Remover essas strings '========...'. Isso só consome espaço em disco.

 

2 - Criar um padrão que facilite o processamento desses arquivos no código. Exemplo:

{i}\t{mensagem}\t{data}\t{outro_parametro_qualquer}\n
{i}\t{mensagem}\t{data}\t{outro_parametro_qualquer}\n
...

Exemplo com dados na prática:

1	Syntax Error bla bla bla	2018-04-05 00:15:30	alguma coisa
3	Teste testex	2018-04-10 00:15:30	outra coisa

Observe como os dados não seguem um alinhamento. Isso é pq as colunas estão divididas meramente por um caractere de tabulação (\t).

 

Como você sabe que cada registro do log está em uma linha, você consegue navegar entre eles usando a SplFileObject e seus métodos, como o seek: http://php.net/manual/en/splfileobject.seek.php

 

Para excluir uma linha você precisa iterar sobre as linhas, encontrar o ID desejado e removê-la.

Para isso, você poderia simplesmente remover todo o conteúdo dela e depois usar a flag SKIP_EMPTY do SplFileObject para ignorar linhas vazias.

 

Outra sugestão: se você quer usar arquivos: agrupe-os de alguma forma. Por exemplo: crie um arquivo para cada mês.

Esse agrupamento depende de como e com que frequência você pretende acessar esses logs depois.

  • Obrigado! 1

Share this post


Link to post
Share on other sites

Matheus sobre espaço em disco... Acredito que não seja o problema uma vez que isso somente é para erros do sistema e não logs corriqueiros que geramos numa aplicação. Então o conteúdo gerado será mínimo, serão muito raros de acontecer, daí a implementação do que mencionou "agrupamento de arquivos por mês ou semestre", ainda não fiz porque estou na parte dó de debugs mesmo.

 

Gostei da ideia de uma única linha, assim sendo da mesma forma que vou percorrer o documento para mostrar linha tal posso usar para (apagar).

 

Na verdade não é apagar e sim reescrever, e esse é meu problema, aí que tá mesmo que eu reescreva só com uma quebra de linha, aquela linha do documento ainda existe (Porque aqui é a questão "Não sei como apagar só reescrever com algo por cima").

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.