version: 1

formatters:
  precise:
    format: '%(asctime)s - %(name)s - %(lineno)d - %(levelname)s - %(request)s - %(message)s'

handlers:
{% if LOG_FILE_PATH %}
  file:
    class: logging.handlers.TimedRotatingFileHandler
    formatter: precise
    filename: {{ LOG_FILE_PATH }}
    when: "midnight"
    backupCount: 6  # Does not include the current log file.
    encoding: utf8

  # Default to buffering writes to log file for efficiency.
  # WARNING/ERROR logs will still be flushed immediately, but there will be a
  # delay (of up to `period` seconds, or until the buffer is full with
  # `capacity` messages) before INFO/DEBUG logs get written.
  buffer:
    class: synapse.logging.handlers.PeriodicallyFlushingMemoryHandler
    target: file

    # The capacity is the maximum number of log lines that are buffered
    # before being written to disk. Increasing this will lead to better
    # performance, at the expensive of it taking longer for log lines to
    # be written to disk.
    # This parameter is required.
    capacity: 10

    # Logs with a level at or above the flush level will cause the buffer to
    # be flushed immediately.
    # Default value: 40 (ERROR)
    # Other values: 50 (CRITICAL), 30 (WARNING), 20 (INFO), 10 (DEBUG)
    flushLevel: 30  # Flush immediately for WARNING logs and higher

    # The period of time, in seconds, between forced flushes.
    # Messages will not be delayed for longer than this time.
    # Default value: 5 seconds
    period: 5
{% endif %}

  console:
    class: logging.StreamHandler
    formatter: precise

loggers:
    synapse.storage.SQL:
        # beware: increasing this to DEBUG will make synapse log sensitive
        # information such as access tokens.
        level: INFO

root:
    level: {{ SYNAPSE_LOG_LEVEL or "INFO" }}

{% if LOG_FILE_PATH %}
    handlers: [console, buffer]
{% else %}
    handlers: [console]
{% endif %}

disable_existing_loggers: false