syslog, klogctl - Lire et/ou effacer les tampons circulaires de
messages du noyau ; définir console_loglevel
Bibliothèque C standard (libc, -lc)
#include <sys/klog.h> /* Définition des constantes SYSLOG_* */
#include <sys/syscall.h> /* Définition des constantes SYS_* */
#include <unistd.h>
int syscall(SYS_syslog, int type, char *bufp, int len);
/* L'interface de la glibc */
#include <sys/klog.h>
int klogctl(int type, char *bufp, int len);
Note : vous cherchez sans doute la fonction de la
bibliothèque C syslog() qui communique avec
syslogd(8) ; reportez-vous à syslog(3) pour plus
de détails.
Cette page décrit l'appel système du noyau
syslog() qui est utilisé pour contrôler le tampon du
noyau printk() ; la fonction d'enveloppe de la glibc
correspondant à cet appel système est klogctl().
Le noyau dispose d'un tampon circulaire d'une longueur
LOG_BUF_LEN dans lequel il stocke les messages fournis en
paramètre à la fonction du noyau printk() (sans tenir
compte du niveau de journalisation). Dans les premiers noyaux,
LOG_BUF_LEN avait pour valeur 4096 ; à partir de Linux
1.3.54, elle valait 8192 ; à partir de Linux 2.1.113,
elle valait 16384 ; depuis Linux 2.4.23/2.6, la valeur est une option
de configuration du noyau (CONFIG_LOG_BUF_SHIFT, valeur par
défaut dépendant de l'architecture). Depuis
Linux 2.6.6, la commande de type 10 (voir plus bas) renvoie la taille
du tampon.
L'argument type détermine quelle action est
réalisée par cette fonction. La liste ci-dessous
précise les valeurs que peut prendre type. Les noms
symboliques sont définis dans les sources du noyau, mais ne sont pas
exportés dans l'espace utilisateur ; vous devrez donc utiliser
les identifiants numériques ou redéfinir vous-même les
noms.
- SYSLOG_ACTION_CLOSE
(0)
- Ferme le journal. Actuellement, cette instruction est sans effet.
- SYSLOG_ACTION_OPEN
(1)
- Ouvre le journal. Actuellement, cette instruction est sans effet.
- SYSLOG_ACTION_READ
(2)
- Lecture du journal. Dès que le tampon du journal n'est plus vide,
l'appel lit au plus len octets qu'il place dans le tampon vers
lequel pointe bufp. Il renvoie le nombre d'octets lus. Les octets
lus sont supprimés du tampon du journal : les informations
ne peuvent être lues qu'une seule fois. C'est la fonction
exécutée par le noyau quand un programme utilisateur lit
/proc/kmsg.
- SYSLOG_ACTION_READ_ALL
(3)
- Lecture de tous les messages restant dans le tampon circulaire, qui sont
déplacés dans le tampon vers lequel pointe bufp.
L'appel lit les len derniers octets dans le tampon du journal (de
manière non destructive). Il ne lira pas plus que ce qui a
été écrit dans le tampon depuis la dernière
exécution de la commande de nettoyage (commande
« clear ring buffer », voir plus bas la
commande 5). L'appel renvoie le nombre d'octets lus.
- SYSLOG_ACTION_READ_CLEAR
(4)
- Lecture et suppression de tous les messages du tampon circulaire. L'appel
effectue exactement la même chose que la commande de type 3,
mais exécute également la commande « clear
ring buffer ».
- SYSLOG_ACTION_CLEAR
(5)
- L'appel ne fait qu'exécuter la commande « clear ring
buffer ». Les arguments bufp et len ne sont
pas pris en compte.
- Cette fonction ne vide pas réellement le tampon circulaire. Plus
exactement, elle définit une variable de suivi d'activité du
noyau qui détermine ce que renvoient les commandes 3
(SYSLOG_ACTION_READ_ALL) et 4 (SYSLOG_ACTION_READ_CLEAR).
Cette commande est sans effet sur les commandes 2
(SYSLOG_ACTION_READ) et 9 (SYSLOG_ACTION_SIZE_UNREAD).
- SYSLOG_ACTION_CONSOLE_OFF
(6)
- La commande sauvegarde la valeur actuelle de console_loglevel puis
affecte la valeur minimum_console_loglevel à
console_loglevel afin que les messages soient affichés sur
la console. Avant Linux 2.6.32, la commande affectait seulement la valeur
minimum_console_loglevel à console_loglevel.
Reportez-vous aux explications relatives à
/proc/sys/kernel/printk plus bas.
- Les arguments bufp et len ne sont pas pris en compte.
- SYSLOG_ACTION_CONSOLE_ON
(7)
- Si la commande SYSLOG_ACTION_CONSOLE_OFF a été
exécutée précédemment, cette commande
réaffecte à console_loglevel la valeur
sauvegardée au moment de cette exécution. Avant Linux
2.6.32, cette commande réaffectait la valeur
default_console_loglevel à console_loglevel.
Reportez-vous aux explications relatives à
/proc/sys/kernel/printk plus bas.
- Les arguments bufp et len ne sont pas pris en compte.
- SYSLOG_ACTION_CONSOLE_LEVEL
(8)
- L'appel positionne console_loglevel à la valeur
indiquée dans len, qui doit être un entier compris
entre 1 et 8 (inclus). Le noyau applique implicitement une valeur minimale
minimum_console_loglevel pour len Consultez la section Le
niveau de journalisation (log level) pour plus de détails.
L'arguments bufp n'est pas pris en compte.
- SYSLOG_ACTION_SIZE_UNREAD
(9) (à partir de Linux 2.4.10)
- L'appel renvoie le nombre d'octets disponibles en lecture dans le tampon
de journalisation du noyau au moment de l'appel, au moyen de la commande 2
(SYSLOG_ACTION_READ). Les arguments bufp et len ne
sont pas pris en compte.
- SYSLOG_ACTION_SIZE_BUFFER
(10) (à partir de Linux 2.6.6)
- Cette commande renvoie la taille totale du tampon du journal du noyau. Les
arguments bufp et len ne sont pas pris en compte.
Toutes les commandes, excepté 3 et 10, nécessitent
des privilèges. Dans les noyaux Linux avant Linux 2.6.37,
seules les commandes de type 3 à 10 étaient permises
aux processus non privilégiés ; depuis Linux 2.6.37,
les commandes de type 3 et 10 sont permises à ces processus seulement
si /proc/sys/kernel/dmesg_restrict vaut 0. Avant Linux 2.6.37,
« privilégié » signifiait que
l'appelant avait la capacité CAP_SYS_ADMIN. Depuis
Linux 2.6.37,
« privilégié » signifie que
l’appelant soit la capacité CAP_SYS_ADMIN (maintenant
obsolète pour cet usage), soit la (nouvelle) capacité
CAP_SYSLOG.
/proc/sys/kernel/printk est un fichier accessible en
écriture qui contient quatre valeurs qui affectent le comportement la
fonction printk() du noyau lors de l'affichage ou de la
journalisation des messages d'erreur. Ces quatre valeurs sont :
- console_loglevel
- Seuls les messages dont le niveau de journalisation est inférieur
à cette valeur seront affichés sur la console. La valeur par
défaut du champ est DEFAULT_CONSOLE_LOGLEVEL (7),
mais elle est ramenée à 4 si la ligne de commande du
noyau contient le mot clef « quiet »,
à 10 si la ligne de commande contient le mot
« debug », et à 15 en cas
d'erreur du noyau (les valeurs 10 et 15 n'ont en fait pas de sens
car elles équivalent à 8). La valeur
console_loglevel peut prendre une valeur (comprise entre 1
et 8) définie par un appel à syslog() avec un
type valant 8.
- default_message_loglevel
- Cette valeur fournira le niveau de journalisation des messages de
printk() pour lesquels un niveau de journalisation n'est pas
explicitement défini. Jusqu'à Linux 2.6.38 inclus, la
valeur par défaut inscrite dans le code pour ce champ
était 4 (KERN_WARNING) ; à partir de
Linux 2.6.39, la valeur par défaut est
déterminée par l'option de configuration du noyau
CONFIG_DEFAULT_MESSAGE_LOGLEVEL, qui par défaut
vaut 4.
- minimum_console_loglevel
- Ce champ contient la valeur minimale qui peut être affectée
à console_loglevel.
- default_console_loglevel
- La valeur par défaut de console_loglevel.
Chaque message de printk() a son propre niveau de
journalisation. Si le niveau de journalisation n'est pas explicitement
précisé comme partie du message, il vaut par défaut
default_message_loglevel. Le niveau de journalisation a par
convention les significations suivantes :
| Constante du noyau |
Valeur du niveau |
Signification |
| KERN_EMERG |
0 |
Le système est inutilisable |
| KERN_ALERT |
1 |
Des actions doivent être entreprises immédiatement |
| KERN_CRIT |
2 |
Les conditions sont critiques |
| KERN_ERR |
3 |
Des erreurs se produisent |
| KERN_WARNING |
4 |
Des avertissements se présentent |
| KERN_NOTICE |
5 |
Condition normale, mais message significatif |
| KERN_INFO |
6 |
Message d'information simple |
| KERN_DEBUG |
7 |
Messages de débogage |
La routine du noyau printk() n'affiche un message sur la
console que si son niveau de journalisation est inférieur à la
valeur console_loglevel.
Quand type est égal à 2, 3 ou 4, un appel
réussi à syslog() renvoie le nombre d'octets lus. Pour
le type 9, syslog() renvoie le nombre d'octets disponibles
actuellement en lecture dans le tampon de journalisation du noyau. Pour le
type 10, syslog() renvoie la taille totale du tampon de
journalisation du noyau. Pour les autres valeurs de type, 0
est renvoyé en cas de succès.
En cas d'erreur, -1 est renvoyé et errno est
défini pour préciser l'erreur.
- EINVAL
- Mauvais paramètres (par exemple, mauvais type ; ou
type égal à 2, 3 ou 4, buf est NULL ou
len est inférieur à 0 ; ou pour type
égal à 8, le niveau level est en dehors de
l'intervalle allant de 1 à 8).
- ENOSYS
- L'appel système syslog() n'est pas disponible car le noyau a
été compilé sans que l'option CONFIG_PRINTK de
configuration du noyau n'ait été activée.
- EPERM
- Un changement de console_loglevel ou un effacement du tampon
circulaire de messages du noyau par un processus sans les
privilèges suffisants (plus précisément sans la
capacité CAP_SYS_ADMIN ou CAP_SYSLOG) a
été tenté.
- ERESTARTSYS
- L'appel système a été interrompu par un signal, et
rien n'a été lu. (Cela ne peut être vu que pendant un
suivi de processus).
Depuis longtemps, des gens trouvent regrettable qu'un appel
système et une routine de bibliothèque aient le même
nom bien qu'ils n'aient pas de rapport entre eux.
La traduction française de cette page de manuel a
été créée par Christophe Blaess
<https://www.blaess.fr/christophe/>, Stéphan Rafin
<stephan.rafin@laposte.net>, Thierry Vignaud
<tvignaud@mandriva.com>, François Micaux, Alain Portal
<aportal@univ-montp2.fr>, Jean-Philippe Guérard
<fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh)
<jean-luc.coulon@wanadoo.fr>, Julien Cristau
<jcristau@debian.org>, Thomas Huriaux
<thomas.huriaux@gmail.com>, Nicolas François
<nicolas.francois@centraliens.net>, Florentin Duneau
<fduneau@gmail.com>, Simon Paillard
<simon.paillard@resel.enst-bretagne.fr>, Denis Barbier
<barbier@debian.org>, David Prévot <david@tilapin.org>,
Cédric Boutillier <cedric.boutillier@gmail.com>,
Frédéric Hantrais <fhantrais@gmail.com> et Jean-Pierre
Giraud <jean-pierregiraud@neuf.fr>
Cette traduction est une documentation libre ; veuillez
vous reporter à la
GNU General
Public License version 3 concernant les conditions de copie et de
distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page
de manuel, veuillez envoyer un message à
debian-l10n-french@lists.debian.org.