logging
— Loggningsfunktion för Python¶
Källkod: Lib/logging/__init__.py
Denna modul definierar funktioner och klasser som implementerar ett flexibelt händelseloggningssystem för applikationer och bibliotek.
Den största fördelen med att API:et för loggning tillhandahålls av en standardbiblioteksmodul är att alla Python-moduler kan delta i loggning, så att din applikationslogg kan innehålla dina egna meddelanden integrerade med meddelanden från tredjepartsmoduler.
Här är ett enkelt exempel på idiomatisk användning:
# myapp.py
import logging
import mylib
logger = logging.getLogger(__name__)
def main():
logging.basicConfig(filename='myapp.log', level=logging.INFO)
logger.info('Started')
mylib.do_something()
logger.info('Finished')
if __name__ == '__main__':
main()
# mylib.py
import logging
logger = logging.getLogger(__name__)
def do_something():
logger.info('Doing something')
Om du kör myapp.py bör du se detta i myapp.log:
INFO:__main__:Startade
INFO:mylib:Gör något
INFO:__main__:Avslutad
Den viktigaste egenskapen hos denna idiomatiska användning är att majoriteten av koden helt enkelt skapar en logger på modulnivå med getLogger(__name__)
och använder den loggern för att göra all nödvändig loggning. Detta är kortfattat, samtidigt som det tillåter nedströmskod finkornig kontroll om det behövs. Loggade meddelanden till loggern på modulnivå vidarebefordras till hanterare av loggrar i moduler på högre nivåer, hela vägen upp till loggern på högsta nivå, känd som rotloggern; detta tillvägagångssätt kallas hierarkisk loggning.
För att loggning ska vara användbar måste den konfigureras: ange nivåer och destinationer för varje logger, eventuellt ändra hur specifika moduler loggar, ofta baserat på kommandoradsargument eller programkonfiguration. I de flesta fall, som i fallet ovan, är det bara rotloggaren som behöver konfigureras på detta sätt, eftersom alla loggar på lägre nivåer på modulnivå i slutändan vidarebefordrar sina meddelanden till dess hanterare. basicConfig()
ger ett snabbt sätt att konfigurera rotloggaren som hanterar många användningsfall.
Modulen ger mycket funktionalitet och flexibilitet. Om du inte är bekant med loggning är det bästa sättet att komma igång att titta på handledningarna (se länkarna ovan och till höger).
De grundläggande klasser som definieras av modulen, tillsammans med deras attribut och metoder, listas i avsnitten nedan.
Loggar exponerar det gränssnitt som applikationskoden använder direkt.
Hanterare skickar loggposter (som skapats av loggar) till lämplig destination.
Filter ger en mer finfördelad möjlighet att bestämma vilka loggposter som ska matas ut.
Formatterare specificerar layouten för loggposter i den slutliga utskriften.
Logger-objekt¶
Loggrar har följande attribut och metoder. Observera att loggar ALDRIG ska instansieras direkt, utan alltid genom funktionen logging.getLogger(name)
på modulnivå. Flera anrop till getLogger()
med samma namn kommer alltid att returnera en referens till samma Logger-objekt.
Namnet kan vara ett periodseparerat hierarkiskt värde, t.ex. ”foo.bar.baz” (men det kan också vara bara ”foo”, till exempel). Loggar som ligger längre ner i den hierarkiska listan är barn till loggar högre upp i listan. Om du till exempel har en logger med namnet foo
, är loggrar med namnen foo.bar
, foo.bar.baz
och foo.bam
alla ättlingar till foo
. Dessutom är alla loggrar ättlingar till rotloggaren. Loggarnas namnhierarki är analog med Pythons pakethierarki, och identisk med den om du organiserar dina loggar per modul med hjälp av den rekommenderade konstruktionen logging.getLogger(__name__)
. Det beror på att i en modul är __name__
modulens namn i Python-paketets namnrymd.
- class logging.Logger¶
- name¶
Detta är loggarens namn och är det värde som skickades till
getLogger()
för att hämta loggern.Anteckning
Detta attribut bör behandlas som skrivskyddat.
- level¶
Tröskelvärdet för denna logger, som anges med metoden
setLevel()
.Anteckning
Ställ inte in detta attribut direkt - använd alltid
setLevel()
, som kontrollerar den nivå som skickas till den.
- parent¶
Den här loggarens överordnade logger. Den kan ändras beroende på senare instansiering av loggrar som ligger högre upp i namnrymdshierarkin.
Anteckning
Detta värde bör behandlas som skrivskyddat.
- propagate¶
Om detta attribut utvärderas till true, kommer händelser som loggas i denna logger att skickas till hanterare av loggrar på högre nivå (förfäder), utöver eventuella hanterare som är kopplade till denna logger. Meddelanden skickas direkt till de överordnade loggarnas hanterare - varken nivån eller filtren för de överordnade loggarna i fråga beaktas.
Om detta utvärderas till false, skickas inte loggarnas meddelanden till hanterarna av förfädernas loggar.
Stava ut det med ett exempel: Om propagate-attributet för loggern med namnet
A.B.C
utvärderas till true, kommer alla händelser som loggas tillA.B.C
via ett metodanrop somlogging.getLogger('A.B.C').error(...)
[med förbehåll för att loggarens nivå- och filterinställningar passerar] att i sin tur passera till alla hanterare som är kopplade till loggar med namnenA.B
,A
och rotloggern, efter att först ha passerat till alla hanterare som är kopplade tillA.B.C
. Om någon logger i kedjanA.B.C
,A.B
,A
har sittpropagate
-attribut satt till false, så är det den sista loggern vars hanterare erbjuds händelsen att hantera, och spridningen stoppas vid den punkten.Konstruktören sätter detta attribut till
True
.Anteckning
Om du kopplar en hanterare till en logger och en eller flera av dess förfäder kan det hända att den skickar ut samma post flera gånger. I allmänhet behöver du inte koppla en hanterare till mer än en logger - om du bara kopplar den till den lämpliga logger som är högst upp i loggerhierarkin kommer den att se alla händelser som loggas av alla loggrar i nedstigande led, förutsatt att deras propagate-inställning är inställd på
True
. Ett vanligt scenario är att bifoga hanterare endast till rotloggaren och låta spridningen ta hand om resten.
- handlers¶
Listan över handläggare som är direkt kopplade till denna loggerinstans.
Anteckning
Detta attribut bör behandlas som skrivskyddat; det ändras normalt via metoderna
addHandler()
ochremoveHandler()
, som använder lås för att säkerställa trådsäker drift.
- disabled¶
Detta attribut inaktiverar hantering av alla händelser. Det sätts till
False
i initialiseraren och ändras endast genom konfigurationskod för loggning.Anteckning
Detta attribut bör behandlas som skrivskyddat.
- setLevel(level)¶
Sätter tröskelvärdet för denna logger till level. Loggmeddelanden som är mindre allvarliga än level ignoreras; loggmeddelanden som har allvarlighetsgrad level eller högre kommer att skickas ut av den eller de hanterare som betjänar denna logger, såvida inte hanterarens nivå har ställts in på en högre allvarlighetsgrad än level.
När en logger skapas sätts nivån till
NOTSET
(vilket gör att alla meddelanden behandlas när loggern är rotlogger, eller delegeras till föräldern när loggern är en icke-rotlogger). Observera att rotloggaren skapas med nivånWARNING
.Termen ”delegering till överordnad” innebär att om en logger har nivån NOTSET, genomkorsas dess kedja av överordnade loggrar tills antingen en överordnad med en annan nivå än NOTSET hittas eller roten nås.
Om en förfader hittas med en annan nivå än NOTSET, behandlas den förfaderns nivå som den effektiva nivån för den logger där förfaderssökningen började och används för att avgöra hur en logghändelse ska hanteras.
Om roten nås och den har en nivå på NOTSET kommer alla meddelanden att behandlas. I annat fall kommer rotens nivå att användas som effektiv nivå.
Se Loggningsnivåer för en lista över nivåer.
Ändrad i version 3.2: Parametern level accepterar nu en strängrepresentation av nivån, t.ex. ’INFO’, som ett alternativ till heltalskonstanter som
INFO
. Observera dock att nivåer lagras internt som heltal, och metoder som t.ex.getEffectiveLevel()
ochisEnabledFor()
returnerar/förväntar sig att få heltal skickade till sig.
- isEnabledFor(level)¶
Anger om ett meddelande med allvarlighetsgrad level skulle behandlas av denna logger. Den här metoden kontrollerar först nivån på modulnivå som anges av
logging.disable(level)
och sedan loggarens effektiva nivå som bestäms avgetEffectiveLevel()
.
- getEffectiveLevel()¶
Anger den effektiva nivån för denna logger. Om ett annat värde än
NOTSET
har angetts medsetLevel()
, returneras det. I annat fall genomkorsas hierarkin mot roten tills ett annat värde änNOTSET
hittas, och det värdet returneras. Värdet som returneras är ett heltal, vanligtvis ett avlogging.DEBUG
,logging.INFO
etc.
- getChild(suffix)¶
Returnerar en logger som är en ättling till denna logger, vilket bestäms av suffixet. Således skulle
logging.getLogger('abc').getChild('def.ghi')
returnera samma logger som skulle returneras avlogging.getLogger('abc.def.ghi')
. Detta är en bekvämlighetsmetod som är användbar när den överordnade loggern namnges med t.ex.__name__
i stället för en bokstavlig sträng.Tillagd i version 3.2.
- getChildren()¶
Returnerar en uppsättning loggrar som är omedelbara barn till denna logger. Så till exempel kan
logging.getLogger().getChildren()
returnera en uppsättning som innehåller loggrar med namnenfoo
ochbar
, men en logger med namnetfoo.bar
skulle inte ingå i uppsättningen. På samma sätt kanlogging.getLogger('foo').getChildren()
returnera en uppsättning som innehåller en logger med namnetfoo.bar
, men den skulle inte innehålla en med namnetfoo.bar.baz
.Tillagd i version 3.12.
- debug(msg, *args, **kwargs)¶
Loggar ett meddelande med nivån
DEBUG
på den här loggern. msg är meddelandets formatsträng och args är de argument som slås samman till msg med hjälp av strängformateringsoperatorn. (Observera att detta innebär att du kan använda nyckelord i formatsträngen tillsammans med ett enda ordboksargument) Ingen % formatering utförs på msg när inga args anges.Det finns fyra nyckelordsargument i kwargs som inspekteras: exc_info, stack_info, stacklevel och extra.
Om exc_info inte utvärderas som false, läggs information om undantaget till i loggmeddelandet. Om en undantagstupel (i det format som returneras av
sys.exc_info()
) eller en undantagsinstans tillhandahålls, används den; annars anropassys.exc_info()
för att hämta undantagsinformationen.Det andra valfria nyckelordsargumentet är stack_info, som har standardvärdet
False
. Om det är sant läggs stackinformation till i loggmeddelandet, inklusive det faktiska loggningsanropet. Observera att detta inte är samma stackinformation som den som visas om du anger exc_info: Den förstnämnda är stapelramar från botten av stacken fram till loggningsanropet i den aktuella tråden, medan den sistnämnda är information om stapelramar som har rullats upp efter ett undantag när man söker efter undantagshanterare.Du kan ange stack_info oberoende av exc_info, t.ex. om du bara vill visa hur du kom till en viss punkt i din kod, även om inga undantag uppstod. Stackramarna skrivs ut efter en rubrikrad som säger:
Stack (senaste anropet senast):
Detta efterliknar
Traceback (most recent call last):
som används vid visning av undantagsramar.Det tredje valfria nyckelordsargumentet är stacklevel, som har standardvärdet
1
. Om det är större än 1 hoppas motsvarande antal stack frames över vid beräkning av radnummer och funktionsnamn som anges iLogRecord
som skapats för loggningshändelsen. Detta kan användas i hjälpfunktioner för loggning så att det funktionsnamn, filnamn och radnummer som registreras inte är information för hjälpfunktionen/metoden, utan för den som anropar den. Namnet på denna parameter speglar motsvarande parameter i modulenwarnings
.Det fjärde nyckelordsargumentet är extra som kan användas för att skicka en ordbok som används för att fylla i
__dict__
iLogRecord
som skapats för loggningshändelsen med användardefinierade attribut. Dessa anpassade attribut kan sedan användas som du vill. De kan t.ex. införlivas i loggade meddelanden. Till exempel:FORMAT = '%(asctime)s %(clientip)-15s %(user)-8s %(message)s' logging.basicConfig(format=FORMAT) d = {'clientip': '192.168.0.1', 'user': 'fbloggs'} logger = logging.getLogger('tcpserver') logger.warning('Protocol problem: %s', 'connection reset', extra=d)
skulle skriva ut något i stil med
2006-02-08 22:20:02,165 192.168.0.1 fbloggs Protocol problem: connection reset
Nycklarna i den ordbok som skickas till extra får inte krocka med de nycklar som används av loggningssystemet. (Se avsnittet om LogRecord-attribut för mer information om vilka nycklar som används av loggningssystemet)
Om du väljer att använda dessa attribut i loggade meddelanden måste du vara lite försiktig. I exemplet ovan har t.ex.
Formatter
konfigurerats med en formatsträng som förväntar sig att ’clientip’ och ’user’ finns i attributordlistan förLogRecord
. Om dessa saknas kommer meddelandet inte att loggas eftersom ett undantag för strängformatering inträffar. Så i det här fallet måste du alltid skicka den extra ordlistan med dessa nycklar.Även om detta kan vara irriterande är den här funktionen avsedd att användas under speciella omständigheter, t.ex. flertrådade servrar där samma kod körs i många sammanhang och intressanta villkor som uppstår är beroende av detta sammanhang (t.ex. fjärrklientens IP-adress och autentiserat användarnamn i exemplet ovan). Under sådana omständigheter är det troligt att specialiserade
Formatter
s skulle användas med särskildaHandler
s.Om ingen hanterare är kopplad till denna logger (eller någon av dess förfäder, med hänsyn till relevanta
Logger.propagate
-attribut), kommer meddelandet att skickas till den hanterare som är inställd pålastResort
.Ändrad i version 3.2: Parametern stack_info har lagts till.
Ändrad i version 3.5: Parametern exc_info kan nu acceptera undantagsinstanser.
Ändrad i version 3.8: Parametern stacklevel har lagts till.
- info(msg, *args, **kwargs)¶
Loggar ett meddelande med nivå
INFO
på denna logger. Argumenten tolkas som fördebug()
.
- warning(msg, *args, **kwargs)¶
Loggar ett meddelande med nivå
WARNING
på denna logger. Argumenten tolkas som fördebug()
.Anteckning
Det finns en föråldrad metod
warn
som är funktionellt identisk medwarning
. Eftersomwarn
är föråldrad, använd den inte - användwarning
istället.
- error(msg, *args, **kwargs)¶
Loggar ett meddelande med nivån
ERROR
på denna logger. Argumenten tolkas som fördebug()
.
- critical(msg, *args, **kwargs)¶
Loggar ett meddelande med nivå
CRITICAL
på denna logger. Argumenten tolkas som fördebug()
.
- log(level, msg, *args, **kwargs)¶
Loggar ett meddelande med heltalsnivån level på denna logger. De andra argumenten tolkas som för
debug()
.
- exception(msg, *args, **kwargs)¶
Loggar ett meddelande med nivån
ERROR
på denna logger. Argumenten tolkas som fördebug()
. Undantagsinformation läggs till i logningsmeddelandet. Denna metod bör endast anropas från en undantagshanterare.
- addFilter(filter)¶
Lägger till det angivna filtret filter till denna logger.
- removeFilter(filter)¶
Tar bort det angivna filtret filter från den här loggern.
- filter(record)¶
Tillämpa denna loggers filter på posten och returnera
True
om posten ska behandlas. Filtren konsulteras i tur och ordning tills ett av dem returnerar ett falskt värde. Om inget av dem returnerar ett falskt värde kommer posten att behandlas (skickas till handläggare). Om ett filter returnerar ett falskt värde sker ingen ytterligare behandling av posten.
- addHandler(hdlr)¶
Lägger till den angivna hanteraren hdlr till denna logger.
- removeHandler(hdlr)¶
Tar bort den angivna hanteraren hdlr från denna logger.
- findCaller(stack_info=False, stacklevel=1)¶
Hittar anroparens källfilnamn och radnummer. Returnerar filnamn, radnummer, funktionsnamn och stackinformation som en tupel med 4 element. Stackinformationen returneras som
None
om inte stack_info ärTrue
.Parametern stacklevel skickas från kod som anropar
debug()
och andra API:er. Om den är större än 1 används överskottet för att hoppa över stackrutor innan man bestämmer vilka värden som ska returneras. Detta är i allmänhet användbart när loggnings-API:er anropas från hjälp-/omslagskod, så att informationen i händelseloggen inte hänvisar till hjälp-/omslagskoden utan till den kod som anropar den.
- handle(record)¶
Hanterar en post genom att skicka den till alla hanterare som är associerade med denna logger och dess förfäder (tills ett falskt värde för propagate hittas). Den här metoden används för obehandlade poster som tas emot från ett uttag, samt för poster som skapas lokalt. Filtrering på loggarnivå görs med
filter()
.
- makeRecord(name, level, fn, lno, msg, args, exc_info, func=None, extra=None, sinfo=None)¶
Detta är en fabriksmetod som kan åsidosättas i underklasser för att skapa specialiserade
LogRecord
-instanser.
- hasHandlers()¶
Kontrollerar om denna logger har några hanterare konfigurerade. Detta görs genom att leta efter hanterare i den här loggern och dess föräldrar i loggerhierarkin. Returnerar
True
om en hanterare hittades, annarsFalse
. Metoden slutar att söka uppåt i hierarkin när en logger med attributet ’propagate’ inställt på false hittas - det blir den sista loggern som kontrolleras för förekomsten av hanterare.Tillagd i version 3.2.
Ändrad i version 3.7: Skogshuggare kan nu bli inlagda och oinlagda.
Loggningsnivåer¶
De numeriska värdena för loggningsnivåerna anges i följande tabell. Dessa är främst intressanta om du vill definiera dina egna nivåer och vill att de ska ha specifika värden i förhållande till de fördefinierade nivåerna. Om du definierar en nivå med samma numeriska värde, skriver den över det fördefinierade värdet; det fördefinierade namnet försvinner.
Nivå |
Numeriskt värde |
Vad det betyder / När det ska användas |
---|---|---|
|
0 |
När den är inställd på en logger indikerar den att föregående loggar ska konsulteras för att bestämma den effektiva nivån. Om detta fortfarande resulterar i |
|
10 |
Detaljerad information som vanligtvis bara är av intresse för en utvecklare som försöker diagnostisera ett problem. |
|
20 |
Bekräftelse på att saker och ting fungerar som förväntat. |
|
30 |
En indikation på att något oväntat har hänt eller att ett problem kan uppstå inom en snar framtid (t.ex. ”lågt diskutrymme”). Programvaran fungerar fortfarande som förväntat. |
|
40 |
På grund av ett mer allvarligt problem har programvaran inte kunnat utföra någon funktion. |
|
50 |
Ett allvarligt fel som indikerar att själva programmet kanske inte kan fortsätta att köras. |
Handläggarobjekt¶
Hanterare har följande attribut och metoder. Observera att Handler
aldrig instansieras direkt; denna klass fungerar som en bas för mer användbara subklasser. Metoden __init__()
i underklasser måste dock anropa Handler.__init__()
.
- class logging.Handler¶
- __init__(level=NOTSET)¶
Initialiserar
Handler
-instansen genom att ange dess nivå, ange listan med filter till den tomma listan och skapa ett lås (medcreateLock()
) för serialisering av åtkomst till en I/O-mekanism.
- createLock()¶
Initialiserar ett trådlås som kan användas för att serialisera åtkomst till underliggande I/O-funktionalitet som kanske inte är trådsäker.
- acquire()¶
Förvärvar det trådlås som skapats med
createLock()
.
- setLevel(level)¶
Sätter tröskelvärdet för denna hanterare till level. Loggmeddelanden som är mindre allvarliga än level ignoreras. När en hanterare skapas sätts nivån till
NOTSET
(vilket gör att alla meddelanden behandlas).Se Loggningsnivåer för en lista över nivåer.
Ändrad i version 3.2: Parametern level accepterar nu en strängrepresentation av nivån, t.ex. ’INFO’, som ett alternativ till heltalskonstanter, t.ex.
INFO
.
- setFormatter(fmt)¶
Ställer in formateraren för denna hanterare till fmt. Argumentet fmt måste vara en instans av
Formatter
ellerNone
.
- addFilter(filter)¶
Lägger till det angivna filtret filter till denna hanterare.
- removeFilter(filter)¶
Tar bort det angivna filtret filter från den här hanteraren.
- filter(record)¶
Tillämpa den här hanterarens filter på posten och returnera
True
om posten ska behandlas. Filtren konsulteras i tur och ordning tills ett av dem returnerar ett falskt värde. Om inget av dem returnerar ett falskt värde kommer posten att sändas ut. Om ett av filtren returnerar ett falskt värde, kommer hanteraren inte att skicka ut posten.
- flush()¶
Säkerställ att all loggningsutdata har rensats. Den här versionen gör ingenting och är avsedd att implementeras av underklasser.
- close()¶
Städa upp alla resurser som används av hanteraren. Den här versionen gör ingen utmatning men tar bort hanteraren från en intern karta över hanterare, som används för att söka efter hanterare med namn.
Subklasser bör se till att detta anropas från åsidosatta
close()
-metoder.
- handle(record)¶
Sänder villkorligt ut den angivna loggningsposten, beroende på filter som kan ha lagts till i hanteraren. Omsluter den faktiska utsändningen av posten med förvärv/lösen av I/O-trådens lås.
- handleError(record)¶
Denna metod bör anropas från hanterare när ett undantag inträffar under ett anrop av
emit()
. Om modulnivåattributetraiseExceptions
ärFalse
, ignoreras undantag i tysthet. Detta är vad som oftast önskas för ett loggningssystem - de flesta användare kommer inte att bry sig om fel i loggningssystemet, de är mer intresserade av applikationsfel. Du kan dock ersätta detta med en anpassad hanterare om du vill. Den angivna posten är den som höll på att bearbetas när undantaget inträffade. (Standardvärdet förraiseExceptions
ärTrue
, eftersom det är mer användbart under utveckling).
- format(record)¶
Gör formatering för en post - om en formaterare är inställd, använd den. Annars används standardformateringen för modulen.
- emit(record)¶
Gör vad som krävs för att faktiskt logga den angivna loggningsposten. Denna version är avsedd att implementeras av underklasser och ger därför upphov till ett
NotImplementedError
.Varning
Denna metod anropas efter att ett lås på hanterarnivå har förvärvats, vilket frigörs efter att denna metod returneras. När du åsidosätter den här metoden, observera att du bör vara försiktig när du anropar något som anropar andra delar av loggnings-API:t som kan göra låsning, eftersom det kan leda till ett dödläge. Specifikt för detta:
API:er för loggningskonfiguration förvärvar låset på modulnivå och sedan lås på individuell hanterarnivå när dessa hanterare konfigureras.
Många API:er för loggning låser låset på modulnivå. Om ett sådant API anropas från den här metoden kan det orsaka ett dödläge om ett konfigurationsanrop görs i en annan tråd, eftersom den tråden kommer att försöka förvärva låset på modulnivå före låset på hanterarnivå, medan den här tråden försöker förvärva låset på modulnivå efter låset på hanterarnivå (eftersom låset på hanterarnivå redan har förvärvats i den här metoden).
För en lista över de handlers som ingår som standard, se logging.handlers
.
Formateringsobjekt¶
- class logging.Formatter(fmt=None, datefmt=None, style='%', validate=True, *, defaults=None)¶
Ansvarig för att omvandla en
LogRecord
till en utdatasträng som kan tolkas av en människa eller ett externt system.- Parametrar:
fmt (str) – En formatsträng i den angivna stilen för den loggade utdata som helhet. De möjliga mappningsnycklarna hämtas från
LogRecord
-objektets LogRecord-attribut. Om inget anges används'%(message)s'
, vilket bara är det loggade meddelandet.datefmt (str) – En formatsträng i den angivna stilen för datum/tid-delen av den loggade utdata. Om inget anges används standardvärdet som beskrivs i
formatTime()
.style (str) – Kan vara en av
'%'
,'{'
eller'$'
och bestämmer hur formatsträngen ska slås samman med dess data: med hjälp av en av strängformatering i stil med printf (%
),str.format()
({
) ellerstring.Template
($
). Detta gäller endast för fmt och datefmt (t.ex.'%(message)s'
jämfört med'{message}'
), inte för de faktiska loggmeddelanden som skickas till loggmetoderna. Det finns dock andra sätt att använda{
- och$
-formatering för loggmeddelanden.validate (bool) – Om
True
(standard) kommer felaktig eller ej matchande fmt och style att ge upphov till ettValueError
; till exempellogging.Formatter('%(asctime)s - %(message)s', style='{')
.defaults (dict[str, Any]) – En ordbok med standardvärden som ska användas i anpassade fält. Till exempel
logging.Formatter('%(ip)s %(message)s', defaults={"ip": None})
Ändrad i version 3.2: Lagt till parametern style.
Ändrad i version 3.8: Lagt till parametern validate.
Ändrad i version 3.10: Parametern defaults har lagts till.
- format(record)¶
Postens attributordbok används som operand i en strängformateringsoperation. Returnerar den resulterande strängen. Innan ordlistan formateras utförs ett par förberedande steg. Attributet message för posten beräknas med hjälp av msg % args. Om formateringssträngen innehåller
'(asctime)'
, anropasformatTime()
för att formatera händelsetiden. Om det finns undantagsinformation formateras den medformatException()
och läggs till i meddelandet. Observera att den formaterade undantagsinformationen cachelagras i attributet exc_text. Detta är användbart eftersom undantagsinformationen kan plockas ut och skickas över kabeln, men du bör vara försiktig om du har mer än enFormatter
-underklass som anpassar formateringen av undantagsinformation. I så fall måste du rensa det cachade värdet (genom att sätta attributet exc_text tillNone
) efter att en formaterare har gjort sin formatering, så att nästa formaterare som hanterar händelsen inte använder det cachade värdet, utan räknar om det på nytt.Om stackinformation finns tillgänglig läggs den till efter undantagsinformationen, med hjälp av
formatStack()
för att omvandla den vid behov.
- formatTime(record, datefmt=None)¶
Denna metod bör anropas från
format()
av en formaterare som vill använda en formaterad tid. Denna metod kan åsidosättas i formaterare för att tillgodose specifika krav, men det grundläggande beteendet är följande: om datefmt (en sträng) anges, används den medtime.strftime()
för att formatera skapelsetiden för posten. Annars används formatet ’%Y-%m-%d %H:%M:%S,uuu’, där uuu-delen är ett millisekundvärde och de andra bokstäverna är enligt dokumentationen förtime.strftime()
. Ett exempel på tid i detta format är2003-01-23 00:29:50,411
. Den resulterande strängen returneras.Denna funktion använder en användarkonfigurerbar funktion för att konvertera skapelsetiden till en tupel. Som standard används
time.localtime()
; för att ändra detta för en viss formateringsinstans, ställ in attributetconverter
till en funktion med samma signatur somtime.localtime()
ellertime.gmtime()
. Om du vill ändra detta för alla formaterare, t.ex. om du vill att alla loggningstider ska visas i GMT, anger du attributetconverter
i klassenFormatter
.Ändrad i version 3.3: Tidigare var standardformatet hårdkodat som i det här exemplet:
2010-09-06 22:38:15,292
där delen före kommatecknet hanteras av en strptime-formatsträng ('%Y-%m-%d %H:%M:%S'
) och delen efter kommatecknet är ett millisekundvärde. Eftersom strptime inte har någon formatplatshållare för millisekunder läggs millisekundvärdet till med hjälp av en annan formatsträng,'%s,%03d'
— och båda dessa formatsträngar har varit hårdkodade i den här metoden. I och med ändringen definieras dessa strängar som attribut på klassnivå som kan åsidosättas på instansnivå när så önskas. Namnen på attributen ärdefault_time_format
(för strptime-formatsträngen) ochdefault_msec_format
(för att lägga till millisekundvärdet).Ändrad i version 3.9: Standard_msec_format kan vara ”ingen”.
- formatException(exc_info)¶
Formaterar den angivna undantagsinformationen (en standardtupel för undantag som returneras av
sys.exc_info()
) som en sträng. Denna standardimplementering använder baratraceback.print_exception()
. Den resulterande strängen returneras.
- formatStack(stack_info)¶
Formaterar den angivna stackinformationen (en sträng som returneras av
traceback.print_stack()
, men med den sista nya raden borttagen) som en sträng. Denna standardimplementering returnerar bara inmatningsvärdet.
- class logging.BufferingFormatter(linefmt=None)¶
En basformateringsklass som lämpar sig för underklassning när du vill formatera ett antal poster. Du kan skicka en
Formatter
-instans som du vill använda för att formatera varje rad (som motsvarar en enda post). Om inget anges används standardformateraren (som bara matar ut händelsemeddelandet) som radformaterare.- formatHeader(records)¶
Returnerar ett sidhuvud för en lista med poster. Basimplementeringen returnerar bara den tomma strängen. Du måste åsidosätta den här metoden om du vill ha ett specifikt beteende, t.ex. om du vill visa antalet poster, en titel eller en separationsrad.
Returnerar en sidfot för en lista med poster. Basimplementeringen returnerar bara den tomma strängen. Du måste åsidosätta den här metoden om du vill ha ett specifikt beteende, t.ex. om du vill visa antalet poster eller en separationsrad.
- format(records)¶
Returnerar formaterad text för en lista med poster. Basimplementeringen returnerar bara den tomma strängen om det inte finns några poster; annars returneras konkateneringen av rubriken, varje post som formaterats med radformateraren och sidfoten.
Filtrera objekt¶
Filters
kan användas av Handlers
och Loggers
för mer sofistikerad filtrering än vad som tillhandahålls av levels. Basfilterklassen tillåter endast händelser som ligger under en viss punkt i loggerhierarkin. Exempelvis kommer ett filter som initieras med ”A.B” att tillåta händelser som loggas av loggrarna ”A.B”, ”A.B.C”, ”A.B.C.D”, ”A.B.D” etc. men inte ”A.BB”, ”B.A.B” etc. Om den initieras med en tom sträng skickas alla händelser vidare.
- class logging.Filter(name='')¶
Returnerar en instans av klassen
Filter
. Om name anges, namnges en logger som, tillsammans med sina underordnade loggar, kommer att få sina händelser tillåtna genom filtret. Om name är en tom sträng tillåts alla händelser.- filter(record)¶
Ska den angivna posten loggas? Returnerar false för nej, true för ja. Filter kan antingen ändra loggposter på plats eller returnera en helt annan postinstans som kommer att ersätta den ursprungliga loggposten vid framtida behandling av händelsen.
Observera att filter som är kopplade till hanterare konsulteras innan en händelse sänds ut av hanteraren, medan filter som är kopplade till loggrar konsulteras när en händelse loggas (med debug()
, info()
, etc.), innan en händelse skickas till hanterare. Detta innebär att händelser som har genererats av loggar i nedstigande led inte filtreras av en loggers filterinställning, såvida inte filtret också har tillämpats på dessa loggar i nedstigande led.
Du behöver faktiskt inte underklassa Filter
: du kan skicka vilken instans som helst som har en filter
-metod med samma semantik.
Ändrad i version 3.2: Du behöver inte skapa specialiserade Filter
-klasser eller använda andra klasser med en filter
-metod: du kan använda en funktion (eller annan anropsbar) som ett filter. Filtreringslogiken kommer att kontrollera om filterobjektet har ett filter
-attribut: om det gör det, antas det vara ett Filter
och dess filter()
-metod anropas. Annars antas den vara en callable och anropas med posten som enda parameter. Det returnerade värdet bör överensstämma med det som returneras av filter()
.
Ändrad i version 3.12: Du kan nu returnera en LogRecord
-instans från filter för att ersätta loggposten i stället för att modifiera den på plats. Detta gör att filter som är kopplade till en Handler
kan modifiera loggposten innan den sänds ut, utan att det får bieffekter på andra handlers.
Även om filter främst används för att filtrera poster baserat på mer sofistikerade kriterier än nivåer, får de se varje post som bearbetas av den hanterare eller logger de är kopplade till: detta kan vara användbart om du vill göra saker som att räkna hur många poster som bearbetades av en viss logger eller hanterare, eller lägga till, ändra eller ta bort attribut i LogRecord
som bearbetas. Självklart måste ändring av LogRecord göras med viss försiktighet, men det gör det möjligt att injicera kontextuell information i loggar (se Använda filter för att ge kontextuell information).
LogRecord-objekt¶
LogRecord
-instanser skapas automatiskt av Logger
varje gång något loggas, och kan skapas manuellt via makeLogRecord()
(t.ex. från en inlagd händelse som tas emot över kabeln).
- class logging.LogRecord(name, level, pathname, lineno, msg, args, exc_info, func=None, sinfo=None)¶
Innehåller all information som är relevant för den händelse som loggas.
Den primära informationen skickas i msg och args, som kombineras med hjälp av
msg % args
för att skapa attributetmessage
för posten.- Parametrar:
name (str) – Namnet på den logger som används för att logga den händelse som representeras av denna
LogRecord
. Observera att loggarens namn iLogRecord
alltid kommer att ha detta värde, även om det kan sändas ut av en hanterare som är kopplad till en annan (förfaderlig) logger.level (int) – Den numeriska nivån för logghändelsen (till exempel
10
förDEBUG
,20
förINFO
, etc). Observera att detta konverteras till två attribut i LogRecord:levelno
för det numeriska värdet ochlevelname
för motsvarande nivånamn.pathname (str) – Den fullständiga sökvägen till källfilen där loggningsanropet gjordes.
lineno (int) – Radnumret i källfilen där loggningsanropet gjordes.
msg (Any) – Händelsebeskrivningsmeddelandet, som kan vara en %-format sträng med platshållare för variabeldata, eller ett godtyckligt objekt (se Använda godtyckliga objekt som meddelanden).
args (tuple | dict[str, Any]) – Variabel data som ska sammanfogas med msg-argumentet för att få en beskrivning av händelsen.
exc_info (tuple[type[BaseException], BaseException, types.TracebackType] | None) – En exception-tupel med aktuell exceptioninformation, som returneras av
sys.exc_info()
, ellerNone
om ingen exceptioninformation finns tillgänglig.func (str | None) – Namnet på den funktion eller metod från vilken anropet för loggning gjordes.
sinfo (str | None) – En textsträng som representerar stackinformation från stackens bas i den aktuella tråden, fram till loggningsanropet.
- getMessage()¶
Returnerar meddelandet för denna
LogRecord
-instans efter att ha slagit samman eventuella användartillhandahållna argument med meddelandet. Om det användartillhandahållna meddelandeargumentet till loggningsanropet inte är en sträng, anropasstr()
för att konvertera det till en sträng. Detta gör det möjligt att använda användardefinierade klasser som meddelanden, vars metod__str__
kan returnera den faktiska formatsträng som ska användas.
Ändrad i version 3.2: Skapandet av en
LogRecord
har gjorts mer konfigurerbar genom att tillhandahålla en fabrik som används för att skapa posten. Fabriken kan ställas in med hjälp avgetLogRecordFactory()
ochsetLogRecordFactory()
(se detta för fabrikens signatur).Denna funktionalitet kan användas för att injicera dina egna värden i en
LogRecord
vid skapandet. Du kan använda följande mönster:old_factory = loggning.getLogRecordFactory() def record_factory(*args, **kwargs): record = old_factory(*args, **kwargs) record.custom_attribute = 0xdecafbad returnera record logging.setLogRecordFactory(record_factory)
Med detta mönster kan flera fabriker kedjas, och så länge de inte skriver över varandras attribut eller oavsiktligt skriver över standardattributen som anges ovan, bör det inte finnas några överraskningar.
LogRecord-attribut¶
LogRecord har ett antal attribut, varav de flesta härleds från parametrarna till konstruktören. (Observera att namnen inte alltid överensstämmer exakt mellan parametrarna i LogRecord-konstruktören och LogRecord-attributen) Dessa attribut kan användas för att sammanfoga data från posten till formatsträngen. I följande tabell listas (i alfabetisk ordning) attributnamnen, deras betydelser och motsvarande platshållare i en %-style-formatsträng.
Om du använder {}-formatering (str.format()
) kan du använda {attrname}
som platshållare i formatsträngen. Om du använder $-formatering (string.Template
), använd formen ${attrname}
. I båda fallen ska du naturligtvis ersätta attrname
med det faktiska attributnamn som du vill använda.
När det gäller {}-formatering kan du ange formateringsflaggor genom att placera dem efter attributnamnet, åtskilda från det med ett kolon. Till exempel: en platshållare på {msecs:03.0f}
skulle formatera ett millisekundvärde på 4
som 004
. Se str.format()
-dokumentationen för fullständig information om de alternativ som finns tillgängliga för dig.
Attribut namn |
Format |
Beskrivning |
---|---|---|
args |
Du ska inte behöva formatera detta själv. |
Den tupel av argument som sammanfogas i |
asctime |
|
Humanläsbar tid när |
skapad |
|
Tidpunkt då |
exc_info |
Du ska inte behöva formatera detta själv. |
Exception tuple (à la |
filnamn |
|
Filnamnsdelen av |
funcNamn |
|
Namn på den funktion som innehåller loggningsanropet. |
nivånamn |
|
Textloggningsnivå för meddelandet ( |
nivåno |
|
Numerisk loggningsnivå för meddelandet ( |
lineno |
|
Källans radnummer där loggningsanropet utfärdades (om tillgängligt). |
Typ av meddelande |
|
Det loggade meddelandet, beräknat som |
modul |
|
Modul (namndelen av |
msecs |
|
Millisekund-del av tiden när |
msg |
Du ska inte behöva formatera detta själv. |
Den formatsträng som skickades i det ursprungliga loggningsanropet. Sammanslagen med |
namn |
|
Namn på den logger som används för att logga samtalet. |
sökvägsnamn |
|
Fullständigt sökvägsnamn för källfilen där loggningsanropet gjordes (om tillgängligt). |
process |
|
Process-ID (om tillgängligt). |
processnamn |
|
Processnamn (om tillgängligt). |
relativt skapad |
|
Tid i millisekunder när LogRecord skapades, i förhållande till den tidpunkt då loggmodulen laddades. |
stack_info |
Du ska inte behöva formatera detta själv. |
Stack frame-information (om sådan finns) från botten av stacken i den aktuella tråden, till och med stack frame för det logganrop som resulterade i att denna post skapades. |
tråd |
|
Tråd-ID (om tillgängligt). |
trådnamn |
|
Trådnamn (om tillgängligt). |
uppgiftsnamn |
|
|
Ändrad i version 3.1: processName har lagts till.
Ändrad i version 3.12: taskName lades till.
LoggerAdapter-objekt¶
LoggerAdapter
-instanser används för att enkelt skicka kontextuell information till loggningsanrop. Ett exempel på användning finns i avsnittet om Lägga till kontextuell information i loggningsutdata.
- class logging.LoggerAdapter(logger, extra, merge_extra=False)¶
Returnerar en instans av
LoggerAdapter
som initierats med en underliggande instans avLogger
, ett diktliknande objekt (extra) och ett boolean (merge_extra) som anger om extra-argumentet för enskilda logganrop ska slås samman medLoggerAdapter
extra eller inte. Standardbeteendet är att ignorera extra-argumentet för enskilda logganrop och endast använda det som finns iLoggerAdapter
-instansen- process(msg, kwargs)¶
Ändrar argumenten för meddelande och/eller nyckelord som skickas till ett loggningsanrop för att infoga kontextuell information. Denna implementation tar det objekt som skickas som extra till konstruktören och lägger till det i kwargs med nyckeln ’extra’. Returvärdet är en (msg, kwargs) tupel som innehåller (eventuellt modifierade) versioner av de argument som skickats in.
- manager¶
Delegerar till den underliggande
manager
på logger.
- _log¶
Delegerar till den underliggande
_log()
-metoden på logger.
Utöver ovanstående stöder
LoggerAdapter
följande metoder iLogger
:debug()
,info()
,warning()
,error()
,exception()
,critical()
,log()
,isEnabledFor()
,getEffectiveLevel()
,setLevel()
ochhasHandlers()
. Dessa metoder har samma signaturer som sina motsvarigheter iLogger
, så du kan använda de två typerna av instanser omväxlande.Ändrad i version 3.2: Metoderna
isEnabledFor()
,getEffectiveLevel()
,setLevel()
ochhasHandlers()
lades till iLoggerAdapter
. Dessa metoder delegerar till den underliggande loggern.Ändrad i version 3.6: Attributet
manager
och metoden_log()
har lagts till, vilka delegerar till den underliggande loggern och tillåter att adaptrar nästlas.Ändrad i version 3.13: Argumentet merge_extra har lagts till.
Säkerhet för trådar¶
Loggningsmodulen är avsedd att vara trådsäker utan att något särskilt arbete behöver utföras av dess klienter. Den uppnår detta genom att använda trådlås; det finns ett lås för att serialisera åtkomst till modulens delade data, och varje hanterare skapar också ett lås för att serialisera åtkomst till dess underliggande I/O.
Om du implementerar asynkrona signalhanterare med modulen signal
kan det hända att du inte kan använda loggning från sådana hanterare. Detta beror på att låsimplementeringar i modulen threading
inte alltid är re-entrant och därför inte kan anropas från sådana signalhanterare.
Funktioner på modulnivå¶
Förutom de klasser som beskrivs ovan finns det ett antal funktioner på modulnivå.
- logging.getLogger(name=None)¶
Returnerar en logger med det angivna namnet eller, om namnet är
None
, hierarkins rotlogger. Om namnet anges är det vanligtvis ett punktseparerat hierarkiskt namn som ’a’, ’a.b’ eller ’a.b.c.d’. Valet av dessa namn är helt upp till utvecklaren som använder loggning, men det rekommenderas att__name__
används om du inte har en särskild anledning att inte göra det, som nämns i Logger-objekt.Alla anrop till denna funktion med ett givet namn returnerar samma loggerinstans. Detta innebär att loggerinstanser aldrig behöver skickas mellan olika delar av en applikation.
- logging.getLoggerClass()¶
Returnerar antingen standardklassen
Logger
, eller den sista klassen som skickades tillsetLoggerClass()
. Denna funktion kan anropas från en ny klassdefinition för att säkerställa att installationen av en anpassadLogger
-klass inte upphäver anpassningar som redan gjorts av annan kod. Till exempel:klass MyLogger(logging.getLoggerClass()): # ... åsidosätt beteende här
- logging.getLogRecordFactory()¶
Returnerar en callable som används för att skapa en
LogRecord
.Tillagd i version 3.2: Denna funktion har tillkommit, tillsammans med
setLogRecordFactory()
, för att ge utvecklare mer kontroll över hurLogRecord
som representerar en loggningshändelse konstrueras.Se
setLogRecordFactory()
för mer information om hur fabriken anropas.
- logging.debug(msg, *args, **kwargs)¶
Detta är en bekvämlighetsfunktion som anropar
Logger.debug()
, på rotloggaren. Hanteringen av argumenten är på alla sätt identisk med vad som beskrivs i den metoden.Den enda skillnaden är att om rotloggaren inte har några hanterare anropas
basicConfig()
innandebug
anropas på rotloggaren.För mycket korta skript eller snabba demonstrationer av
loggning
kandebug
och de andra modulnivåfunktionerna vara praktiska. De flesta program vill dock noggrant och uttryckligen kontrollera loggningskonfigurationen och bör därför föredra att skapa en logger på modulnivå och anropaLogger.debug()
(eller andra nivåspecifika metoder) på den, enligt beskrivningen i början av den här dokumentationen.
- logging.info(msg, *args, **kwargs)¶
Loggar ett meddelande med nivån
INFO
på rotloggaren. Argumenten och beteendet är i övrigt detsamma som fördebug()
.
- logging.warning(msg, *args, **kwargs)¶
Loggar ett meddelande med nivå
WARNING
på rotloggaren. Argumenten och beteendet är i övrigt samma som fördebug()
.Anteckning
Det finns en föråldrad funktion
warn
som är funktionellt identisk medwarning
. Eftersomwarn
är föråldrad, använd den inte - användwarning
istället.
- logging.error(msg, *args, **kwargs)¶
Loggar ett meddelande med nivå
ERROR
på rotloggaren. Argumenten och beteendet är i övrigt detsamma som fördebug()
.
- logging.critical(msg, *args, **kwargs)¶
Loggar ett meddelande med nivå
CRITICAL
på rotloggaren. Argumenten och beteendet är i övrigt samma som fördebug()
.
- logging.exception(msg, *args, **kwargs)¶
Loggar ett meddelande med nivå
ERROR
på rotloggaren. Argumenten och beteendet är i övrigt samma som fördebug()
. Undantagsinformation läggs till i loggmeddelandet. Denna funktion bör endast anropas från en undantagshanterare.
- logging.log(level, msg, *args, **kwargs)¶
Loggar ett meddelande med nivån level på rotloggern. Argumenten och beteendet är i övrigt samma som för
debug()
.
- logging.disable(level=CRITICAL)¶
Ger en överordnad nivå level för alla loggrar som har företräde framför loggarens egen nivå. Denna funktion kan vara användbar när det uppstår ett behov av att tillfälligt strypa loggningsutmatningen i hela programmet. Dess effekt är att inaktivera alla loggningsanrop med allvarlighetsgrad nivå och lägre, så att om du anropar den med ett värde på INFO, kommer alla INFO- och DEBUG-händelser att kasseras, medan de med allvarlighetsgrad WARNING och högre kommer att behandlas enligt loggarens effektiva nivå. Om
logging.disable(logging.NOTSET)
anropas, tas denna överordnade nivå bort, så att loggningsutdata återigen beror på de enskilda loggarnas effektiva nivåer.Observera att om du har definierat någon anpassad loggningsnivå som är högre än
CRITICAL
(detta rekommenderas inte), kan du inte förlita dig på standardvärdet för parametern level, utan måste uttryckligen ange ett lämpligt värde.Ändrad i version 3.7: Parametern level var förvald till nivån
CRITICAL
. Se bpo-28524 för mer information om denna ändring.
- logging.addLevelName(level, levelName)¶
Associerar nivån level med texten levelName i en intern ordbok, som används för att mappa numeriska nivåer till en textuell representation, t.ex. när en
Formatter
formaterar ett meddelande. Denna funktion kan också användas för att definiera egna nivåer. De enda begränsningarna är att alla nivåer som används måste registreras med hjälp av denna funktion, att nivåerna ska vara positiva heltal och att de ska öka i allvarlighetsgrad.Anteckning
Om du funderar på att definiera dina egna nivåer, se avsnittet om Anpassade nivåer.
- logging.getLevelNamesMapping()¶
Returnerar en mappning från nivånamn till motsvarande loggningsnivåer. Strängen ”CRITICAL” mappas till exempel till
CRITICAL
. Den returnerade mappningen kopieras från en intern mappning vid varje anrop till denna funktion.Tillagd i version 3.11.
- logging.getLevelName(level)¶
Returnerar den textuella eller numeriska representationen av loggningsnivån level.
Om level är en av de fördefinierade nivåerna
CRITICAL
,ERROR
,WARNING
,INFO
ellerDEBUG
så får du motsvarande sträng. Om du har associerat nivåer med namn med hjälp avaddLevelName()
så returneras det namn du har associerat med level. Om ett numeriskt värde som motsvarar en av de definierade nivåerna skickas in, returneras motsvarande strängrepresentation.Parametern level accepterar också en strängrepresentation av nivån, t.ex. ”INFO”. I sådana fall returnerar denna funktion motsvarande numeriska värde för nivån.
Om inget matchande numeriskt värde eller strängvärde skickas in returneras strängen ”Level %s” % level”.
Anteckning
Nivåerna är internt heltal (eftersom de måste jämföras i loggningslogiken). Den här funktionen används för att konvertera mellan en heltalsnivå och det nivånamn som visas i den formaterade loggutmatningen med hjälp av formatspecificeraren
%(levelname)s
(se LogRecord-attribut), och vice versa.Ändrad i version 3.4: I Python-versioner tidigare än 3.4 kunde den här funktionen också ges en textnivå och returnera det motsvarande numeriska värdet för nivån. Detta odokumenterade beteende ansågs vara ett misstag och togs bort i Python 3.4, men återinfördes i 3.4.2 för att bibehålla bakåtkompatibilitet.
- logging.getHandlerByName(name)¶
Returnerar en hanterare med det angivna namnet, eller
None
om det inte finns någon hanterare med det namnet.Tillagd i version 3.12.
- logging.getHandlerNames()¶
Returnerar en oföränderlig uppsättning av alla kända hanterarnamn.
Tillagd i version 3.12.
- logging.makeLogRecord(attrdict)¶
Skapar och returnerar en ny
LogRecord
-instans vars attribut definieras av attrdict. Denna funktion är användbar för att ta en inlagdLogRecord
attributordbok, skickad över en socket, och återskapa den som enLogRecord
instans på mottagarsidan.
- logging.basicConfig(**kwargs)¶
Gör grundläggande konfiguration för loggningssystemet genom att skapa en
StreamHandler
med en standardFormatter
och lägga till den i rotloggaren. Funktionernadebug()
,info()
,warning()
,error()
ochcritical()
anroparbasicConfig()
automatiskt om inga hanterare har definierats för rotloggaren.Denna funktion gör ingenting om rotloggaren redan har konfigurerade hanterare, såvida inte nyckelordsargumentet force är inställt på
True
.Anteckning
Denna funktion bör anropas från huvudtråden innan andra trådar startas. I versioner av Python före 2.7.1 och 3.2, om denna funktion anropas från flera trådar, är det möjligt (i sällsynta fall) att en hanterare läggs till root-loggern mer än en gång, vilket leder till oväntade resultat som att meddelanden dupliceras i loggen.
Följande nyckelordsargument stöds.
Format
Beskrivning
filnamn
Anger att en
FileHandler
ska skapas med det angivna filnamnet, i stället för enStreamHandler
.filemode
Om filnamn anges, öppnas filen i detta mode. Standard är
'a'
.format
Använd den angivna formatsträngen för hanteraren. Standard är attributen
levelname
,name
ochmessage
åtskilda med kolon.datefmt
Använd det angivna datum-/tidsformatet, som accepteras av
time.strftime()
.stil
Om format anges, används denna stil för formatsträngen. En av
'%'
,'{'
eller'$'
för printf-style,str.format()
respektivestring.Template
. Standardvärdet är'%'
.nivå
Ställ in root-loggernivån till den angivna level.
strömma
Använd den angivna strömmen för att initiera
StreamHandler
. Observera att detta argument är inkompatibelt med filnamn - om båda är närvarande kommer ettValueError
att uppstå.handläggare
Om detta anges ska det vara en iterabel av redan skapade hanterare som ska läggas till rotloggaren. Alla hanterare som inte redan har en formateringsinställning kommer att tilldelas standardformateringen som skapas i den här funktionen. Observera att detta argument är inkompatibelt med filnamn eller ström - om båda är närvarande kommer ett
ValueError
att uppstå.kraft
Om detta nyckelordsargument anges som true, tas alla befintliga hanterare som är kopplade till rotloggaren bort och stängs, innan konfigurationen utförs enligt de andra argumenten.
kodning
Om detta nyckelordsargument anges tillsammans med filnamn, används dess värde när
FileHandler
skapas, och används således när utdatafilen öppnas.fel
Om detta nyckelordsargument anges tillsammans med filnamn, används dess värde när
FileHandler
skapas, och används därmed när utdatafilen öppnas. Om det inte anges används värdet ’backslashreplace’. Observera att omNone
anges kommer det att skickas som sådant tillopen()
, vilket innebär att det kommer att behandlas på samma sätt som att skicka ’errors’.Ändrad i version 3.2: Argumentet style har lagts till.
Ändrad i version 3.3: Argumentet handlers har lagts till. Ytterligare kontroller har lagts till för att fånga upp situationer där inkompatibla argument anges (t.ex. handlers tillsammans med stream eller filnamn, eller stream tillsammans med filnamn).
Ändrad i version 3.8: Argumentet force har lagts till.
Ändrad i version 3.9: Argumenten encoding och errors har lagts till.
- logging.shutdown()¶
Informerar loggningssystemet om att utföra en ordnad avstängning genom att spola och stänga alla hanterare. Detta anrop bör göras när programmet avslutas och ingen ytterligare användning av loggningssystemet bör göras efter detta anrop.
När loggningsmodulen importeras registreras den här funktionen som en exit-hanterare (se
atexit
), så normalt sett behöver du inte göra det manuellt.
- logging.setLoggerClass(klass)¶
Anger att loggningssystemet ska använda klassen klass vid instansiering av en logger. Klassen bör definiera
__init__()
så att endast ett namnargument krävs, och__init__()
bör anropaLogger.__init__()
. Den här funktionen anropas vanligtvis innan någon logger instansieras av program som behöver använda ett anpassat loggerbeteende. Efter detta anrop, liksom vid alla andra tillfällen, ska du inte instansiera loggrar direkt med hjälp av underklassen: fortsätt att användalogging.getLogger()
API för att hämta dina loggrar.
- logging.setLogRecordFactory(factory)¶
Ställ in en callable som används för att skapa en
LogRecord
.- Parametrar:
factory – Den factory callable som ska användas för att instansiera en loggpost.
Tillagd i version 3.2: Denna funktion har tillkommit tillsammans med
getLogRecordFactory()
för att ge utvecklare mer kontroll över hurLogRecord
som representerar en loggningshändelse konstrueras.Fabriken har följande signatur:
factory(namn, nivå, fn, lno, msg, args, exc_info, func=None, sinfo=None, **kwargs)
- namn:
Loggarens namn.
- nivå:
Loggningsnivå (numerisk).
- fn:
Det fullständiga sökvägsnamnet för den fil där loggningsanropet gjordes.
- lno:
Radnumret i filen där loggningsanropet gjordes.
- msg:
Loggningens meddelande.
- args:
Argumenten för loggningsmeddelandet.
- exc_info:
En undantags-tupel, eller
None
.- func:
Namnet på den funktion eller metod som anropade loggningsanropet.
- sinfo:
En stack traceback som den som tillhandahålls av
traceback.print_stack()
, visar anropshierarkin.- kwargs:
Ytterligare nyckelordsargument.
Attribut på modulnivå¶
- logging.lastResort¶
En ”hanterare av sista utväg” är tillgänglig via detta attribut. Detta är en
StreamHandler
som skriver tillsys.stderr
med en nivå avWARNING
, och används för att hantera loggningshändelser i avsaknad av någon loggningskonfiguration. Slutresultatet är att bara skriva ut meddelandet tillsys.stderr
. Detta ersätter det tidigare felmeddelandet som sa att ”inga hanterare kunde hittas för logger XYZ”. Om du av någon anledning behöver det tidigare beteendet kanlastResort
sättas tillNone
.Tillagd i version 3.2.
- logging.raiseExceptions¶
Används för att se om undantag under hanteringen ska spridas.
Standard:
True
.Om
raiseExceptions
ärFalse
, ignoreras undantag i tysthet. Detta är vad som oftast önskas för ett loggningssystem - de flesta användare bryr sig inte om fel i loggningssystemet, de är mer intresserade av applikationsfel.
Integration med varningsmodulen¶
Funktionen captureWarnings()
kan användas för att integrera logging
med modulen warnings
.
- logging.captureWarnings(capture)¶
Denna funktion används för att aktivera och inaktivera loggning av varningar.
Om capture är
True
kommer varningar som utfärdas av modulenwarnings
att omdirigeras till loggningssystemet. Specifikt kommer en varning att formateras medwarnings.formatwarning()
och den resulterande strängen loggas till en logger med namnet'py.warnings'
med allvarlighetsgradenWARNING
.Om capture är
False
kommer omdirigeringen av varningar till loggsystemet att upphöra och varningarna kommer att omdirigeras till sina ursprungliga destinationer (dvs. de som gällde innancaptureWarnings(True)
anropades).
Se även
- Modul
logging.config
Konfigurations-API för loggningsmodulen.
- Modul
logging.handlers
Användbara hanterare som ingår i loggningsmodulen.
- PEP 282 - Ett loggningssystem
Förslaget som beskrev denna funktion för inkludering i Pythons standardbibliotek.
- ”Ursprungligt Python-loggningspaket <https://old.red-dove.com/python_logging.html>
Detta är den ursprungliga källan för paketet
logging
. Den version av paketet som är tillgänglig från den här webbplatsen är lämplig för användning med Python 1.5.2, 2.1.x och 2.2.x, som inte innehåller paketetlogging
i standardbiblioteket.