3 YÉj>yã@sÆddddgZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z Gdd„de ƒZ Gdd„de ƒZ Gd d „d e ƒZGd d „d e ƒZGd d„de ƒZGdd„de ƒZeƒZdS)Ú LogTargetÚFileLogÚLoggerÚlogéNc@s2eZdZdZdd„Zd dd„Zdd„Zd d „Zd S) rz% Abstract class for logging targets. cCs d|_dS)N)Úfd)Úself©rú/usr/lib/python3.6/logger.pyÚ__init__(szLogTarget.__init__rcCs tdƒ‚dS)Nz%LogTarget.write is an abstract method)ÚNotImplementedError)rÚdataÚlevelÚloggerÚis_debugrrr Úwrite+szLogTarget.writecCs tdƒ‚dS)Nz%LogTarget.flush is an abstract method)r )rrrr Úflush.szLogTarget.flushcCs tdƒ‚dS)Nz%LogTarget.close is an abstract method)r )rrrr Úclose1szLogTarget.closeN)r)Ú__name__Ú __module__Ú __qualname__Ú__doc__r rrrrrrr r&s  c@s.eZdZdd„Zd dd„Zdd„Zdd „Zd S) Ú _StdoutLogcCstj|ƒtj|_dS)N)rr ÚsysÚstdoutr)rrrr r 8s z_StdoutLog.__init__rcCs|jj|ƒ|jƒdS)N)rrr)rr r rrrrr r<s z_StdoutLog.writecCs |jƒdS)N)r)rrrr rAsz_StdoutLog.closecCs|jjƒdS)N)rr)rrrr rDsz_StdoutLog.flushN)r)rrrr rrrrrrr r7s rc@seZdZdd„ZdS)Ú _StderrLogcCstj|ƒtj|_dS)N)rr rÚstderrr)rrrr r Ks z_StderrLog.__init__N)rrrr rrrr rJsrc@s.eZdZdd„Zd dd„Zdd„Zdd „Zd S) Ú _SyslogLogcCs.tj|ƒtjtjjtjdƒtj tj ƒdS)Nr) rr ÚsyslogZopenlogÚosÚpathÚbasenamerÚargvZLOG_PIDZ LOG_DAEMON)rrrr r Ss z_SyslogLog.__init__rcCs¤d}|rtj}nF||jkr"tj}n4||jkr4tj}n"||jkrFtj}n||jkrVtj }|j dƒrt|dt |ƒd…}t |ƒdkr |dkr”tj|ƒn tj||ƒdS)NÚ ér) rZ LOG_DEBUGÚINFO1ZLOG_INFOÚWARNINGZ LOG_WARNINGÚERRORZLOG_ERRÚFATALZLOG_CRITÚendswithÚlen)rr r rrZpriorityrrr ras"       z_SyslogLog.writecCs tjƒdS)N)rZcloselog)rrrr rwsz_SyslogLog.closecCsdS)Nr)rrrr rzsz_SyslogLog.flushN)r)rrrr rrrrrrr rRs rc@s<eZdZdZddd„Zdd„Zddd „Zd d „Zd d „ZdS)rz< FileLog class. File will be opened on the first write. ÚwcCstj|ƒ||_||_dS)N)rr ÚfilenameÚmode)rr+r,rrr r ‚s zFileLog.__init__cCsv|jr dStjtjB}|jjdƒr,|tjO}tj|j|dƒ|_tj |jdƒtj |j|jƒ|_t j |jt j t j ƒdS)NÚai )rrÚO_CREATÚO_WRONLYr,Ú startswithÚO_APPENDÚopenr+ÚfchmodÚfdopenÚfcntlZF_SETFDZ FD_CLOEXEC)rÚflagsrrr r2‡s   z FileLog.openrcCs(|js|jƒ|jj|ƒ|jjƒdS)N)rr2rr)rr r rrrrr r”s z FileLog.writecCs|js dS|jjƒd|_dS)N)rr)rrrr ršs z FileLog.closecCs|js dS|jjƒdS)N)rr)rrrr r sz FileLog.flushN)r*)r) rrrrr r2rrrrrrr rs   c@sÈeZdZdZd[Zd\Zd]Zd^Zd_ZdZ e ƒZ e ƒZ eƒZd`d d „Zd d „Zdadd„Zdbdd„Zdcdd„Zdddd„Zdd„Zdd„Zdd„Zdd„Zdd„Zd d!„Zed"fd#d$„Zed"fd%d&„Zed"fd'd(„Zed"fd)d*„Zed"fd+d,„Z ed"fd-d.„Z!d/d0„Z"d1d2„Z#d3d4„Z$d5d6„Z%d7d8„Z&d9d:„Z'd;d<„Z(d=d>„Z)d?d@„Z*dAdB„Z+dCdD„Z,dedEdF„Z-dGdH„Z.dfdIdJ„Z/ed"dfdKdL„Z0ed"dfdMdN„Z1ed"dfdOdP„Z2dgdQdR„Z3dSdT„Z4dUdV„Z5dWdX„Z6dhdYdZ„Z7d"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é cCsöi|_i|_d|_d|_i|_i|_i|_i|_i|_i|_ |dkrPt d|ƒ‚|dkrdt d|ƒ‚|j |_ ||_ d|_||_|j|jdƒ|j|jdƒ|j|jdƒ|j|j dƒxNtd|j dƒD]:}t|d ||ƒ|j|dƒt|d |d d „||ƒƒqÈWxTtd|jdƒD]@}t|d ||ƒ|j|d|ƒt|d|dd „||ƒƒ�qW|j|jƒ|j|jƒ|jdƒ|jdƒ|jd|j|j|j|j gƒ|jd|jdd„t|j|j dƒDƒƒ|jd|jdd„td|jdƒDƒƒdS)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%dcs‡‡fdd„S)Ncsˆjˆ|f|ž|ŽS)N)Úinfo)ÚmessageÚargsÚkwargs)rÚxrr Ú sz3Logger.__init__....r)rrAr)rrAr rBsz!Logger.__init__..zDEBUG%dz DEBUG%d: zdebug%dcs‡‡fdd„S)Ncsˆjˆ|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)Ú.0Úirrr ú 4sz#Logger.__init__..cSsg|]}|‘qSrr)rErFrrr rG6sN) Ú_levelÚ _debug_levelÚ_formatÚ _date_formatÚ_labelÚ _debug_labelÚ_loggingÚ_debug_loggingÚ_domainsÚ_debug_domainsÚ ValueErrorr%ÚNO_INFOÚINFO_MAXÚNO_DEBUGÚ DEBUG_MAXÚsetInfoLogLabelr'Ú TRACEBACKr&ÚrangeÚsetattrÚsetDebugLogLabelÚsetInfoLogLevelr$ÚsetDebugLogLevelÚ setFormatÚ setDateFormatÚsetInfoLoggingrrÚsetDebugLogging)rZinfo_maxZ debug_maxrHrrr r ýsX            zLogger.__init__cCsNxHt|j|jdƒD]2}||jkr$qx |j|D]\}}}|jƒq0WqWdS)z Close all logging targets r#N)rYr'rVrNr)rr ÚdummyÚtargetrrr r8s  z Logger.closerDcCs$|j|ƒ||jkr|j|S|jS)z Get info log level. )Ú _checkDomainrHÚNOTHING)rÚdomainrrr Ú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 ÚlabelÚlevelsrrr 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||||dd�dS)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||||dd�dS)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 ra„szLogger.setDebugLoggingcCs|j||||dd�dS)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 ÚaddInfoLoggingŠszLogger.addInfoLoggingcCs|j||||dd�dS)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 ÚaddDebugLogging�szLogger.addDebugLoggingcCs|j||||dd�dS)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 ÚdelInfoLogging–szLogger.delInfoLoggingcCs|j||||dd�dS)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 ÚdelDebugLoggingœszLogger.delDebugLoggingcCs|j|dd�S)zN Is there currently any info logging for this log level (and domain)? r)r)Ú_isLoggingHere)rr rrr ÚisInfoLoggingHere¢szLogger.isInfoLoggingHerecCs|j|dd�S)zO Is there currently any debug logging for this log level (and domain)? r#)r)ry)rr rrr ÚisDebugLoggingHere§szLogger.isDebugLoggingHerecOs,|j|ƒd|d<|j|j|f|ž|ŽdS)z Fatal error log. rrN)Ú _checkKWargsÚ_logr')rrJr?r@rrr Úfatal®s z Logger.fatalcOs,|j|ƒd|d<|j|j|f|ž|ŽdS)z Error log. rrN)r|r}r&)rrJr?r@rrr Úerror´s z Logger.errorcOs,|j|ƒd|d<|j|j|f|ž|ŽdS)z Warning log. rrN)r|r}r%)rrJr?r@rrr Úwarningºs 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 rCÉs z Logger.debugcCs|j|jtjƒgid�dS)N)r?r@)r}rXÚ tracebackÚ format_exc)rrrr Ú exceptionÒszLogger.exceptioncCs&||ks||kr"td|||fƒ‚dS)Nz*Level %d out of range, should be [%d..%d].)rR)rr rkrlrrr rn×szLogger._checkLogLevelcCs2|sdSx$|jƒD]}|dkrtd|ƒ‚qWdS)NÚnlrrÚnofmtz0Key '%s' is not allowed as argument for logging.)r„rrr…)ÚkeysrR)rr@Úkeyrrr r|Üs zLogger._checkKWargscCs| s|dkrtd|ƒ‚dS)Nr<zDomain '%s' is not valid.)rR)rrfrrr rdãszLogger._checkDomaincCs ||jkrft|tƒst|tƒr$|}n|g}xp|D]0}|rL|j|d|jd�q0|j||j|jd�q0Wn6|r„dd„t|j |jƒDƒ}ndd„t|j|jƒDƒ}|S)z Generate log level array. r#)rkrlcSsg|]}|‘qSrr)rErFrrr rG÷sz%Logger._getLevels..cSsg|]}|‘qSrr)rErFrrr rGùs) ÚALLÚ isinstanceÚlistÚtuplernrVr'rTrYZDEBUG1)rr rrprrr rmçs    zLogger._getLevelscCsNt|tƒst|tƒr|}n|g}x(|D] }t|jtƒs&td|jjƒ‚q&W|S)z Generate target array. z '%s' is no valid logging target.)r‰rŠr‹Ú issubclassÚ __class__rrRr)rrcÚtargetsZ_targetrrr Ú _getTargetsüs  zLogger._getTargetscCs¬|r |j}|j}d|jdf}n|j}|j}|j|jdf}t|ƒdkrP|jƒxVt |d|dƒD]@}||krrqdx0||D]$\}}}||kr||j |gƒj |ƒq|WqdWdS)z% Generate dict with domain by level. r#rN) rQrOrVrPrNr'rTr)ÚclearrYÚ setdefaultÚappend)rrrPrNZ_ranger rfrbrrr Ú _genDomainss zLogger._genDomainsc Csl|j|ƒ|j||ƒ}|j|ƒ}|r,|j}n|j}x*|D]"}x|D]}|||fg||<qBWq8W|j|ƒdS)N)rdrmr�rOrNr“) rrfrcr rrrrprŽrNrrr rqs     zLogger._setLoggingc Cst|j|ƒ|j||ƒ}|j|ƒ}|r,|j}n|j}x2|D]*}x$|D]}|j|gƒj|||fƒqBWq8W|j|ƒdS)N)rdrmr�rOrNr‘r’r“) rrfrcr rrrrprŽrNrrr rs-s      zLogger._addLoggingc CsÆ|j|ƒ|j||ƒ}|j|ƒ}|r,|j}n|j}x„|D]|} xv|D]n}| |krPqB|||f|| krŽ|| j|||fƒt|| ƒdkrŽ|| =qB||jkrBtd| ||j j |fƒ‚qBWq8W|j |ƒdS)NrzDNo mathing logging for level %d, domain %s, target %s and format %s.) rdrmr�rOrNÚremover)rˆrRr�rr“) rrfrcr rrrrprŽrNrHrrr rv<s&      zLogger._delLoggingcCst|j||ƒ}|sdS|dd}|r,|j}n|j}x<||D]0\}}}|dksh|j|ƒshtj|d|ƒrrfr•rDrrr") r–r)rOrNr0r—r˜rJrr’)rr rJr?r@rr„r…r™ršrNZ 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| r˜t|ƒdkr˜dS||kr¤dStj ƒ} x$| rÐ| j rÐ| j d|j krÐ| j } q®W| sÞt dƒ‚| j d} | d } x|D]}| j|ƒrög}PqöW| j} t| ƒ} xx||D]l}|jdƒ}|dk�rD�q&n|dk�r\|d|…}n|}| t|ƒk�r€| j|ƒ�s�dSn|j| ƒ�s&dS�q&Wd }||k�r¬||}| j| j| d | jd ||tj|jtjƒƒd œ }|d d k�rîd |d <d}x&||D]}|dk�r�qüd}P�qüW|jjdƒdk�sR|jjdƒdk�sR|�sRt|ƒdk�rl|j| ƒ}|�rl|j|d<d |d|d<|dd k�r¢|dd |d7<|d d k�rÈ|dd |d 7<t|ƒdk�rÚ|S|dd }x0|D](}|j|ƒ�stj|d|ƒ�rì|S�qìWdS)z Internal function. FrDTrr#Nrz Frame information not available.r•r<) ÚfileÚliner¬ÚclassÚfunctionrfror Zdater¶ú?z %(domain)z%(class)rµr¬rf)rIrQrMrHrPrLr)r’r Z currentframeÚf_backÚ f_globalsrrRr0r›ÚfindÚ co_filenameÚf_linenor¡ÚtimeZstrftimerKZ localtimerJr¯rr—r˜)rr rZ check_domainsZ simple_matchr™rPrLrfÚfZ module_nameZ point_moduleÚcoÚ_lenrFÚdZ level_strZ domain_neededr«ršrrr r–Ës®                      zLogger._genDictéûÿÿÿéüÿÿÿéýÿÿÿéþÿÿÿéÿÿÿÿ)r7r;)rD)rD)rD)rD)r)r)r)r)8rrrrrˆrer'rXr&r%rrrrrrr rrgr\rhr]rir^rjr_rWr[r`rartrurwrxrzr{r~rr€r=rCrƒrnr|rdrmr�r“rqrsrvryr¯rŸr}r–rrrr r§sdG ;           4)Ú__all__rr¦r½r r—rr�r5Zos.pathrÚobjectrrrrrrrrrrr Ús. -(*4