Unverified Commit cb67bb03 authored by Maximilian Bosch's avatar Maximilian Bosch
Browse files

nixos/matrix-synapse: mergeable log configuration

Right now there's no trivial way to override parts of synapse's log
config such as the log-level because the only thing that's changeable is
the path to the log-file used by synapse and its workers.

Now, there's a new option called `services.matrix-synapse.log`
which contains the default log config as Nix attribute-set (except
`handlers.journal.SYSLOG_IDENTIFIER`). It has default priority, so new
things can be added like

    services.matrix-synapse.log = {
      my.extra.field = 23;
    }

without discarding the rest. If desired, this can still be done via
`lib.mkForce`.

If the log configuration for a single worker or synapse, but not all
workers should be changed, `services.matrix-synapse.settings.log_config`
or `services.matrix-synapse.workers._name_.worker_log_config`
can be used.
parent 67252742
Loading
Loading
Loading
Loading
+58 −22
Original line number Diff line number Diff line
@@ -70,13 +70,12 @@ let
    inherit (cfg) plugins;
  };

  logConfig = logName: {
  defaultCommonLogConfig = {
    version = 1;
    formatters.journal_fmt.format = "%(name)s: [%(request)s] %(message)s";
    handlers.journal = {
      class = "systemd.journal.JournalHandler";
      formatter = "journal_fmt";
      SYSLOG_IDENTIFIER = logName;
    };
    root = {
      level = "INFO";
@@ -84,33 +83,27 @@ let
    };
    disable_existing_loggers = false;
  };

  defaultCommonLogConfigText = generators.toPretty { } defaultCommonLogConfig;

  logConfigText = logName:
    let
      expr = ''
        {
          version = 1;
          formatters.journal_fmt.format = "%(name)s: [%(request)s] %(message)s";
          handlers.journal = {
            class = "systemd.journal.JournalHandler";
            formatter = "journal_fmt";
            SYSLOG_IDENTIFIER = "${logName}";
          };
          root = {
            level = "INFO";
            handlers = [ "journal" ];
          };
          disable_existing_loggers = false;
        };
      '';
    in
    lib.literalMD ''
      Path to a yaml file generated from this Nix expression:

      ```
      ${expr}
      ${generators.toPretty { } (
        recursiveUpdate defaultCommonLogConfig { handlers.journal.SYSLOG_IDENTIFIER = logName; }
      )}
      ```
    '';
  genLogConfigFile = logName: format.generate "synapse-log-${logName}.yaml" (logConfig logName);

  genLogConfigFile = logName: format.generate
    "synapse-log-${logName}.yaml"
    (cfg.log // optionalAttrs (cfg.log?handlers.journal) {
      handlers.journal = cfg.log.handlers.journal // {
        SYSLOG_IDENTIFIER = logName;
      };
    });
in {

  imports = [
@@ -394,6 +387,47 @@ in {
        '';
      };

      log = mkOption {
        type = types.attrsOf format.type;
        defaultText = literalExpression defaultCommonLogConfigText;
        description = mdDoc ''
          Default configuration for the loggers used by `matrix-synapse` and its workers.
          The defaults are added with the default priority which means that
          these will be merged with additional declarations. For instance
          the log-level for synapse and its workers can be changed like this:

          ```nix
          { lib, ... }: {
            services.matrix-synapse.log.root.level = lib.mkForce "WARNING";
          }
          ```

          And another field can be added like this:

          ```nix
          {
            services.matrix-synapse.log = {
              loggers."synapse.http.matrixfederationclient".level = "DEBUG";
            };
          }
          ```

          Additionally, the field `handlers.journal.SYSLOG_IDENTIFIER` will be added to
          each log config, i.e.
          * `synapse` for `matrix-synapse.service`
          * `synapse-<worker name>` for `matrix-synapse-worker-<worker name>.service`

          This is only done if this option has a `handlers.journal` field declared.

          To discard all settings declared by this option for each worker and synapse,
          `lib.mkForce` can be used.

          To discard all settings declared by this option for a single worker or synapse only,
          [](#opt-services.matrix-synapse.workers._name_.worker_log_config) or
          [](#opt-services.matrix-synapse.settings.log_config) can be used.
        '';
      };

      settings = mkOption {
        default = { };
        description = mdDoc ''
@@ -1008,6 +1042,8 @@ in {
    # default them, so they are additive
    services.matrix-synapse.extras = defaultExtras;

    services.matrix-synapse.log = defaultCommonLogConfig;

    users.users.matrix-synapse = {
      group = "matrix-synapse";
      home = cfg.dataDir;