如何自定义 python 记录器行为?
How to customize python logger behavior?
我已经实现了我的另一个 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
配置一个处理程序,因此您有 h1
、h2
和基本日志记录。也许这会引起混淆?您还需要为记录器执行 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 类 使用的 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
配置一个处理程序,因此您有 h1
、h2
和基本日志记录。也许这会引起混淆?您还需要为记录器执行 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')