Rediriger STDERR et STDOUT vers un fichier avec horodatage sur chaque ligne

1

Sur mon CentOS, j'essaie d'exécuter un script php contenant une boucle infinie pour créer des éléments sophistiqués. Peu importe qu'une boucle sans fin ne soit pas une solution précise dans la plupart des cas, mais bien pour mon test. Si une erreur survient dans cette boucle, l'erreur est écrite dans un fichier de sortie (comme c'est le cas de stdout). C'est ce que je fais en ce moment.

exec php testfile.php >> output.log 2>&1

Cela fonctionne comme prévu, mais je veux savoir quand stdout ou stderr écrit quelque chose dans le fichier, j'ai donc besoin d'une sorte d'horodatage sur chaque ligne.

J'ai déjà essayé quelque chose comme ça , mais si je le fais comme indiqué ici, il n'y a tout simplement aucune sortie (je suppose que c'est parce que ce n'est pas un simple script shell).

Est-il possible de rediriger chaque echode testfile.php et chaque erreur de stderr vers output.log avec un horodatage sur chaque ligne?

Dolgsthrasir
la source

Réponses:

2

Vous pouvez préfixer chaque ligne avec une chaîne datetime formatée à l'aide de gnu awk. Cependant, la mise en mémoire tampon peut provoquer la réorganisation de certaines lignes ou la disparition des deux dernières. Pour éviter cela, il est recommandé d' utiliser stdbuf .

stdbuf -i0 -o0 php testfile.php  2>&1 | gawk '{print strftime("%Y%m%d-%H%M%S"), $0}' >> output.log 
Gombai Sándor
la source
Cela semble fonctionner si le fichier testfile.php ne contient que quelque chose comme echo "Test";. Mais rien n'est écrit dans le fichier de sortie s'il se echotrouve dans la boucle infinie mentionnée. Se pourrait-il qu'en raison de cette boucle et que l'exécution ne se termine jamais, aucune sortie ne soit écrite?
Dolgsthrasir
Pas de sortie, peut-être. Je l'ai vérifié maintenant avec un écho infini, et a l'air bien.
Gombai Sándor