---
tags:
 - logging
---

# kumo.aaa.configure_acct_log

{{since('2026.03.04-bb93ecb1')}}

```lua
kumo.on('init', function()
  kumo.aaa.configure_acct_log(PARAMS)
end)
```

This function configures and enables the *accounting* logs for both
authentication and authorization.

This function is intended to be called during the `init` or `pre_init` event callback.
Calling it multiple times is an error.

`PARAMS` is an object style lua table that can have fields as described in the
[Log Parameters](#log-parameters) section below.

The minimal configuration looks like:

```lua
kumo.on('init', function()
  kumo.aaa.configure_acct_log {
    log_dir = '/var/log/kumo-logs/acct',
    -- If you find that the logs are big and busy, you might consider
    -- disabling logging successful authentication and authorization
    -- events, leaving the logs to focus on failures
    -- log_authn_ok = false,
    -- log_authz_allow = false,
  }
end)
```

Logs are written as zstd-compressed log file segments under the specified
`log_dir` directory. Each line of the file is a JSON object holding information
about an authentication or authorization event.

## Log Records

There are two types of records that could be logged to the accounting log:

### Authentication Events

```json
{
  // Indicates that this is an Authentication record
  "type": "Authentication",
  // When the event occurred
  "timestamp":"2025-12-18T06:52:47.798373949Z",
  // Who were they trying to authenticate as?
  "attempted_identity": {
    // the username, if known (in some contexts, we may not
    // have a human readable identity string, and this may be
    // an empty string)
    "identity": "daniel",
    // How were they trying to authenticate?
    "context": "HttpBasicAuth"
  },
  // Was authentication successful?
  "success": false,
  // The auth info from the session, which will include the
  // attempted_identity if the authentication was successful
  "auth_info": {
    // The IP address of the system making the request
    "peer_address": "127.0.0.1",
    // The set of identities which are active for the session
    "identities": [],
    // any groups that are active for the session
    "groups": [
      "kumomta:http-listener-trusted-ip"
    ]
  }
}
```

### Authorization Events

```json
{
  // Indicates that this is an Authorization record
  "type": "Authorization",
  // When the event occurred
  "timestamp":"2025-12-18T06:52:47.798373949Z",
  // Which resource was being accessed?
  "target_resource": "http_listener/0.0.0.0:8000/api/admin/suspend/v1",
  // What privilege was being requested of that resource?
  "privilege": "GET",
  // Was access `Allow`d or `Deny`d?
  "access": "Allow",
  // If an ACL rule was responsible for deciding the access level,
  // which resource did that rule belong to?  This aids in tracing
  // and debugging ACL rules.  This may be missing or null if
  // no rule matched.
  "matching_resource": "http_listener/*/api/admin",
  // If a rule matched, this is a copy of that matching rule, to aid
  // in tracing and debugging ACL rules.
  "rule": {
    "criteria": {
      "Identity": {
        "Group": "kumomta:http-listener-trusted-ip"
      }
    },
    "privilege": "GET",
    "access": "Allow"
  },
  // A copy of the auth info from the session
  "auth_info": {
    "peer_address": "127.0.0.1",
    "identities": [],
    "groups": [
      "kumomta:http-listener-trusted-ip"
    ]
  },
  // A list of the resources that were considered, in the order that
  // they were considered, before we reached the matching_resource.
  // This aids in tracing and debugging ACL rules.
  "considered_resources": [
    "http_listener/0.0.0.0:8000/api/admin/suspend/v1",
    "http_listener/0.0.0.0:8000/api/admin/suspend",
    "http_listener/0.0.0.0:8000/api/admin",
    "http_listener/0.0.0.0:8000/api",
    "http_listener/0.0.0.0:8000",
    "http_listener/*/api/admin/suspend/v1",
    "http_listener/*/api/admin/suspend"
  ]
}
```


## Log Parameters

### log_authz_allow

If set to `true` (the default), then successful authorization events will be logged.

### log_authz_deny

If set to `true` (the default), then failed authorization events will be logged.

### log_authn_ok

If set to `true` (the default), then successful authentication events will be logged.

### log_authn_fail

If set to `true` (the default), then failed authentication events will be logged.

### back_pressure

Maximum number of outstanding items to be logged before
the submission will block; helps to avoid runaway issues
spiralling out of control.

```lua
kumo.aaa.configure_acct_log {
  -- ..
  back_pressure = 128000,
}
```

### compression_level

Specifies the level of *zstd* compression that should be used.  Compression
cannot be disabled.

Specifying `0` uses the zstd default compression level, which is `3` at the
time of writing.

Possible values are `1` (cheapest, lightest) through to `21`.

```lua
kumo.aaa.configure_acct_log {
  -- ..
  compression_level = 3,
}
```

### log_dir

Specifies the directory into which log file segments will be written.
This is a required key; there is no default value.

```lua
kumo.aaa.configure_acct_log {
  -- ..
  log_dir = '/var/log/kumo-logs/acct',
}
```

### max_file_size

Specify how many uncompressed bytes to allow per file segment. When this number
is exceeded, the current segment is finished and a new segment is created.

Segments are created using the current time in the form `YYYYMMDD-HHMMSS` so that
it is easy to sort the segments in chronological order.

The default value is ~1GB of uncompressed data, which compresses down to around
50MB of data per segment with the default compression settings.

```lua
kumo.aaa.configure_acct_log {
  -- ..
  max_file_size = 1000000000,
}
```

### max_segment_duration

Specify the maximum time period for a file segment.  The default is unlimited.

If you set this to `"1min"`, you indicate that any given file should cover a
time period of 1 minute in duration; when that time period elapses, the current
file segment, if any, will be flushed and closed and any subsequent events will
cause a new file segment to be created.

```lua
kumo.aaa.configure_acct_log {
  -- ..
  max_segment_duration = '5 minutes',
}
```

### min_free_inodes

Specifies the desired minimum amount of free inodes for the log storage
in this location.  Can be specified using either a string like `"10%"` to
indicate the percentage of available inodes, or a number to indicate the
number of available inodes.

If the available inodes are below the specified amount then kumomta will
reject incoming SMTP and HTTP injection requests and the
[check-liveness](../http/kumod/api_check_liveness_v1_get.md) endpoint will indicate
that new messages cannot be received.

The default value for this option is `"10%"`.


### min_free_space

Specifies the desired minimum amount of free disk space for the log storage
in this location.  Can be specified using either a string like `"10%"` to
indicate the percentage of available space, or a number to indicate the
number of available bytes.

If the available storage is below the specified amount then kumomta will
reject incoming SMTP and HTTP injection requests and the
[check-liveness](../http/kumod/api_check_liveness_v1_get.md) endpoint will indicate
that new messages cannot be received.

The default value for this option is `"10%"`.

