apache+python中對logging模組的使用問題

來源:互聯網
上載者:User
問題描述:使用http://blog.csdn.net/hqin6/article/details/6719182搭建的伺服器,在使用python的logging模組時,使用如下設定檔:
#logging.conf[loggers]keys=root,example[handlers]keys=exampleHandler[formatters]keys=exampleFormatter[logger_example]level=DEBUGhandlers=exampleHandlerqualname=examplepropagate=0[logger_root]level=DEBUGhandlers=exampleHandlerqualname=rootpropagate=0[handler_exampleHandler]class=handlers.RotatingFileHandlerlevel=DEBUGformatter=exampleFormatterargs=('/tmp/example.log', 'a', 10*1024*1024, 5)[formatter_exampleFormatter]format=[%(asctime)s](%(levelname)s)%(name)s : %(message)sdatefmt=%a, %d %b %Y %H:%M:%S

有如下兩個指令碼:1.test_log1.py

import loggingimport logging.configfrom mod_python import apachelogging.config.fileConfig("logger.conf");logger = logging.getLogger("root");def handler(req):logger.debug("this is a log in log_test1 file");return apache.OK;

2.test_log2.py

import loggingimport logging.configfrom mod_python import apachelogging.config.fileConfig("logger.conf");logger = logging.getLogger("root");def handler(req):logger.debug("this is a log in log_test2 file");return apache.OK;

發現順序執行:curl test_log1.py 能寫出日誌curl test_log1.py 能寫出日誌curl test_log2.py 不能寫出日誌curl test_log1.py 不能寫出日誌重啟apache服務:curl test_log2.py 能寫出日誌curl test_log2.py 能寫出日誌curl test_log1.py 不能寫出日誌curl test_log2.py 不能寫出日誌解決logging對root的logger有特殊處理,最好不在程式中使用,而是使用上述設定檔中的example原因在python/logging/__init__.py中有如下代碼:

1081     def handle(self, record):1082         """1083         Call the handlers for the specified record.1084 1085         This method is used for unpickled records received from a socket, as1086         well as those created locally. Logger-level filtering is applied.1087         """1088         if (not self.disabled) and self.filter(record):1089             self.callHandlers(record)

注意,這個函數是寫日誌的時候需要調用的,它有判斷self.disabled這個變數!當這個變數為1時,將不能寫日誌。在python/logging/config.py中有如下代碼:

 55 def fileConfig(fname, defaults=None): …… 96     try: 97         try:                ……140             #at last, the loggers...first the root...141             llist = cp.get("loggers", "keys")142             llist = string.split(llist, ",")143             llist.remove("root")#注意這行                ……167             existing = root.manager.loggerDict.keys()168             #now set up the new ones...169             for log in llist:170                 sectname = "logger_%s" % log171                 qn = cp.get(sectname, "qualname")172                 opts = cp.options(sectname)173                 if "propagate" in opts:174                     propagate = cp.getint(sectname, "propagate")175                 else:176                     propagate = 1177                 logger = logging.getLogger(qn)178                 if qn in existing:179                     existing.remove(qn)#注意這行                    ……186                 logger.disabled = 0#注意這行                    ……195             for log in existing:196                 root.manager.loggerDict[log].disabled = 1#注意這行

能看到fileConfig函數執行時,將root從llist刪除了,那麼如果existing(即loggerDict)中存在root的話,上述代碼就會將其root的disabled設定為1;但是對於普通的logger(比如上述的example),則不然,example等將會在179行中從existing中remove,從而不會設定這些普通的logger的disabled在 python/logging/__init__.py中有如下代碼:

 825 class Manager: …… 830     def __init__(self, rootnode): …… 834         self.root = rootnode 835         self.disable = 0 836         self.emittedNoHandlerWarning = 0 837         self.loggerDict = {}#注意這行 838  839     def getLogger(self, name): …… 852         try: 853             if self.loggerDict.has_key(name): …… 862             else: 863                 rv = _loggerClass(name) 864                 rv.manager = self 865                 self.loggerDict[name] = rv#注意這行

可以看到,對於第一次getLogger('root')調用,會將root寫入到loggerDict中所以,第一次的getLogger('root’)調用能正常寫日誌,因為第一次loggerDict中為{},(837行)即空,所以按照上面程式碼分析,不會將root的disabled設定為1,能寫入日誌但是第二次,由於已經將root放入了loggerDict,root的disabled將會被設定為1,本應該不能寫日誌,但是由於為了python的解析加速,第一次解析python檔案後會產生一個.pyc檔案,從而不進行第二次解析(可以刪除該檔案再試試,失敗)但是當我們請求另一個檔案的時候(即test_log2.py),再次調用函數,root的disabled被設定為1,所以出現了問題,不能寫日誌。同理,再次重新調用test_log1.py時寫日誌失敗,因為root的disabled已經被設定為了1使用example將不存在這樣的問題!分析同上!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.