Home > Blockchain >  Log streams are random hash instead of logger name
Log streams are random hash instead of logger name

Time:12-03

so recently I moved my app into a docker container.

I noticed, that the log streams of the log group changed its names to some random hash.

Before moving to docker:

enter image description here

After moving to docker:

enter image description here

The logger in each file is initialized as

logger = logging.getLogger(__name__)

The logger's config is set up inside the __main__ with

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)

with the config loaded from this file

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]

The docker image is run with the flags

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

Is there a way to keep the original log stream names?

CodePudding user response:

That's how the awslogs driver works.

Per the documentation, you can control the name somewhat using the awslogs-stream-prefix option:

The awslogs-stream-prefix option allows you to associate a log stream with the specified prefix, the container name, and the ID of the Amazon ECS task to which the container belongs. If you specify a prefix with this option, then the log stream takes the following format:

prefix-name/container-name/ecs-task-id

If you don't specify a prefix with this option, then the log stream is named after the container ID that is assigned by the Docker daemon on the container instance. Because it is difficult to trace logs back to the container that sent them with just the Docker container ID (which is only available on the container instance), we recommend that you specify a prefix with this option.

You cannot change this behavior if you're using the awslogs driver. The only option would be to disable the log driver and use the AWS SDK to put the events into CloudWatch manually, but I don't think that'd be a good idea.

To be clear, your container settings/code don't affect the stream name at all when using awslogs - the log driver is just redirecting all of the container's STDOUT to CloudWatch.

  • Related