version: 1

formatters:
  precise:
    {% if include_worker_name_in_log_line %}
    format: '{{ worker_name }} | %(asctime)s - %(name)s - %(lineno)d - %(levelname)s - %(request)s - %(message)s'
    {% else %}
    format: '%(asctime)s - %(name)s - %(lineno)d - %(levelname)s - %(request)s - %(message)s'
    {% endif %}

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:
    # This is just here so we can leave `loggers` in the config regardless of whether
    # we configure other loggers below (avoid empty yaml dict error).
    _placeholder:
        level: "INFO"

    {% if not SYNAPSE_LOG_SENSITIVE %}
    {#
      If SYNAPSE_LOG_SENSITIVE is unset, then override synapse.storage.SQL to INFO
      so that DEBUG entries (containing sensitive information) are not emitted.
    #}
    synapse.storage.SQL:
        # beware: increasing this to DEBUG will make synapse log sensitive
        # information such as access tokens.
        level: INFO
    {% endif %}

    {% if SYNAPSE_LOG_TESTING %}
    {#
      If Synapse is under test, log a few more useful things for a developer
      attempting to debug something particularly tricky.

      With `synapse.visibility.filtered_event_debug`, it logs when events are (maybe
      unexpectedly) filtered out of responses in tests. It's just nice to be able to
      look at the CI log and figure out why an event isn't being returned.
    #}
    synapse.visibility.filtered_event_debug:
        level: DEBUG

    {#
      If Synapse is under test, we don't care about seeing the "Applying schema" log
      lines at the INFO level every time we run the tests (it's 100 lines of bulk)
    #}
    synapse.storage.prepare_database:
      level: WARN
    {% endif %}

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

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

disable_existing_loggers: false
