python - 如何自定义 python 记录器行为?

标签 python python-3.x logging stdout

我已经实现了一个我的其他 python 类使用的 custom_logger。

import logging, sys

logging.basicConfig(format='%(asctime)s,%(msecs)d %(levelname)-8s [%(filename)s:%(lineno)d] %(message)s',
    datefmt='%d-%m-%Y:%H:%M:%S',

logger = logging.getLogger()

我将按如下方式使用它:

import custom_logger as cl
cl.logger.debug('Extracting locations and descriptors from %s' % image_path)

我正在从一个脚本运行我的 python 文件,在该脚本中我试图将日志记录重定向到 sout 和 serr 的不同文件中

nohup python3  "$CLASSPATH""$MAIN_CLASS" $MAIN_CLASS_ARGUMENT 1>>$SOUT_FILE 2>>$SERR_FILE & echo $! > $PID_FILE

使用当前设置,我可以获取 .err 文件中的所有日志

17-12-2018:17:56:59,203 INFO [conn.py:1008] Set configuration api_version=(0, 11, 0) to skip auto check_version requests on startup 17-12-2018:17:56:59,206 INFO [subscription_state.py:172] Updating subscribed topics to: ('PROCESSED_SCENES',) 17-12-2018:17:56:59,209 INFO [cluster.py:342] Group coordinator for my_group is BrokerMetadata(nodeId=0, host='172.1.1.3', port=9094, rack=None)

我尝试调整记录器以在每个文件中输出错误,但没有成功:

import logging, sys

class StdErrFilter(logging.Filter):
    def filter(self, rec):
        return rec.levelno in (logging.ERROR, logging.WARNING)

class StdOutFilter(logging.Filter):
    def filter(self, rec):
        return rec.levelno in (logging.DEBUG, logging.INFO)

logging.basicConfig(format='%(asctime)s,%(msecs)d %(levelname)-8s [%(filename)s:%(lineno)d] %(message)s',
    datefmt='%d-%m-%Y:%H:%M:%S',
    level=logging.INFO)

formatter = logging.Formatter('%(asctime)s,%(msecs)d %(levelname)-8s [%(filename)s:%(lineno)d] %(message)s','%d-%m-%Y:%H:%M:%S')

logger = logging.getLogger()


h1 = logging.StreamHandler(sys.stdout)
h1.setFormatter(formatter)
h1.addFilter(StdOutFilter())
logger.addHandler(h1)

h2 = logging.StreamHandler(sys.stderr)
h2.setFormatter(formatter)
h2.addFilter(StdErrFilter())
logger.addHandler(h2)

我现在得到的只是在两个 .err .out 文件中具有相同的输出。

我错过了什么?

最佳答案

basicConfig 配置处理程序,因此您拥有 h1h2 和基本日志记录。也许这会引起困惑?此外,您还需要为记录器执行 logger.setLevel(logging.DEBUG) 来处理调试级别。

删除 basicConfig 并添加 setLevel 似乎按预期工作:

import logging, sys

class StdErrFilter(logging.Filter):
    def filter(self, rec):
        return rec.levelno in (logging.ERROR, logging.WARNING)

class StdOutFilter(logging.Filter):
    def filter(self, rec):
        return rec.levelno in (logging.DEBUG, logging.INFO)

formatter = logging.Formatter('%(asctime)s,%(msecs)d %(levelname)-8s [%(filename)s:%(lineno)d] %(message)s','%d-%m-%Y:%H:%M:%S')
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

h1 = logging.StreamHandler(sys.stdout)
h1.setFormatter(formatter)
h1.addFilter(StdOutFilter())
logger.addHandler(h1)

h2 = logging.StreamHandler(sys.stderr)
h2.setFormatter(formatter)
h2.addFilter(StdErrFilter())
logger.addHandler(h2)

logger.info('stdout log')
logger.error('stderr log')

关于python - 如何自定义 python 记录器行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53819823/

相关文章:

java - Eclipse LogCat 不保留文本

python - 如何反转 CANTERA Python 模块中的 adiabetic.py 程序,使其输入绝热温度并给出输出入口温度?

python - Entry.place(X,Y) 不起作用

java - 访问 Java 堆栈帧

带有 xml.etree.ElementTree : multiple conditions 的 Python xpath

python - PYQT5 中的布局大小

logging - 审计/日志数据库有哪些好的 NoSQL 和非关系型数据库解决方案

c++ - Visual Studio 2012 Boost.Python 集成

python - 使用 Rauth 为 vk.com 实现 OAuth2

python - 无法阻止显示弃用警告