C-standardbibliotek (libc, -lc)
#include <sys/syscall.h> /* Definition af SYS_*-konstanter */
#include <unistd.h>
int syscall(SYS_syslog, int type, char *bufp, int size);
/* Glibc-grænsefladen */
#include <sys/klog.h>
int klogctl(int type, char *bufp, int size);
Bemærk: Du er sandsynligvis på udkig efter
C-biblioteksfunktionen syslog(), der kommunikerer med
syslogd(8); se syslog(3) for detaljer.
Denne side beskriver systemkaldet syslog() for kernen, der
bruges til at kontrollere kernens printk()-buffer;
glibc-omslagsfunktionen for systemkaldet kaldes klogctl().
Kernen har en cyklisk buffer med størrelsen
LOG_BUF_LEN hvori beskeder anført som argumenter til
kernefunktionen printk() er lagret (uanset deres logniveau). I
tidligere kerner havde LOG_BUF_LEN værdien 4096; fra Linux
1.3.54 var det 8192; fra Linux 2.1.113 var det 16384; siden Linux 2.4.23/2.6
er værdien en kernekonfigurationsindstilling
(CONFIG_LOG_BUF_SHIFT, standardværdien er afhængig af
arkitekturen). Siden Linux 2.6.6 kan størrelsen forespørges
med kommandotypen 10 (se nedenfor).
Argumentet type bestemmer handlingen udført af denne
funktion. Listen nedenfor angiver værdierne for type. De
symbolske navne er defineret i kernekilden, men eksporteres ikke til
brugerrum; du vil enten skulle bruge tallene, eller definere navnene
selv.
- SYSLOG_ACTION_CLOSE
(0)
- Luk loggen. I øjeblikket en NOP.
- SYSLOG_ACTION_OPEN
(1)
- Åbn loggen. I øjeblikket en NOP.
- SYSLOG_ACTION_READ
(2)
- Læs fra loggen. Kaldet venter indtil kernelogbufferen ikke er tom,
og læser så mindst len byte ind i bufferen peget
på af bufp. Kaldet returnerer antallet af byte læst.
Byte læst fra loggen forsvinder fra logbufferen: informationen kan
kun læses en gang. Dette er funktionen afviklet af kernen
når et brugerprogram læser /proc/kmsg.
- SYSLOG_ACTION_READ_ALL
(3)
- Læs alle beskeder tilbage i ringbufferen, placer dem i bufferen
peget mod af bufp. Kaldet læser de sidste len byte
fra logbufferen (ikkedestruktivt), men vil ikke læse mere end var
skrevet ind i bufferen siden den sidste »clear ring
buffer«-kommanod (se kommando 5 nedenfor)). Kaldet returnerer
antallet af byte læst.
- SYSLOG_ACTION_READ_CLEAR
(4)
- Læs og ryd alle beskeder tilbage i ringbufferen. Kaldet gør
præcis det samme som for en type af 3, men afvikler
også »clear ring buffer«-kommandoen.
- SYSLOG_ACTION_CLEAR
(5)
- Kaldet afvikler kun »clear ring buffer«-kommanoden.
Argumenterne bufp og size ignoreres.
- Denne kommando rydder reelt ikke ringbufferen. I stedet for angives en
kernebookkeeping-variabel, der bestemmer resultaterne returneret af
kommandoerne 3 (SYSLOG_ACTION_READ_ALL) og 4
(SYSLOG_ACTION_READ_CLEAR). Denne kommando har ingen effekt
på kommandoerne 2 (SYSLOG_ACTION_READ) og 9
(SYSLOG_ACTION_SIZE_UNREAD).
- SYSLOG_ACTION_CONSOLE_OFF
(6)
- Kommandoen gemmer den nuværende værdi af
console_loglevel og angiver så console_loglevel til
minimum_console_loglevel, så at ingen beskeder udskrives til
konsollen. Før Linux 2.6.32, angiver kommandoen bare
console_loglevel til minimum_console_loglevel. Se
diskussionen for /proc/sys/kernel/printk, nedenfor.
- Argumenterne bufp og size ignoreres.
- SYSLOG_ACTION_CONSOLE_ON
(7)
- Hvis en tidligere SYSLOG_ACTION_CONSOLE_OFF-kommando er blevet
udført, så gendanner denne kommando console_loglevel
til værdien, der blev gemt af den kommando. Før Linux 2.6.32
angav denne kommando bare console_loglevel til
default_console_loglevel. Se diskussionen for
/proc/sys/kernel/printk, nedenfor.
- Argumenterne bufp og size ignoreres.
- SYSLOG_ACTION_CONSOLE_LEVEL
(8)
- Kaldet angiver console_loglevel til værdien angivet i
size, der skal være et heltal mellem 1 og 8 (inklusive).
Kernen tvinger stille en minimumsværdi på
minimum_console_loglevel for size. Se log
level-afsnittet for detaljer. Argumnetet bufp ignoreres.
- SYSLOG_ACTION_SIZE_UNREAD
(9) (siden Linux 2.4.10)
- Kaldet returnerer antallet af byte tilgængelig i øjeblikket
til at blive læst fra kernelogbufferen via kommando 2
(SYSLOG_ACTION_READ). Argumenterne bufp og size
ignoreres.
- SYSLOG_ACTION_SIZE_BUFFER
(10) (siden Linux 2.6.6)
- Denne kommando returnerer den samlede størrelse for
kernelogbufferen. Argumenterne bufp og size ignoreres.
Alle kommandoer undtagen 3 og 10 kræver privilegium. I
Linuxkerner før Linux 2.6.37 er kommandotyperne 3 og 10 tilladt for
uprivilegerede processer; siden Linux 2.6.37 har disse kommandoer kun adgang
til uprivilegerede processer hvis /proc/sys/kernel/dmesg_restrict har
værdien 0. Før Linux 2.6.37 betød
»privilegeret« at kalderen har funktionaliteten
CAP_SYS_ADMIN. Siden Linux 2.6.37 betyder
»privilegeret« at kalderen har enten funktionaliteten
CAP_SYS_ADMIN (nu forældet til dette formål) eller den
(nye) funktionalitet CAP_SYSLOG.
/proc/sys/kernel/printk er en skrivbar fil indeholdende
fire heltalsværdier der influerer kernens
printk()-opførsel når fejlbeskeder udskrives eller
logges. De fire værdier er:
- console_loglevel
- Kun beskeder med et logniveau lavere end denne værdi vil blive
udskrevet til konsollen. Standardværdien for dette felt er
DEFAULT_CONSOLE_LOGLEVEL (7), men er angivet til 4 hvis
kernekommandolinjen indeholder ordet »quiet«, 10 hvi
kernekommandolinjen indeholder ordet »debug« og til 15 i
tilfælde af en kernefejl (10 og 15 er bare dumme, og svarer til 8).
Værdien console_loglevel kan angives (til en værdi i
intervallet 1–8) af et syslog()-kald med en type
på 8.
- default_message_loglevel
- Denne værdi vil blive brugt som logniveau for
printk()-beskeder, der ikke har et eksplicit niveau. Op til og
inklusive Linux 2.6.38 var den kodede standardværdi for dette felt
4 (KERN_WARNING); siden Linux 2.6.39 er standardværdien
defineret af kernekonfigurationstilvalget
CONFIG_DEFAULT_MESSAGE_LOGLEVEL, hvis standard er 4.
- minimum_console_loglevel
- Værdien i dette felt er den mindste værdi som
console_loglevel kan have.
- default_console_loglevel
- Dette er standardværdien for console_loglevel.
Hver printk()-besked har sit eget logniveau. Hvis
logniveauet ikke er eksplict angivet som en del af beskeden, så er
standarden default_message_loglevel. Den konventionelle betydning af
logniveauet er som følger:
| Kernekonstant |
Niveauværdi |
Betydning |
| KERN_EMERG |
0 |
Systemet kan ikke bruges |
| KERN_ALERT |
1 |
Handling skal udføres øjeblikkeligt |
| KERN_CRIT |
2 |
Kritiske betingelser |
| KERN_ERR |
3 |
Fejlbetingelser |
| KERN_WARNING |
4 |
Advarselsbetingelser |
| KERN_NOTICE |
5 |
Normal men signifikant betingelse |
| KERN_INFO |
6 |
Informativ |
| KERN_DEBUG |
7 |
Fejlsøgnings-niveaubeskeder |
Kernens printk()-rutine vil kun udskrive en besked
på konsollen hvis denne har et logniveau mindre end værdien af
console_loglevel.
For type svarende til 2, 3 eller 4 returnerer et succesfuld
kald til syslog() antallet af læste byte. For type 9,
returnerer syslog() antallet af byte tilgængelig i
øjeblikket for læsning af kernens logbuffer. For type
10 returnerer syslog() den samlede størrelse for kernens
logbuffer. For andre værdier af type returneres 0 ved
succes.
I tilfælde af fejl returneres -1 og errno angives
for at indikere fejlen.
- EINVAL
- Ugyldige argumenter (f.eks. ugyldig type; eller for type 2,
3 eller 4, er buf NULL eller size er mindre end nul; eller
for type 8, er level uden for intervallet 1 til 8).
- ENOSYS
- Dette syslog()-systemkald er ikke tilgængelig, da kernen
blev kompileret med kernekonfigurationstilvalget CONFIG_PRINTK
deaktiveret.
- EPERM
- Et forsøg blev gjort på at ændre
console_loglevel eller rydde kernens beskedringbuffer af en proces
uden tilstrækkelig privilegium (mere præcist: uden
funktionaliteten CAP_SYS_ADMIN eller CAP_SYSLOG).
- ERESTARTSYS
- Systemkald blev afbrudt af et signal; intet blev læst. (Dette kan
kun ses under en sporing).
Fra begyndelsen bemærkede for at det var uheldigt at et
systemkald og en biblioteksrutine med det samme navn er helt forskellige
ting.