获取当前 pid 使用文件名打开的文件的 fileno()?
Get fileno() for a file opened by current pid using filename?
我有一个使用 logging.FileHandler
打开文件的第三方模块,我想知道如何从文件名中找出它的 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')
尝试从您的 FileHandler
中获取 stream
属性,然后获取其 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()))
有点老套,但能完成工作 ;)
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
我有一个使用 logging.FileHandler
打开文件的第三方模块,我想知道如何从文件名中找出它的 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')
尝试从您的 FileHandler
中获取 stream
属性,然后获取其 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()))
有点老套,但能完成工作 ;)
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