正确的日志记录(python)格式未使用 watchtower 发送到 Cloudwatch
Correct logging(python) format is not being sent to Cloudwatch using watchtower
我编写了以下代码来启用 Cloudwatch 支持。
import logging
from boto3.session import Session
from watchtower import CloudWatchLogHandler
logging.basicConfig(level=logging.INFO,format='[%(asctime)s.%(msecs).03d] [%(name)s,%(funcName)s:%(lineno)s] [%(levelname)s] %(message)s',datefmt='%d/%b/%Y %H:%M:%S')
log = logging.getLogger('Test')
boto3_session = Session(aws_access_key_id=AWS_ACCESS_KEY_ID,
aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
region_name=REGION_NAME)
cw_handler = CloudWatchLogHandler(log_group=CLOUDWATCH_LOG_GROUP_NAME,stream_name=CLOUDWATCH_LOG_STREAM_NAME,boto3_session=boto3_session)
log.addHandler(cw_handler)
每当我尝试打印任何记录器语句时,我在本地系统和 cloudwatch 上都会得到不同的输出。
示例:
log.info("Hello world")
上述记录器语句在我的本地系统(终端)上的输出:
[24/Feb/2019 15:25:06.969] [Test,<module>:1] [INFO] Hello world
cloudwatch(日志流)上上述记录器语句的输出:
Hello world
有没有我遗漏的东西?
在 Lambda 执行环境中,根记录器已经预先配置。您将不得不使用它或解决它。您可以执行以下操作:
您可以直接在根记录器上设置格式:
root = logging.getLogger()
root.setLevel(logging.INFO)
root.handlers[0].setFormatter(logging.Formatter(fmt='[%(asctime)s.%(msecs).03d] [%(name)s,%(funcName)s:%(lineno)s] [%(levelname)s] %(message)s', datefmt='%d/%b/%Y %H:%M:%S'))
您可以向其中添加 Watchtower 处理程序(免责声明:我没有尝试过这种方法):
root = logging.getLogger()
root.addHandler(cw_handler)
不过我想知道您是否需要使用 Watchtower。在 Lambda 中,您打印到 stdout
的每一行(因此即使只是使用 print
)都会记录到 Cloudwatch。所以使用标准 logging
接口可能就足够了。
这对我有用
import logging
import watchtower
watch = watchtower.CloudWatchLogHandler()
watch.setFormatter(fmt = logging.Formatter('%(levelname)s - %(module)s - %(message)s'))
logger = logging.getLogger()
logger.addHandler(watch)
我编写了以下代码来启用 Cloudwatch 支持。
import logging
from boto3.session import Session
from watchtower import CloudWatchLogHandler
logging.basicConfig(level=logging.INFO,format='[%(asctime)s.%(msecs).03d] [%(name)s,%(funcName)s:%(lineno)s] [%(levelname)s] %(message)s',datefmt='%d/%b/%Y %H:%M:%S')
log = logging.getLogger('Test')
boto3_session = Session(aws_access_key_id=AWS_ACCESS_KEY_ID,
aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
region_name=REGION_NAME)
cw_handler = CloudWatchLogHandler(log_group=CLOUDWATCH_LOG_GROUP_NAME,stream_name=CLOUDWATCH_LOG_STREAM_NAME,boto3_session=boto3_session)
log.addHandler(cw_handler)
每当我尝试打印任何记录器语句时,我在本地系统和 cloudwatch 上都会得到不同的输出。
示例:
log.info("Hello world")
上述记录器语句在我的本地系统(终端)上的输出:
[24/Feb/2019 15:25:06.969] [Test,<module>:1] [INFO] Hello world
cloudwatch(日志流)上上述记录器语句的输出:
Hello world
有没有我遗漏的东西?
在 Lambda 执行环境中,根记录器已经预先配置。您将不得不使用它或解决它。您可以执行以下操作:
您可以直接在根记录器上设置格式:
root = logging.getLogger()
root.setLevel(logging.INFO)
root.handlers[0].setFormatter(logging.Formatter(fmt='[%(asctime)s.%(msecs).03d] [%(name)s,%(funcName)s:%(lineno)s] [%(levelname)s] %(message)s', datefmt='%d/%b/%Y %H:%M:%S'))
您可以向其中添加 Watchtower 处理程序(免责声明:我没有尝试过这种方法):
root = logging.getLogger()
root.addHandler(cw_handler)
不过我想知道您是否需要使用 Watchtower。在 Lambda 中,您打印到 stdout
的每一行(因此即使只是使用 print
)都会记录到 Cloudwatch。所以使用标准 logging
接口可能就足够了。
这对我有用
import logging
import watchtower
watch = watchtower.CloudWatchLogHandler()
watch.setFormatter(fmt = logging.Formatter('%(levelname)s - %(module)s - %(message)s'))
logger = logging.getLogger()
logger.addHandler(watch)