【问题标题】:Log streams are random hash instead of logger name日志流是随机散列而不是记录器名称
【发布时间】:2022-01-08 05:36:18
【问题描述】:

最近我将我的应用程序移到了一个 docker 容器中。

我注意到,日志组的日志流将其名称更改为某个随机散列。

在迁移到 docker 之前:

移到docker后:

每个文件中的记录器被初始化为

logger = logging.getLogger(__name__)

记录器的配置是在__main__ 中设置的

def setup_logger(config_file):
    with open(config_file) as log_config:
        config_yml = log_config.read()
        config_dict = yaml.safe_load(config_yml)
        logging.config.dictConfig(config_dict)

从这个文件加载配置

version: 1
disable_existing_loggers: False
formatters:
  json:
    format: "[%(asctime)s] %(process)d %(levelname)s %(name)s:%(funcName)s:%(lineno)s - %(message)s"
  plaintext:
    format: "%(asctime)s %(levelname)s %(name)s - %(message)s"
    datefmt: "%Y-%m-%d %H:%M:%S"
handlers:
  console:
    class: logging.StreamHandler
    formatter: plaintext
    level: INFO
    stream: ext://sys.stdout
root:
  level: DEBUG
  propagate: True
  handlers: [console]

docker 镜像使用标志运行

--log-driver=awslogs \
      --log-opt awslogs-group=XXXXX \
      --log-opt awslogs-create-group=true \

有没有办法保留原始日志流名称?

【问题讨论】:

    标签: python amazon-web-services docker amazon-cloudwatch


    【解决方案1】:

    这就是 awslogs 驱动程序的工作原理。

    根据documentation,您可以使用awslogs-stream-prefix 选项在一定程度上控制名称:

    awslogs-stream-prefix 选项允许您将日志流与指定的前缀、容器名称和容器所属的 Amazon ECS 任务的 ID 相关联。如果您使用此选项指定前缀,则日志流采用以下格式:

    前缀名/容器名/ecs-task-id

    如果您不使用此选项指定前缀,则日志流以容器实例上的 Docker 守护程序分配的容器 ID 命名。由于仅使用 Docker 容器 ID(仅在容器实例上可用)很难将日志追溯到发送它们的容器,因此我们建议您使用此选项指定前缀。

    如果您使用的是 awslogs 驱动程序,则无法更改此行为。唯一的选择是禁用日志驱动程序并使用 AWS 开发工具包手动将事件放入 CloudWatch,但我认为这不是一个好主意。

    需要明确的是,在使用 awslogs 时,您的容器设置/代码根本不会影响流名称 - 日志驱动程序只是将容器的所有 STDOUT 重定向到 CloudWatch。

    【讨论】:

    • 感谢您的澄清。 awslogs-stream-prefix 只允许我为整个容器设置前缀,而不是像以前那样为每个文件设置前缀 - 我理解正确吗?
    • 是的。来自答案:“如果您使用此选项指定前缀,则日志流采用以下格式:prefix-name/container-name/ecs-task-id”
    猜你喜欢
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 2018-01-26
    • 1970-01-01
    相关资源
    最近更新 更多