2017-02-16 107 views
0

我有使用logging.FileHandler打開文件的第三方模塊,我想知道我怎麼能找出其fileno從文件名。使用文件名獲取當前pid打開的文件的fileno()?

third_party.py:

def setup_loging(logfile): 
    logFormatter = logging.Formatter(
     "%(asctime)s [%(process)d] [%(name)-12.12s] " 
     "[%(levelname)-5.5s] %(message)s") 
    rootLogger = logging.getLogger() 
    rootLogger.setLevel(logging.NOTSET) 
    if logfile: 
     fileHandler = logging.FileHandler(logfile, mode="wt", encoding="utf-8") 
     fileHandler.setFormatter(logFormatter) 
     fileHandler.setLevel(logging.NOTSET) 
     rootLogger.addHandler(fileHandler) 

    consoleHandler = logging.StreamHandler(sys.stdout) 
    if verbose: 
     consoleHandler.setLevel(logging.DEBUG) 
    else: 
     consoleHandler.setLevel(logging.INFO) 
    consolelogFormatter = logging.Formatter(
     "[%(name)-12.12s] [%(levelname)-5.5s] %(message)s") 
    consoleHandler.setFormatter(consolelogFormatter) 
    rootLogger.addHandler(consoleHandler) 

my_script.py:

from third_party import setup_loging 
setup_loging(logfile='/tmp/foo.log') 

# How do I get the fileno for file /tmp/foo.log ? 
# only way i know is doing: lsof /tmp/foo.log 
print get_fileno_from_filename('/tmp/foo.log') 
+1

雖然可能有多個文件描述符給定的文件名。 –

+0

任何方式來修改'setup_loging()',以便它返回給調用者? – martineau

回答

1

嘗試從FileHandlerstream屬性,然後將其stream獲得文件對象:

def setup_loging(logfile): 
    # your code... 
    if logfile: 
     return fileHandler 

logging_handler = setup_loging(logfile='/tmp/foo.log') 
if logging_handler: 
    print("fileno: {}".format(logging_handler.stream.stream.fileno())) 

有點ha,,但完成了工作;)

P.S.如果無法以任何方式修改腳本,則始終可以獲取所有根日誌處理程序(logging.getLogger().handlers)並篩選它們,直到找到FileHandler爲止,但可能會有多個,因此請務必檢查name的屬性提取文件對象才能得到其fileno()。例如:

import os 

your_log_file = "/tmp/foo.log" 
log_file_path = os.path.realpath(your_log_file) # make sure we have a full path 

setup_loging(log_file_path) # call the third party 

for handler in logging.getLogger().handlers: 
    if isinstance(handler, logging.FileHandler): 
     if handler.stream.stream.name == log_file_path: 
      print("{}, fileno: {}".format(log_file_path, handler.stream.stream.fileno())) 
      break 
相關問題