- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这个问题:我定义了一个带有 SMTPHandler、TimedRotatingFileHandler 和 StreamHandler 的 python 记录器。
StreamHandler 工作正常,但是当我尝试从 python-telegram-bot 处理程序使用它时,该行以两种不同的格式在标准输出上打印两次,我无法找到如何避免一个和让另一个(定时的)留下来。
我已经找到原因了。添加带有 CallbackQueryHandler 的 ConversationHandler 时,此消息会在启动时显示。
WARNING:root:If 'per_message=False', 'CallbackQueryHandler' will not be tracked for every message.
然后每次都会出现不需要的日志行。
下面的代码是 log_config.py 。我还添加了用于测试 my_main_file.py 的示例代码和作为多行注释的当前输出。
config/log_config.py:
import os
import logging
from logging import Formatter
from datetime import datetime
VERSION_NUM = '1.2.0'
LOG_MSG_FORMAT = '%(asctime)s - ({0}) %(levelname)s - %(name)s - %(message)s'
LOGFILE_PATH = os.path.join(os.path.dirname(os.path.dirname(__file__)),
'log',
'alfred.log')
logging.getLogger('telegram').setLevel(logging.WARNING)
logging.getLogger('chardet.charsetprober').setLevel(logging.WARNING)
def my_timezone_time(*args):
# I simplified this line, because it's irrelevant
return datetime.now().timetuple()
handlers = []
#
# ... different handlers added
#
# last handler to add, this one works just as I want
ch = logging.StreamHandler()
formatter = Formatter(LOG_MSG_FORMAT.format(VERSION_NUM))
formatter.converter = my_timezone_time
ch.setFormatter(formatter)
ch.setLevel(logging.INFO)
handlers.append(ch)
def getLogger(name):
"""
Returns a logger for the file. Works fine but when used,
it always outputs the same line with the last handler
and also with an unknown handler not added by me
(must be some default instance)
:param name: the file name
:return: a logger
"""
logger = logging.getLogger(name)
logger.setLevel(logging.DEBUG)
for h in handlers:
logger.addHandler(h)
return logger
my_main_file.py:
#!/usr/bin/python3
from telegram.ext import (Updater, CommandHandler, ConversationHandler,
run_async, CallbackQueryHandler)
from config.log_config import getLogger
# Enable logging
logger = getLogger(__name__)
updater = Updater('......') # Replace with your bot token
# ************************** HANDLERS
# Define a few command handlers. These usually take the two arguments bot and
# update. Error handlers also receive the raised TelegramError object in error.
@run_async
def show_help(bot, update):
logger.info('HELP!')
def error_handler(bot, update, error):
logger.warning('La actualización "%s" causó el error "%s"', update, error)
def dumb_handler(bot, update, user_data):
return ConversationHandler.END
def main():
"""Start the bot."""
# Create the EventHandler and pass it your bot's token.
global updater
# Get the dispatcher to register handlers
dp = updater.dispatcher
# on different commands - answer in Telegram
dp.add_handler(CommandHandler('help', show_help))
# Add conversation handler with the states
# The telegram conversation handler needs a handler_list with functions
# so it can execute desired code in each state/step
conv_handler = ConversationHandler(
entry_points=[CommandHandler('irrelevant', dumb_handler,
pass_user_data=True)
],
states={
0: [CallbackQueryHandler(dumb_handler, pass_user_data=True)],
},
fallbacks=[],
)
dp.add_handler(conv_handler)
# log all errors
dp.add_error_handler(error_handler)
updater.start_polling()
updater.idle()
if __name__ == '__main__':
main()
"""
OUTPUT when used /help from the bot chat
(First is my wished output, second is the line I want to avoid)
------
2018-11-08 16:41:51,115 - (1.2.0) INFO - __main__ - HELP!
INFO:__main__:HELP!
"""
最佳答案
telegram.ext.ConversationHandler
包括几个使用 logging.warning
而不是他们可能应该使用的 self.logger
记录器的记录调用,例如this call :
for handler in all_handlers:
if isinstance(handler, CallbackQueryHandler):
logging.warning("If 'per_message=False', 'CallbackQueryHandler' will not be "
"tracked for every message.")
logging.warning
和其他模块级日志记录便利函数调用 logging.basicConfig
,如果根记录器上没有处理程序,它会向根记录器添加一个处理程序。该处理程序负责处理不需要的内容
INFO:__main__:HELP!
记录输出。
使用 logging.warning
而不是 self.logger.warning
应该被认为是一个 python-telegram-bot 错误。我在他们的 issue tracker 上没有看到它的未解决问题,因此您可能想要提交错误报告。
与此同时,或者如果 python-telegram-bot 开发人员认为行为正常,您可以向根记录器添加一个空处理程序以防止 basicConfig
添加自己的处理程序。这必须在创建 ConversationHandler
之前完成,以抢占 basicConfig
:
logging.getLogger().addHandler(logging.NullHandler())
关于使用 ptb : Same line logged twice but only one handler added 进行 Python 日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53199040/
在我的应用中,我使用 IntentService 发送短信。 @Override protected void onHandleIntent(Intent intent) { Bund
Handler(android.os.Handler.Callback) 已弃用,我应该改用什么? Handler handler = new Handler(new Handler.Callback
机器人Handler类包含此方法: public final boolean postAtTime (Runnable r, Object token, long uptimeMillis) 在给定时
我不明白怎么用这个方法, sensorManager.registerListener(SensorEventListener listener, Sensor sensor, int rate, H
请告诉我 handler.postAtTime 和 handler.postDelayed 在 android 中的区别,也请指导我何时使用 handler.postAtTime 以及何时使用 han
我有以下代码。 function myFun() { alert(5) } $(document).ready(fu
我有this jsfiddle 它使用 toggle event - 不要与 toggle 混淆- jQuery 版本设置为 EDGE 它突然停止工作并删除了我想要作为触发器的单元格,因为它显然恢复为
在我的应用程序中,我定义了一个自定义事件,我希望为其设置默认处理程序。如果任何 Controller /服务想要覆盖默认处理,他们可以通过添加自己的处理程序来实现。 为了实现这个场景,我在 $root
我在我的网页中使用了 jquery .toggle(between two functions) : $( ".cpUpbtnsclass" ).toggle(function() { c
我有this jsfiddle 它使用 toggle event - 不要与 toggle 混淆- jQuery 版本设置为 EDGE 它突然停止工作并删除了我想要作为触发器的单元格,因为它显然恢复为
我浏览了官方文档,但我似乎找不到 new Handler() 之间是否有任何区别和new Handler(Looper.myLooper()) new Handler() Default constr
当我在 faces-config.xml 文件中添加以下行时: " com.sun.facelets.FaceletViewHandler " eclipse 说: " view-handler re
当我使用 Handler.dispatchMessage(msg) 时,handleMessage(Message msg) 将在新线程上运行,但是当我使用 Handler.sendMessage(
如何禁用当前将模态库导航到下一张图像的鼠标滚轮处理程序和键盘箭头键? 这里是演示站点:http://blueimp.github.com/Bootstrap-Image-Gallery/ . 如果您单
我正在尝试关注 this关于 Win32 结构化异常处理的文章。这篇文章很老了,但仍然被认为是对该主题的一个很好的介绍。 我正在尝试从下面转载的文章中编译代码示例 - //==============
我正在尝试使用 HibernateValidator 使用 Spring 和 Hibernate 在 JSP 中验证一个简单的表单. JSP页面Temp.jsp如下(web.xml中的url ptte
问题几乎概括了它。我错误地导入了 java.util.logging 并且没有获得所需的功能。现在我解决了我的问题,但我想知道为什么 android 创建了两个 Handler 。我们可能会错误地导入
我有一个主页,其中有一个链接按钮。在其中一个内容页面中,我需要隐藏链接按钮并替换为图像按钮。图像按钮的单击事件处理程序应该与母版页中链接按钮的单击事件完全相同。那么有没有办法从内容页面中的图像按钮单击
我有一个用 2.5 编写的现有 Spring MVC 应用程序。 我想使用新的注释 Controller 。我在某种程度上发现它非常灵活并且可以满足我的其他需求。 我的问题是,我似乎无法将它们两者混合
使用最新的 XCode,我收到此错误: 'logInWithReadPermissions(_:handler:)' is deprecated: use logInWithReadPermissi
我是一名优秀的程序员,十分优秀!