Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[FreeBSD] newsyslog.conf et multiples fichiers de logs

6 réponses
Avatar
Paul Gaborit
Une petite question concernant la syntaxe de /etc/newsyslog.conf.

Pour effectuer la rotation des nombreux fichiers de logs d'Apache
(j'ai plusieurs virtual hosts), j'ai ajouté la ligne suivante dans
newsyslog.conf :

/var/log/apache/*.log 644 3 7777 @T00 GB /var/run/httpd.pid 30

Jusqu'ici ça marche très bien.

Mais aujourd'hui, j'ai installé un nouveau virtual host dont les
fichiers de logs ne sont pas dans /var/log/apache mais dans
/foo/bar/logs (c'est un exemple). J'aimerai donc ajouter les fichiers
correspondants à ma ligne mais je ne trouve pas comment faire.

Déjà en relisant la doc de newsyslog et de newsyslog.conf, je n'arrive
pas à comprendre comment '*.log' peut fonctionner dans la ligne
actuelle ! Et je ne trouve pas la syntaxe pour indiquer plusieurs
fichiers...

Sinon, comment faites-vous pour gérer la rotation des logs d'Apache ?

Merci.

PS: j'aime bien la section BUGS dans le man de newsyslog ! ;-)

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>

6 réponses

Avatar
F. Senault

Déjà en relisant la doc de newsyslog et de newsyslog.conf, je n'arrive
pas à comprendre comment '*.log' peut fonctionner dans la ligne
actuelle ! Et je ne trouve pas la syntaxe pour indiquer plusieurs
fichiers...


Le comment, c'est l'option 'G' simplement :

| G indicates that the specified logfile_name is a shell pat-
| tern, and that newsyslog(8) should archive all filenames
| matching that pattern using the other options on this
| line. See glob(3) for details on syntax and matching
| rules.

(Résumé : G indique que le nom est en fait un "glob" (heu ? canevas ?)
et que tous les fichiers correspondants doivent être archivés.
Plus d'infos : glob(3).)

Pour en revenir à la question principale, la possibilité d'accéder à
deux chemins distincts par un glob pourrait se faire avec la syntaxe
{x,y} me semble-t-il (donc {/var/log/apache/*,/foo/bar/*}), mais... sans
garantie (ce n'est pas disponible par défaut dans glob).

Sinon, pour la gestion des logs, j'avais simplement plusieurs lignes...
Je suppose que le daemon se faisait signaler plusieurs fois, mais ça ne
me semble pas très très lourd comme opération.

Fred
--
Broken bruised forgotten sore
Too fucked up to care anymore
Poisoned to my rotten core
Too fucked up to care anymore (Nine Inch Nails, Somewhat Damaged)

Avatar
Paul Gaborit
À (at) Mon, 23 Jul 2007 20:36:40 +0200,
"F. Senault" écrivait (wrote):

Déjà en relisant la doc de newsyslog et de newsyslog.conf, je n'arrive
pas à comprendre comment '*.log' peut fonctionner dans la ligne
actuelle ! Et je ne trouve pas la syntaxe pour indiquer plusieurs
fichiers...


Le comment, c'est l'option 'G' simplement :
[...]

Plus d'infos : glob(3).)


Bon sang, mais c'est bien sûr !

Comme quoi, une lecture rapide de la doc est toujours mauvaise...
surtout quand la mémoire flanche puisque je ne l'avais pas quand même
pas mise par hasard cette option 'G' ! ;-)

Pour en revenir à la question principale, la possibilité d'accéder à
deux chemins distincts par un glob pourrait se faire avec la syntaxe
{x,y} me semble-t-il (donc {/var/log/apache/*,/foo/bar/*}), mais... sans
garantie (ce n'est pas disponible par défaut dans glob).


Dommage effectivement car l'idée était séduisante.

Sinon, pour la gestion des logs, j'avais simplement plusieurs lignes...
Je suppose que le daemon se faisait signaler plusieurs fois, mais ça ne
me semble pas très très lourd comme opération.


Le processus peut-être long car ça dépend de ce que les fils sont en
train de faire. En fait, la documentation d'Apache ne dit rien de ce
qui se passe si le processus père reçoit un deuxième signal USR1 alors
qu'il n'a pas fini de traiter le premier... Je vais faire quelques
tests pour voir.

Merci.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/&gt;


Avatar
F. Senault

À (at) Mon, 23 Jul 2007 20:36:40 +0200,
"F. Senault" écrivait (wrote):

Pour en revenir à la question principale, la possibilité d'accéder à
deux chemins distincts par un glob pourrait se faire avec la syntaxe
{x,y} me semble-t-il (donc {/var/log/apache/*,/foo/bar/*}), mais... sans
garantie (ce n'est pas disponible par défaut dans glob).


Dommage effectivement car l'idée était séduisante.


As-tu testé / vérifié dans les sources ? Sait-on jamais.

Sinon, pour la gestion des logs, j'avais simplement plusieurs lignes...
Je suppose que le daemon se faisait signaler plusieurs fois, mais ça ne
me semble pas très très lourd comme opération.


Le processus peut-être long car ça dépend de ce que les fils sont en
train de faire. En fait, la documentation d'Apache ne dit rien de ce
qui se passe si le processus père reçoit un deuxième signal USR1 alors
qu'il n'a pas fini de traiter le premier... Je vais faire quelques
tests pour voir.


Alternativement, en fonction de ce que tu peux te permettre, tu pourrais
aussi décaler la rotation des logs d'une minute et ne signaler que le
second. Le défaut est évidemment le trou lors du décalage.

Fred
--
People are not programmed - one cannot simply ram a metaphorical serial
cable up someone's arse and rewrite whatever bit of their source code is
making them function incorrectly.
(Alistair J. R. Young)


Avatar
Paul Gaborit
À (at) Tue, 24 Jul 2007 00:04:30 +0200,
"F. Senault" écrivait (wrote):

À (at) Mon, 23 Jul 2007 20:36:40 +0200,
"F. Senault" écrivait (wrote):

Pour en revenir à la question principale, la possibilité d'accéder à
deux chemins distincts par un glob pourrait se faire avec la syntaxe
{x,y} me semble-t-il (donc {/var/log/apache/*,/foo/bar/*}), mais... sans
garantie (ce n'est pas disponible par défaut dans glob).


Dommage effectivement car l'idée était séduisante.


As-tu testé / vérifié dans les sources ? Sait-on jamais.


Dans ceux de glob ou dans ceux de newsyslog ? En fait, vu que tout
cela, c'est du FreeBSD, je pars du principe que c'est bien documenté !
En tous cas, pour glob, cela me semblerait vraiment bizarre que les {}
aient un sens particulier sans que ce soit documenté. Cela pourrait
poser des problèmes...

[...]
Alternativement, en fonction de ce que tu peux te permettre, tu pourrais
aussi décaler la rotation des logs d'une minute et ne signaler que le
second. Le défaut est évidemment le trou lors du décalage.


À voir, en effet... Le "trou" dépend vraiment du comment s'effectue la
rotation. En fait, j'ai vraiment l'impression que newsyslog n'est pas
adapté à la gestion des logs d'Apache. Surtout si on souhaite
compresser les "vieux" logs. Comme Apache ne permet pas de savoir
quand ses fils on finit d'écrire dans le fichier de log, il faudrait
pouvoir retarder la compression... Je crois qu'il va me falloir
revenir aux solutions plus ad'hoc du genre 'RotateLog'. Dommage,
j'aimais bien la solution 'newsyslog'...

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/&gt;



Avatar
F. Senault

aient un sens particulier sans que ce soit documenté. Cela pourrait
poser des problèmes...


Hrm.

| 1:42 :~/site/lacave/projets> man 3 glob | grep '{'
| typedef struct {
| GLOB_BRACE Pre-process the pattern string to expand `{pat,pat,...}'
| strings like csh(1). The pattern `{}' is left unex-

:)

Mais bon, ce flag n'a pas l'air utilisé dans newsyslog.

[...]
Alternativement, en fonction de ce que tu peux te permettre, tu pourrais
aussi décaler la rotation des logs d'une minute et ne signaler que le
second. Le défaut est évidemment le trou lors du décalage.


À voir, en effet... Le "trou" dépend vraiment du comment s'effectue la
rotation. En fait, j'ai vraiment l'impression que newsyslog n'est pas
adapté à la gestion des logs d'Apache. Surtout si on souhaite
compresser les "vieux" logs. Comme Apache ne permet pas de savoir
quand ses fils on finit d'écrire dans le fichier de log, il faudrait
pouvoir retarder la compression...


Ceci étant dit, newsyslog a un délai codé en dur de 10 secondes pour la
rotation. C'est peut-être suffisant ?

Il est aussi intéressant de voir que la mécanique de newsyslog (si je
lis bien le code) est de déplacer tous les logs, signaler tous les
daemons, attendre 10 secondes, compresser tout. En d'autres mots, par
rapport à ta question première, tu peux ne mettre la ligne qui signale
qu'une fois, ça devrait suffire.

Je crois qu'il va me falloir
revenir aux solutions plus ad'hoc du genre 'RotateLog'. Dommage,
j'aimais bien la solution 'newsyslog'...


Solution, aussi : compresser dans une étape séparée ; donc, newsyslog
déplace, et un crontab plus tard compresse.

Fred
--
News servers are always easy to scale. You just thrown them out the
window every 9 months and buy new ones.
(Curt Welch in news.software.nntp)


Avatar
Paul Gaborit
À (at) Tue, 24 Jul 2007 01:53:54 +0200,
"F. Senault" écrivait (wrote):
Ceci étant dit, newsyslog a un délai codé en dur de 10 secondes pour la
rotation. C'est peut-être suffisant ?


Malheureusement, le traitement d'une requête HTTP peut dure bien plus
longtemps. Mais ça ne pose problème qu'en cas de compression.

Il est aussi intéressant de voir que la mécanique de newsyslog (si je
lis bien le code) est de déplacer tous les logs, signaler tous les
daemons, attendre 10 secondes, compresser tout. En d'autres mots, par
rapport à ta question première, tu peux ne mettre la ligne qui signale
qu'une fois, ça devrait suffire.


Merci pour l'info des 10 secondes. Je vais faire en deux lignes avec
un seul signal (la simple rotation des logs ne prends pas 10
secondes).

Solution, aussi : compresser dans une étape séparée ; donc, newsyslog
déplace, et un crontab plus tard compresse.


En fait, je le fais déjà une fois que l'analyse des logs est
terminée...

Encore merci.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/&gt;