3 @)f>y@sddddgZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z Gddde Z Gddde Z Gd d d e ZGd d d e ZGd dde ZGddde ZeZdS) LogTargetFileLogLoggerlogNc@s2eZdZdZddZd ddZddZd d Zd S) rz% Abstract class for logging targets. cCs d|_dS)N)fd)selfr/usr/lib/python3.6/logger.py__init__(szLogTarget.__init__rcCs tddS)Nz%LogTarget.write is an abstract method)NotImplementedError)rdatalevelloggeris_debugrrr write+szLogTarget.writecCs tddS)Nz%LogTarget.flush is an abstract method)r )rrrr flush.szLogTarget.flushcCs tddS)Nz%LogTarget.close is an abstract method)r )rrrr close1szLogTarget.closeN)r)__name__ __module__ __qualname____doc__r rrrrrrr r&s  c@s.eZdZddZd ddZddZdd Zd S) _StdoutLogcCstj|tj|_dS)N)rr sysstdoutr)rrrr r 8s z_StdoutLog.__init__rcCs|jj||jdS)N)rrr)rr r rrrrr r<s z_StdoutLog.writecCs |jdS)N)r)rrrr rAsz_StdoutLog.closecCs|jjdS)N)rr)rrrr rDsz_StdoutLog.flushN)r)rrrr rrrrrrr r7s rc@seZdZddZdS) _StderrLogcCstj|tj|_dS)N)rr rstderrr)rrrr r Ks z_StderrLog.__init__N)rrrr rrrr rJsrc@s.eZdZddZd ddZddZdd Zd S) _SyslogLogcCs.tj|tjtjjtjdtj tj dS)Nr) rr syslogZopenlogospathbasenamerargvZLOG_PIDZ LOG_DAEMON)rrrr r Ss z_SyslogLog.__init__rcCsd}|rtj}nF||jkr"tj}n4||jkr4tj}n"||jkrFtj}n||jkrVtj }|j drt|dt |d}t |dkr|dkrtj|n tj||dS)N r) rZ LOG_DEBUGINFO1ZLOG_INFOWARNINGZ LOG_WARNINGERRORZLOG_ERRFATALZLOG_CRITendswithlen)rr r rrZpriorityrrr ras"       z_SyslogLog.writecCs tjdS)N)rZcloselog)rrrr rwsz_SyslogLog.closecCsdS)Nr)rrrr rzsz_SyslogLog.flushN)r)rrrr rrrrrrr rRs rc@s<eZdZdZdddZddZddd Zd d Zd d ZdS)rz< FileLog class. File will be opened on the first write. wcCstj|||_||_dS)N)rr filenamemode)rr+r,rrr r s zFileLog.__init__cCsv|jr dStjtjB}|jjdr,|tjO}tj|j|d|_tj |jdtj |j|j|_t j |jt j t j dS)Nai)rrO_CREATO_WRONLYr, startswithO_APPENDopenr+fchmodfdopenfcntlZF_SETFDZ FD_CLOEXEC)rflagsrrr r2s   z FileLog.openrcCs(|js|j|jj||jjdS)N)rr2rr)rr r rrrrr rs z FileLog.writecCs|js dS|jjd|_dS)N)rr)rrrr rs z FileLog.closecCs|js dS|jjdS)N)rr)rrrr rsz FileLog.flushN)r*)r) rrrrr r2rrrrrrr rs   c@seZdZdZd[Zd\Zd]Zd^Zd_ZdZ e Z e Z eZd`d d Zd d ZdaddZdbddZdcddZddddZddZddZddZddZddZd d!Zed"fd#d$Zed"fd%d&Zed"fd'd(Zed"fd)d*Zed"fd+d,Z ed"fd-d.Z!d/d0Z"d1d2Z#d3d4Z$d5d6Z%d7d8Z&d9d:Z'd;d<Z(d=d>Z)d?d@Z*dAdBZ+dCdDZ,dedEdFZ-dGdHZ.dfdIdJZ/ed"dfdKdLZ0ed"dfdMdNZ1ed"dfdOdPZ2dgdQdRZ3dSdTZ4dUdVZ5dWdXZ6dhdYdZZ7d"S)iraL Format string: %(class)s Calling class the function belongs to, else empty %(date)s Date using Logger.date_format, see time module %(domain)s Full Domain: %(module)s.%(class)s.%(function)s %(file)s Filename of the module %(function)s Function name, empty in __main__ %(label)s Label according to log function call from Logger.label %(level)d Internal logging level %(line)d Line number in module %(module)s Module name %(message)s Log message Standard levels: FATAL Fatal error messages ERROR Error messages WARNING Warning messages INFOx, x in [1..5] Information DEBUGy, y in [1..10] Debug messages NO_INFO No info output NO_DEBUG No debug output INFO_MAX Maximum info level DEBUG_MAX Maximum debug level x and y depend on info_max and debug_max from Logger class initialization. See __init__ function. Default logging targets: stdout Logs to stdout stderr Logs to stderr syslog Logs to syslog Additional arguments for logging functions (fatal, error, warning, info and debug): nl Disable newline at the end with nl=0, default is nl=1. fmt Format string for this logging entry, overloads global format string. Example: fmt="%(file)s:%(line)d %(message)s" nofmt Only output message with nofmt=1. The nofmt argument wins over the fmt argument. Example: from logger import log log.setInfoLogLevel(log.INFO1) log.setDebugLogLevel(log.DEBUG1) for i in range(1, log.INFO_MAX+1): log.setInfoLogLabel(i, "INFO%d: " % i) log.setFormat("%(date)s %(module)s:%(line)d [%(domain)s] %(label)s: " "%(level)d %(message)s") log.setDateFormat("%Y-%m-%d %H:%M:%S") fl = FileLog("/tmp/log", "a") log.addInfoLogging("*", fl) log.addDebugLogging("*", fl) log.addInfoLogging("*", log.syslog, fmt="%(label)s%(message)s") log.debug3("debug3") log.debug2("debug2") log.debug1("debug1") log.info2("info2") log.info1("info1") log.warning("warning\n", nl=0) log.error("error\n", nl=0) log.fatal("fatal") log.info(log.INFO1, "nofmt info", nofmt=1) r#r cCsi|_i|_d|_d|_i|_i|_i|_i|_i|_i|_ |dkrPt d||dkrdt d||j |_ ||_ d|_||_|j|jd|j|jd|j|jd|j|j dxNtd|j dD]:}t|d |||j|dt|d |d d ||qWxTtd|jdD]@}t|d |||j|d|t|d|dd ||qW|j|j|j|j|jd|jd|jd|j|j|j|j g|jd|jddt|j|j dD|jd|jddtd|jdDdS)z Logger class initialization r#zLogger: info_max %d is too lowrzLogger: debug_max %d is too lowz FATAL ERROR: zERROR: z WARNING: zINFO%dzinfo%dcsfddS)Ncsj|f||S)N)info)messageargskwargs)rxrr  sz3Logger.__init__....r)rrAr)rrAr rBsz!Logger.__init__..zDEBUG%dz DEBUG%d: zdebug%dcsfddS)Ncsj|f||S)N)debug)r>r?r@)rrArr rB)sz3Logger.__init__....r)rrAr)rrAr rB(sz%(label)s%(message)sz%d %b %Y %H:%M:%S*cSsg|]}|qSrr).0irrr 4sz#Logger.__init__..cSsg|]}|qSrr)rErFrrr rG6sN) _level _debug_level_format _date_format_label _debug_label_logging_debug_logging_domains_debug_domains ValueErrorr%NO_INFOINFO_MAXNO_DEBUG DEBUG_MAXsetInfoLogLabelr' TRACEBACKr&rangesetattrsetDebugLogLabelsetInfoLogLevelr$setDebugLogLevel setFormat setDateFormatsetInfoLoggingrrsetDebugLogging)rZinfo_maxZ debug_maxrHrrr r sX            zLogger.__init__cCsNxHt|j|jdD]2}||jkr$qx |j|D]\}}}|jq0WqWdS)z Close all logging targets r#N)rYr'rVrNr)rr dummytargetrrr r8s  z Logger.closerDcCs$|j|||jkr|j|S|jS)z Get info log level. ) _checkDomainrHNOTHING)rdomainrrr getInfoLogLevel@s   zLogger.getInfoLogLevelcCs8|j|||jkr|j}||jkr*|j}||j|<dS)z% Set log level [NOTHING .. INFO_MAX] N)rdrerTrH)rr rfrrr r\Gs    zLogger.setInfoLogLevelcCs*|j|||jkr$|j||jS|jS)z Get debug log level. )rdrIrU)rrfrrr getDebugLogLevelPs  zLogger.getDebugLogLevelcCs:|j||dkrd}||jkr&|j}||j|j|<dS)z- Set debug log level [NO_DEBUG .. DEBUG_MAX] rN)rdrVrUrI)rr rfrrr r]Ws   zLogger.setDebugLogLevelcCs|jS)N)rJ)rrrr getFormat`szLogger.getFormatcCs ||_dS)N)rJ)rrJrrr r^cszLogger.setFormatcCs|jS)N)rK)rrrr getDateFormatfszLogger.getDateFormatcCs ||_dS)N)rK)rrJrrr r_iszLogger.setDateFormatcCs:|j|}x*|D]"}|j||j|jd||j|<qWdS)zU Set log label for level. Level can be a single level or an array of levels. ) min_level max_levelN) _getLevels_checkLogLevelr'rTrL)rr labellevelsrrr rWls     zLogger.setInfoLogLabelcCs>|j|dd}x*|D]"}|j||j|jd||j|<qWdS)zU Set log label for level. Level can be a single level or an array of levels. r#)r)rkrlN)rmrnr$rVrM)rr rorprrr r[us    zLogger.setDebugLogLabelNcCs|j||||dddS)z Set info log target for domain and level. Level can be a single level or an array of levels. Use level ALL to set for all levels. If no format is specified, the default format will be used. r)rN) _setLogging)rrfrcr fmtrrr r`~szLogger.setInfoLoggingcCs|j||||dddS)z Set debug log target for domain and level. Level can be a single level or an array of levels. Use level ALL to set for all levels. If no format is specified, the default format will be used. r#)rN)rq)rrfrcr rrrrr raszLogger.setDebugLoggingcCs|j||||dddS)z Add info log target for domain and level. Level can be a single level or an array of levels. Use level ALL to set for all levels. If no format is specified, the default format will be used. r)rN) _addLogging)rrfrcr rrrrr addInfoLoggingszLogger.addInfoLoggingcCs|j||||dddS)z Add debg log target for domain and level. Level can be a single level or an array of levels. Use level ALL to set for all levels. If no format is specified, the default format will be used. r#)rN)rs)rrfrcr rrrrr addDebugLoggingszLogger.addDebugLoggingcCs|j||||dddS)z Delete info log target for domain and level. Level can be a single level or an array of levels. Use level ALL to set for all levels. If no format is specified, the default format will be used. r)rN) _delLogging)rrfrcr rrrrr delInfoLoggingszLogger.delInfoLoggingcCs|j||||dddS)z Delete debug log target for domain and level. Level can be a single level or an array of levels. Use level ALL to set for all levels. If no format is specified, the default format will be used. r#)rN)rv)rrfrcr rrrrr delDebugLoggingszLogger.delDebugLoggingcCs|j|ddS)zN Is there currently any info logging for this log level (and domain)? r)r)_isLoggingHere)rr rrr isInfoLoggingHereszLogger.isInfoLoggingHerecCs|j|ddS)zO Is there currently any debug logging for this log level (and domain)? r#)r)ry)rr rrr isDebugLoggingHereszLogger.isDebugLoggingHerecOs,|j|d|d<|j|j|f||dS)z Fatal error log. rrN) _checkKWargs_logr')rrJr?r@rrr fatals z Logger.fatalcOs,|j|d|d<|j|j|f||dS)z Error log. rrN)r|r}r&)rrJr?r@rrr errors z Logger.errorcOs,|j|d|d<|j|j|f||dS)z Warning log. rrN)r|r}r%)rrJr?r@rrr warnings zLogger.warningcOsB|j|d|jd|j|d|d<|j||j|f||dS)z Information log using info level [1..info_max]. There are additional infox functions according to info_max from __init__r#)rkrlrrN)rnrTr|r}rS)rr rJr?r@rrr r=s z Logger.infocOs<|j|d|jd|j|d|d<|j||f||dS)z Debug log using debug level [1..debug_max]. There are additional debugx functions according to debug_max from __init__r#)rkrlrN)rnrVr|r})rr rJr?r@rrr rCs z Logger.debugcCs|j|jtjgiddS)N)r?r@)r}rX traceback format_exc)rrrr exceptionszLogger.exceptioncCs&||ks||kr"td|||fdS)Nz*Level %d out of range, should be [%d..%d].)rR)rr rkrlrrr rnszLogger._checkLogLevelcCs2|sdSx$|jD]}|dkrtd|qWdS)Nnlrrnofmtz0Key '%s' is not allowed as argument for logging.)rrrr)keysrR)rr@keyrrr r|s zLogger._checkKWargscCs| s|dkrtd|dS)Nr<zDomain '%s' is not valid.)rR)rrfrrr rdszLogger._checkDomaincCs||jkrft|tst|tr$|}n|g}xp|D]0}|rL|j|d|jdq0|j||j|jdq0Wn6|rddt|j |jD}nddt|j|jD}|S)z Generate log level array. r#)rkrlcSsg|]}|qSrr)rErFrrr rGsz%Logger._getLevels..cSsg|]}|qSrr)rErFrrr rGs) ALL isinstancelisttuplernrVr'rTrYZDEBUG1)rr rrprrr rms    zLogger._getLevelscCsNt|tst|tr|}n|g}x(|D] }t|jts&td|jjq&W|S)z Generate target array. z '%s' is no valid logging target.)rrr issubclass __class__rrRr)rrctargetsZ_targetrrr _getTargetss  zLogger._getTargetscCs|r |j}|j}d|jdf}n|j}|j}|j|jdf}t|dkrP|jxVt |d|dD]@}||krrqdx0||D]$\}}}||kr||j |gj |q|WqdWdS)z% Generate dict with domain by level. r#rN) rQrOrVrPrNr'rTr)clearrY setdefaultappend)rrrPrNZ_ranger rfrbrrr _genDomainss zLogger._genDomainsc Csl|j||j||}|j|}|r,|j}n|j}x*|D]"}x|D]}|||fg||<qBWq8W|j|dS)N)rdrmrrOrNr) rrfrcr rrrrprrNrrr rqs     zLogger._setLoggingc Cst|j||j||}|j|}|r,|j}n|j}x2|D]*}x$|D]}|j|gj|||fqBWq8W|j|dS)N)rdrmrrOrNrrr) rrfrcr rrrrprrNrrr rs-s      zLogger._addLoggingc Cs|j||j||}|j|}|r,|j}n|j}x|D]|} xv|D]n}| |krPqB|||f|| kr|| j|||ft|| dkr|| =qB||jkrBtd| ||j j |fqBWq8W|j |dS)NrzDNo mathing logging for level %d, domain %s, target %s and format %s.) rdrmrrOrNremover)rrRrrr) rrfrcr rrrrprrNrHrrr rv<s&      zLogger._delLoggingcCst|j||}|sdS|dd}|r,|j}n|j}x<||D]0\}}}|dksh|j|shtj|d|rrfrrDrrr") rr)rOrNr0rrrJrr)rr rJr?r@rrrrrrNZ used_targetsrfrcrrr r}sL     z Logger._logc Csg}d}|r |j}|j}|j}n|j}|j}|j}xN|D]F}|dkrh|||kr~d}t|dkrdg}Pq8|||kr8|j|q8W| rt|dkrdS||krdStj } x$| r| j r| j d|j kr| j } qW| st d| j d} | d } x|D]}| j|rg}PqW| j} t| } xx||D]l}|jd}|dkrDq&n|dkr\|d|}n|}| t|kr| j|sdSn|j| s&dSq&Wd }||kr||}| j| j| d | jd ||tj|jtjd }|d d krd |d <d}x&||D]}|dkrqd}PqW|jjddksR|jjddksR|sRt|dkrl|j| }|rl|j|d<d |d|d<|dd kr|dd |d7<|d d kr|dd |d 7<t|dkr|S|dd }x0|D](}|j|stj|d|r|SqWdS)z Internal function. FrDTrr#Nrz Frame information not available.rr<) filelinerclassfunctionrfror Zdater?z %(domain)z%(class)rrrf)rIrQrMrHrPrLr)rrZ currentframef_back f_globalsrrRr0rfind co_filenamef_linenortimeZstrftimerKZ localtimerJrrrr)rr rZ check_domainsZ simple_matchrrPrLrffZ module_nameZ point_moduleco_lenrFdZ level_strZ domain_neededrrrrr rs                      zLogger._genDict)r7r;)rD)rD)rD)rD)r)r)r)r)8rrrrrrer'rXr&r%rrrrrrr rrgr\rhr]rir^rjr_rWr[r`rartrurwrxrzr{r~rrr=rCrrnr|rdrmrrrqrsrvryrrr}rrrrr rsdG ;           4)__all__rrrrrrrr5Zos.pathrobjectrrrrrrrrrrr s. -(*4