Skip to content

Monolog logging (zmsslim)

ZMS applications use a single PSR-3 logger on the global App class: App::$log. It is configured in zmsslim by BO\Slim\Bootstrap and shared by all Slim-based modules (zmsapi, zmsadmin, zmscitizenapi, …).

The minimum log level is also centralized in zmsslim: you set DEBUGLEVEL once in the environment; zmsslim exposes it as ZMS_DEBUGLEVEL, and every module’s App::DEBUGLEVEL inherits that value for Bootstrap::configureLogger().

Quick reference

TopicDetail
Logger propertyApp::$log (Monolog\Logger, null before bootstrap)
Env variableDEBUGLEVEL (e.g. in .env, DDEV, deployment) — default INFO
zmsslim defineZMS_DEBUGLEVEL — set in Application.php from getenv('DEBUGLEVEL')
App constantApp::DEBUGLEVEL — each module inherits ZMS_DEBUGLEVEL from \BO\Slim\Application
Effective minimum levelWhichever of the above applies after bootstrap (App::DEBUGLEVEL at runtime)
Web bootstrap\BO\Slim\Bootstrap::init()
CLI / cron\BO\Slim\Bootstrap::ensureLogger() or initForCli() via script_bootstrap.php
OutputJSON lines to stderr (web) or stdout (CLI/cron)
Do not usePHP error_log(), print_r(), echo for application logging

Central debug level (ZMS_DEBUGLEVEL)

zmsslim owns the debug-level wiring for all Slim modules. You do not configure a separate log level per module in production; one environment variable applies everywhere that bootstraps through \BO\Slim\Bootstrap.

flowchart LR
  env["DEBUGLEVEL env"]
  zms["ZMS_DEBUGLEVEL\n(zmsslim Application.php)"]
  app["App::DEBUGLEVEL\n(each module App)"]
  boot["Bootstrap::configureLogger()"]
  mono["Monolog minimum level\n(App::$log)"]

  env --> zms --> app --> boot --> mono
  1. Operations set DEBUGLEVEL (for example INFO or WARNING) in .env, DDEV, or deployment config.
  2. When zmsslim/src/Slim/Application.php is loaded, it defines ZMS_DEBUGLEVEL from that env var (default INFO if unset).
  3. \BO\Slim\Application declares const DEBUGLEVEL = ZMS_DEBUGLEVEL. Each module’s class App extends \BO\Zmsapi\Application (etc.) inherits the same constant unless you override it locally.
  4. On bootstrap, Bootstrap::init() / ensureLogger() / initForCli() call configureLogger(App::DEBUGLEVEL, App::IDENTIFIER). The level is shared; only App::IDENTIFIER and App::MODULE_NAME differ per module in the JSON output.

So ZMS_DEBUGLEVEL is the single zmsslim source of truth for how verbose logging is across zmsapi, zmsadmin, zmscitizenapi, zmsmessaging, cron scripts, and the other Slim apps.

What you configure: DEBUGLEVEL in the environment (not a separate ZMS_DEBUGLEVEL env name).

What code reads at runtime: App::DEBUGLEVEL (backed by ZMS_DEBUGLEVEL).

Rare override: a module config.php may redefine const DEBUGLEVEL = 'WARNING'; for local experiments only — avoid this in shared deployment config.

CLI fallback: if App::DEBUGLEVEL is not defined yet, Bootstrap::initForCli() reads getenv('DEBUGLEVEL') directly.

Log levels

App::DEBUGLEVEL (from ZMS_DEBUGLEVEL) sets the minimum level written by Monolog. Messages below that level are dropped.

DEBUGLEVEL env / constantMonolog constantTypical use in ZMS
DEBUGLogger::DEBUGVerbose diagnostics (mail payloads, cache details)
INFOLogger::INFONormal operations (login, cron progress, cache hits)
NOTICELogger::NOTICENotable but expected events
WARNINGLogger::WARNINGRecoverable problems (rate limits, skipped entities)
ERRORLogger::ERRORFailures that need attention
CRITICALLogger::CRITICALSevere errors (unhandled exceptions in Twig handler)
ALERTLogger::ALERTRare; same scale as Monolog
EMERGENCYLogger::EMERGENCYRare; same scale as Monolog

Implementation mapping lives in zmsslim/src/Slim/Bootstrap.php ($debuglevels and parseDebugLevel()).

Example configuration

bash
# .env / deployment / DDEV — applies to all Slim modules via zmsslim
DEBUGLEVEL=INFO

Definition in zmsslim/src/Slim/Application.php:

php
define('ZMS_DEBUGLEVEL', getenv('DEBUGLEVEL') ? getenv('DEBUGLEVEL') : 'INFO');
const DEBUGLEVEL = ZMS_DEBUGLEVEL;

Invalid values fall back to DEBUG (permissive) in Bootstrap::parseDebugLevel().

Per-module HTTP request logging

Unlike DEBUGLEVEL (one value for all Slim modules), HTTP request/response logging is configured per module via ZMS_<MODULE>_LOGGER_* environment variables — the same naming pattern as ZMS_ADMIN_TWIG_CACHE, ZMS_API_TWIG_CACHE, and so on.

Modules that register RequestLoggingMiddleware (via BO\Slim\Helper\ModuleLoggerInitializer or their own bootstrap) emit one structured HTTP Request line per handled request through BO\Slim\LoggerService::logRequest()App::$log.

Request log throttling only

…_LOGGER_MAX_REQUESTS and …_LOGGER_MAX_ERROR_REQUESTS are access-log throttles. They cap how many HTTP Request lines LoggerService::logRequest() writes per time window. They do not limit general application logging.

Logging pathThrottled by LOGGER_MAX_*?Controlled by
HTTP Request (status < 400)Yes — …_LOGGER_MAX_REQUESTSPer-module env + …_LOGGER_CACHE_TTL
HTTP Request (status ≥ 400)Only if …_LOGGER_MAX_ERROR_REQUESTS > 0Per-module env (default 0 = unlimited)
LoggerService::logError() (exceptions)No
LoggerService::logWarning() / logInfo()No
Direct App::$log->info() / warning() / error() in app codeNoDEBUGLEVEL

So: DEBUGLEVEL sets how verbose application logs are globally; LOGGER_MAX_* only prevents high-frequency modules (especially calldisplay and ticket printers) from flooding logs with routine successful requests.

Successful and failed request logs use separate counters and the same window length (…_LOGGER_CACHE_TTL, default 60 seconds). Throttling a successful poll does not block logging a later 500 on the same module.

ModuleEnv prefixTypical traffic
zmscitizenapiZMS_CITIZENAPI_LOGGER_*Public booking API
zmsapiZMS_API_LOGGER_*Internal REST API
zmsadminZMS_ADMIN_LOGGER_*Staff UI
zmscalldisplayZMS_CALLDISPLAY_LOGGER_*Display monitors (frequent polling)
zmsstatisticZMS_STATISTIC_LOGGER_*Statistics UI
zmsticketprinterZMS_TICKETPRINTER_LOGGER_*Ticket printers (frequent polling)

LoggerService variables

VariableDefaultRole
…_LOGGER_MAX_REQUESTS1000Max successful HTTP Request lines (status < 400) per rate-limit window (CACHE_TTL)
…_LOGGER_MAX_ERROR_REQUESTS0Max failed HTTP Request lines (status ≥ 400) per window; 0 = unlimited
…_LOGGER_RESPONSE_LENGTH1048576Max response body bytes considered when logging errors
…_LOGGER_STACK_LINES20Stack trace lines on logged exceptions
…_LOGGER_MESSAGE_SIZE8192Max size of a single log message
…_LOGGER_CACHE_TTL60Rate-limit window in seconds (uses CACHE_DIR)
…_LOGGER_MAX_RETRIES3Cache lock retries for rate limiting
…_LOGGER_BACKOFF_MIN / …_LOGGER_BACKOFF_MAX100 / 1000Backoff between retries (ms)
…_LOGGER_LOCK_TIMEOUT5Cache lock timeout (seconds)

See .ddev/.env.template / .devcontainer/.env.template for full examples per module.

Tuning high-frequency modules

zmscalldisplay and zmsticketprinter are special: every monitor or ticket printer typically polls the server every few seconds. With default LOGGER_MAX_REQUESTS=1000, a handful of devices can produce large, repetitive log volume even at DEBUGLEVEL=INFO.

For those modules, consider lowering ZMS_CALLDISPLAY_LOGGER_MAX_REQUESTS and/or ZMS_TICKETPRINTER_LOGGER_MAX_REQUESTS so routine poll traffic does not dominate your log stream. Admin, API, and citizen modules usually keep the defaults.

bash
# Example: cap display/printer poll logging without affecting other modules
ZMS_CALLDISPLAY_LOGGER_MAX_REQUESTS=120
ZMS_TICKETPRINTER_LOGGER_MAX_REQUESTS=120

# Other modules can stay at the template default (1000)
ZMS_ADMIN_LOGGER_MAX_REQUESTS=1000
ZMS_API_LOGGER_MAX_REQUESTS=1000

Lowering …_LOGGER_MAX_REQUESTS throttles only successful HTTP Request lines (Monolog info, status < 400). Failed requests (status ≥ 400, Monolog error) use …_LOGGER_MAX_ERROR_REQUESTS instead; the default 0 means no cap.

These variables do not affect exceptions, warnings, info messages from other LoggerService methods, or direct App::$log->… calls elsewhere in the codebase.

How to log

After bootstrap.php or script_bootstrap.php:

php
\App::$log->info('Login successful', [
    'account' => $accountName,
]);

\App::$log->warning('Could not remove availability', [
    'availabilityId' => $availabilityId,
]);

\App::$log->error('SQL import failed', [
    'file' => basename($file),
    'exception' => $e->getMessage(),
]);

Use lowercase PSR-3 method names: debug, info, notice, warning, error, critical, alert, emergency.

Context arrays

Prefer structured context (second argument) over string concatenation. The JSON processor adds standard fields:

  • time_local, client_ip, remote_addr
  • application (App::IDENTIFIER)
  • module (App::MODULE_NAME)
  • cron, cron_name when ZMS_CRON_LOG / ZMS_CRON_NAME are set in cron shell scripts

Cron logging

Cron entrypoints export ZMS_CRON_LOG=1 and ZMS_CRON_NAME=zmsapi_hourly (example). Bootstrap::isCronLogging() adds searchable cron / cron_name fields to each JSON line.

Helpers such as zmsdb’s VerboseCronLogTrait use Bootstrap::normalizeLogLevelName() for configurable cron verbosity.

Libraries without full bootstrap

Shared packages (zmsdldb, zmsclient) may run without App. Use optional logging only when the class exists:

php
if (class_exists('\App', false) && isset(\App::$log)) {
    \App::$log->error('…', ['context' => $value]);
}

Do not use isset(\App::$log) alone — PHP will fatal if App is not loaded.

JSON log shape (example)

json
{
  "time_local": "2026-05-26T12:00:00+02:00",
  "client_ip": "127.0.0.1",
  "application": "zmsapi",
  "module": "zmsapi",
  "cron": true,
  "cron_name": "zmsapi_hourly",
  "message": "Migration check finished",
  "level": "INFO",
  "context": { "pending": 0 },
  "extra": []
}

Repository log inventory

The table below is generated automatically from App::$log->… calls in module PHP sources (excluding vendor/ and tests/). Regenerate locally:

bash
cd docs && npm run docs:log-inventory

It updates when you run npm run docs:dev or docs:build (VitePress config runs the generator first). Use the dropdown filters, search box, or click a column header to sort (toggle ascending/descending).

Generated: · 185 call(s) · Production PHP only (module src/cron/bin). Excludes vendor, tests, and test_mysql-style dev scripts under Importer/.

Showing 185 of 185 entries · sorted by module (asc)

zmsadmininfoLogin successfulzmsadmin/src/Zmsadmin/Index.php:87
zmsadmininfoLogin failed - invalid credentialszmsadmin/src/Zmsadmin/Index.php:105
zmsadmininfoUser already logged in - reusing existing sessionzmsadmin/src/Zmsadmin/Index.php:114
zmsadmininfoLogin failed - other errorzmsadmin/src/Zmsadmin/Index.php:130
zmsadmininfoUser logged outzmsadmin/src/Zmsadmin/Logout.php:34
zmsadminerrorOIDC Login errorzmsadmin/src/Zmsadmin/Oidc.php:52
zmsapiinfoDeleted availabilityzmsapi/src/Zmsapi/AvailabilityDelete.php:36
zmsapiinfoUpdated availabilityzmsapi/src/Zmsapi/AvailabilityListUpdate.php:112
zmsapiinfoCreated new availabilityzmsapi/src/Zmsapi/AvailabilityListUpdate.php:126
zmsapiwarningAvailabilityListUpdateFailed: Validation failedzmsapi/src/Zmsapi/AvailabilityListUpdate.php:57
zmsapiwarningNo input data providedzmsapi/src/Zmsapi/AvailabilityListUpdate.php:231
zmsapiwarningInvalid availabilityListzmsapi/src/Zmsapi/AvailabilityListUpdate.php:236
zmsapiwarningMissing scope id in availabilityzmsapi/src/Zmsapi/AvailabilityListUpdate.php:255
zmsapiwarningInconsistent scopes in availability listzmsapi/src/Zmsapi/AvailabilityListUpdate.php:261
zmsapicritical(dynamic)zmsapi/src/Zmsapi/Helper/ErrorHandler.php:69
zmsapidebugSend mailzmsapi/src/Zmsapi/ProcessConfirmationMail.php:64
zmsapidebugSend mailzmsapi/src/Zmsapi/ProcessDeleteMail.php:65
zmsapierrorExpected ProcessListCollection, received different typezmsapi/src/Zmsapi/ProcessListByClusterAndDate.php:87
zmsapidebugSend mailzmsapi/src/Zmsapi/ProcessPreconfirmationMail.php:62
zmsapiinfoProcess redirectedzmsapi/src/Zmsapi/ProcessRedirect.php:45
zmsapiinfoProcess parkedzmsapi/src/Zmsapi/WorkstationProcessParked.php:46
zmscitizenapiinfoMethod not allowedzmscitizenapi/bootstrap.php:96
zmscitizenapiwarningInvalid Office skippedzmscitizenapi/src/Zmscitizenapi/Models/Collections/OfficeList.php:25
zmscitizenapiwarningInvalid OfficeServiceRelation skippedzmscitizenapi/src/Zmscitizenapi/Models/Collections/OfficeServiceRelationList.php:26
zmscitizenapiwarningInvalid Service skippedzmscitizenapi/src/Zmscitizenapi/Models/Collections/ServiceList.php:25
zmscitizenapiwarningInvalid ThinnedScope skippedzmscitizenapi/src/Zmscitizenapi/Models/Collections/ThinnedScopeList.php:25
zmsclientinfoAuth session setzmsclient/src/Zmsclient/Auth.php:25
zmsclientinfoAuth session removedzmsclient/src/Zmsclient/Auth.php:61
zmsclienterrorOIDC Login invalid statezmsclient/src/Zmsclient/OidcHandler.php:61
zmsclienterrorOIDC Login workstation errorzmsclient/src/Zmsclient/OidcHandler.php:120
zmsclientinfoOIDC Login state validationzmsclient/src/Zmsclient/OidcHandler.php:51
zmsclientinfoOIDC Login workstation accesszmsclient/src/Zmsclient/OidcHandler.php:91
zmsclientinfoOIDC Login department checkzmsclient/src/Zmsclient/OidcHandler.php:103
zmsdberrorSQL import failedzmsdb/src/Zmsdb/Cli/Db.php:44
zmsdbinfoImporting SQL filezmsdb/src/Zmsdb/Cli/Db.php:32
zmsdbinfoSQL import finishedzmsdb/src/Zmsdb/Cli/Db.php:59
zmsdbinfoUsing database connectionzmsdb/src/Zmsdb/Cli/Db.php:87
zmsdbinfoPending migrationzmsdb/src/Zmsdb/Cli/Db.php:127
zmsdbinfoMigration check finishedzmsdb/src/Zmsdb/Cli/Db.php:138
zmsdbinfoCluster cache setzmsdb/src/Zmsdb/Cluster.php:40
zmsdbinfoCluster cache invalidatedzmsdb/src/Zmsdb/Cluster.php:352
zmsdbinfoDepartment cache setzmsdb/src/Zmsdb/Department.php:35
zmsdbinfoDepartment cache invalidatedzmsdb/src/Zmsdb/Department.php:335
zmsdberrorAnonymization process failedzmsdb/src/Zmsdb/Helper/AnonymizeStatisticDataByCron.php:53
zmsdbinfoUsing retention period from admin system configzmsdb/src/Zmsdb/Helper/AnonymizeStatisticDataByCron.php:25
zmsdbinfoUsing default retention periodzmsdb/src/Zmsdb/Helper/AnonymizeStatisticDataByCron.php:30
zmsdbinfoBeginning anonymizationzmsdb/src/Zmsdb/Helper/AnonymizeStatisticDataByCron.php:40
zmsdbinfoAnonymization process completed successfullyzmsdb/src/Zmsdb/Helper/AnonymizeStatisticDataByCron.php:49
zmsdbnoticeAnonymization dry run — no database changeszmsdb/src/Zmsdb/Helper/AnonymizeStatisticDataByCron.php:58
zmsdbinfoDeleting quota older than given periodzmsdb/src/Zmsdb/Helper/ApiQuotaDeleteByCron.php:17
zmsdbinfoProcessing quotazmsdb/src/Zmsdb/Helper/ApiQuotaDeleteByCron.php:29
zmsdbinfoNo expired quota was foundzmsdb/src/Zmsdb/Helper/ApiQuotaDeleteByCron.php:36
zmsdbinfoQuota successfully removedzmsdb/src/Zmsdb/Helper/ApiQuotaDeleteByCron.php:47
zmsdbinfoKeep quotazmsdb/src/Zmsdb/Helper/ApiQuotaDeleteByCron.php:53
zmsdbwarningCould not remove quotazmsdb/src/Zmsdb/Helper/ApiQuotaDeleteByCron.php:50
zmsdbinfoReading availability listzmsdb/src/Zmsdb/Helper/AvailabilityDeleteByCron.php:25
zmsdbinfoWould remove availabilityzmsdb/src/Zmsdb/Helper/AvailabilityDeleteByCron.php:31
zmsdbinfoAvailability successfully removedzmsdb/src/Zmsdb/Helper/AvailabilityDeleteByCron.php:40
zmsdbwarningCould not remove availabilityzmsdb/src/Zmsdb/Helper/AvailabilityDeleteByCron.php:43
zmsdbinfoCalculateDailyWaitingStatisticByCron startedzmsdb/src/Zmsdb/Helper/CalculateDailyWaitingStatisticByCron.php:19
zmsdbinfoCalculateDailyWaitingStatisticByCron finishedzmsdb/src/Zmsdb/Helper/CalculateDailyWaitingStatisticByCron.php:25
zmsdbinfo[DRY RUN] update scope statisticszmsdb/src/Zmsdb/Helper/CalculateDailyWaitingStatisticByCron.php:195
zmsdbinfo(expression)zmsdb/src/Zmsdb/Helper/CalculateSlots.php:29
zmsdbinfo(expression)zmsdb/src/Zmsdb/Helper/CalculateSlots.php:42
zmsdbinfo(expression)zmsdb/src/Zmsdb/Helper/CleanProcessArchivedToday.php:24
zmsdbinfoExecuting archived process cleanup with commitzmsdb/src/Zmsdb/Helper/CleanProcessArchivedToday.php:32
zmsdbinfoArchived process cleanup completedzmsdb/src/Zmsdb/Helper/CleanProcessArchivedToday.php:34
zmsdbinfo(expression)zmsdb/src/Zmsdb/Helper/EventLogCleanUpByCron.php:28
zmsdbinfo(expression)zmsdb/src/Zmsdb/Helper/LogCleanUp.php:29
zmsdbinfoStarting log cleanup processzmsdb/src/Zmsdb/Helper/LogCleanUp.php:35
zmsdbinfoLog cleanup config loadedzmsdb/src/Zmsdb/Helper/LogCleanUp.php:40
zmsdbinfoExecuting log cleanup with commitzmsdb/src/Zmsdb/Helper/LogCleanUp.php:47
zmsdbinfoLog cleanup completedzmsdb/src/Zmsdb/Helper/LogCleanUp.php:49
zmsdbinfoWorkstation logoutzmsdb/src/Zmsdb/Helper/LogoutWorkstations.php:32
zmsdbinfo(expression)zmsdb/src/Zmsdb/Helper/ReservedDataDeleteByCron.php:81
zmsdbinfo(expression)zmsdb/src/Zmsdb/Helper/SendMailReminder.php:53
zmsdbinfoSend process list of current day to scope adminzmsdb/src/Zmsdb/Helper/SendProcessListToScopeAdmin.php:20
zmsdbinfoProcessing scopezmsdb/src/Zmsdb/Helper/SendProcessListToScopeAdmin.php:35
zmsdbinfoSend processList to scope adminzmsdb/src/Zmsdb/Helper/SendProcessListToScopeAdmin.php:47
zmsdbwarningProcesslist empty for scopezmsdb/src/Zmsdb/Helper/SendProcessListToScopeAdmin.php:52
zmsdbwarningMail writing in queue not successfulzmsdb/src/Zmsdb/Helper/SendProcessListToScopeAdmin.php:62
zmsdbinfoDeleting expired ticketprinter older than 30 dayszmsdb/src/Zmsdb/Helper/TicketprinterDeleteByCron.php:20
zmsdbinfoProcessing ticketprinterzmsdb/src/Zmsdb/Helper/TicketprinterDeleteByCron.php:31
zmsdbinfoTicketprinter successfully removedzmsdb/src/Zmsdb/Helper/TicketprinterDeleteByCron.php:43
zmsdbwarningCould not remove ticketprinterzmsdb/src/Zmsdb/Helper/TicketprinterDeleteByCron.php:45
zmsdberrorError during log cleanupzmsdb/src/Zmsdb/Log.php:247
zmsdberrorFreeProcesszmsdb/src/Zmsdb/Query/SlotList.php:220
zmsdbinfoScope cache setzmsdb/src/Zmsdb/Scope.php:41
zmsdbinfoScope cache setzmsdb/src/Zmsdb/Scope.php:136
zmsdbinfoScope cache setzmsdb/src/Zmsdb/Scope.php:187
zmsdbinfoScope cache setzmsdb/src/Zmsdb/Scope.php:254
zmsdbinfoScope cache setzmsdb/src/Zmsdb/Scope.php:334
zmsdbinfoScope cache invalidatedzmsdb/src/Zmsdb/Scope.php:729
zmsdberrorFailed to optimize table with query: $query. Error: zmsdb/src/Zmsdb/Slot.php:501
zmsdbinfoavailability: zmsdb/src/Zmsdb/Slot.php:223
zmsdbinfoUseraccount cache hitzmsdb/src/Zmsdb/Useraccount.php:282
zmsdbinfoUseraccount cache setzmsdb/src/Zmsdb/Useraccount.php:305
zmsdbinfoUseraccount list cache hitzmsdb/src/Zmsdb/Useraccount.php:343
zmsdbinfoUseraccount list cache setzmsdb/src/Zmsdb/Useraccount.php:384
zmsdbinfoUseraccount department list cache hitzmsdb/src/Zmsdb/Useraccount.php:606
zmsdbinfoUseraccount department list cache setzmsdb/src/Zmsdb/Useraccount.php:648
zmsdbinfo(expression)zmsdb/src/Zmsdb/Useraccount.php:869
zmsdbinfo(expression)zmsdb/src/Zmsdb/Useraccount.php:883
zmsdbinfoUseraccount role list cache hitzmsdb/src/Zmsdb/Useraccount.php:1035
zmsdbinfoUseraccount role list cache setzmsdb/src/Zmsdb/Useraccount.php:1065
zmsdbinfoUseraccount role and department list cache hitzmsdb/src/Zmsdb/Useraccount.php:1098
zmsdbinfoUseraccount role and department list cache setzmsdb/src/Zmsdb/Useraccount.php:1132
zmsdbinfoUseraccount caches invalidated after mutationzmsdb/src/Zmsdb/Useraccount.php:1183
zmsdbwarninguser_role update on useraccount save failedzmsdb/src/Zmsdb/Useraccount.php:786
zmsdldberrorSpecified rollback day does not exist in backupszmsdldb/bin/dldb-helpers.php:94
zmsdldberrorFailed to rollback filezmsdldb/bin/dldb-helpers.php:105
zmsdldberrorFailed to backup filezmsdldb/bin/dldb-helpers.php:152
zmsdldbinfoRetention period set in admin system configzmsdldb/bin/dldb-helpers.php:48
zmsdldbinfoUsing default retention periodzmsdldb/bin/dldb-helpers.php:55
zmsdldbinfoRollback day set in admin system configzmsdldb/bin/dldb-helpers.php:65
zmsdldbinfoUsing default no rollbackzmsdldb/bin/dldb-helpers.php:69
zmsdldbinfoRollback requestedzmsdldb/bin/dldb-helpers.php:79
zmsdldbinfoRolling back using backupzmsdldb/bin/dldb-helpers.php:99
zmsdldbinfoRolled back filezmsdldb/bin/dldb-helpers.php:108
zmsdldbinfoChecking if backup is requiredzmsdldb/bin/dldb-helpers.php:117
zmsdldbinfoBackup is requiredzmsdldb/bin/dldb-helpers.php:141
zmsdldbinfoBackup createdzmsdldb/bin/dldb-helpers.php:155
zmsdldbinfoFetching the backup retention periodzmsdldb/bin/dldb-helpers.php:163
zmsdldbinfoDeleted old backupzmsdldb/bin/dldb-helpers.php:177
zmsdldbwarningInvalid retention value, falling back to 7 dayszmsdldb/bin/dldb-helpers.php:51
zmsdldbwarningNo backups directoryzmsdldb/bin/dldb-helpers.php:84
zmsdldberrorDLDB access locale missingzmsdldb/src/Zmsdldb/AbstractAccess.php:146
zmsdldbwarningUnexpected array in service meta hash during importzmsdldb/src/Zmsdldb/Importer/MySQL/Entity/Service.php:276
zmsmessagingdebugMail send detailszmsmessaging/bin/mail_queue.php:34
zmsmessagingerrorMail queue transmission errorzmsmessaging/bin/mail_queue.php:22
zmsmessaginginfoMail sent from queuezmsmessaging/bin/mail_queue.php:28
zmsmessagingnoticeUse with --send to send emails.zmsmessaging/bin/mail_queue.php:14
zmsmessagingnoticeMail queue emptyzmsmessaging/bin/mail_queue.php:20
zmsmessagingdebug(expression)zmsmessaging/src/Zmsmessaging/BaseController.php:174
zmsmessaginginfo(expression)zmsmessaging/src/Zmsmessaging/BaseController.php:176
zmsmessagingwarning(expression)zmsmessaging/src/Zmsmessaging/BaseController.php:69
zmsmessaginginfoMail processed from queuezmsmessaging/src/Zmsmessaging/Mail.php:167
zmsmessaginginfoMail queue batch finishedzmsmessaging/src/Zmsmessaging/Mail.php:201
zmsmessagingwarning(expression)zmsmessaging/src/Zmsmessaging/Mail.php:227
zmsmessagingwarning(expression)zmsmessaging/src/Zmsmessaging/Mail.php:231
zmsslimwarningCould not write router cache filezmsslim/src/Slim/Bootstrap.php:313
zmsslimerrorFailed to fetch changelog: zmsslim/src/Slim/Helper/BaseChangelogHelper.php:31
zmsslimdynamic(via $level)zmsslim/src/Slim/LoggerService.php:245
zmsslimerror(expression)zmsslim/src/Slim/LoggerService.php:187
zmssliminfo(expression)zmsslim/src/Slim/LoggerService.php:197
zmsslimnoticeCache not available for rate limitingzmsslim/src/Slim/LoggerService.php:107
zmsslimwarningRate limiting errorzmsslim/src/Slim/LoggerService.php:147
zmsslimwarning(expression)zmsslim/src/Slim/LoggerService.php:192
zmsslimerrorOIDC login failedzmsslim/src/Slim/Middleware/OAuth/KeycloakInstance.php:57
zmsslimerrorToken validation failedzmsslim/src/Slim/Middleware/OAuth/KeycloakInstance.php:106
zmsslimerrorToken validation failedzmsslim/src/Slim/Middleware/OAuth/KeycloakInstance.php:114
zmsslimerrorToken validation failedzmsslim/src/Slim/Middleware/OAuth/KeycloakInstance.php:122
zmsslimerrorToken validation failedzmsslim/src/Slim/Middleware/OAuth/KeycloakInstance.php:140
zmsslimerrorToken validation failedzmsslim/src/Slim/Middleware/OAuth/KeycloakInstance.php:150
zmsslimerrorToken validation failedzmsslim/src/Slim/Middleware/OAuth/KeycloakInstance.php:161
zmsslimerrorToken validation failedzmsslim/src/Slim/Middleware/OAuth/KeycloakInstance.php:175
zmsslimerrorToken validation failedzmsslim/src/Slim/Middleware/OAuth/KeycloakInstance.php:190
zmsslimerrorFailed to get access tokenzmsslim/src/Slim/Middleware/OAuth/KeycloakInstance.php:229
zmssliminfoOIDC login attemptzmsslim/src/Slim/Middleware/OAuth/KeycloakInstance.php:30
zmssliminfoClearing existing sessionzmsslim/src/Slim/Middleware/OAuth/KeycloakInstance.php:42
zmssliminfoOIDC login successfulzmsslim/src/Slim/Middleware/OAuth/KeycloakInstance.php:52
zmssliminfoValidating OIDC tokenzmsslim/src/Slim/Middleware/OAuth/KeycloakInstance.php:98
zmssliminfoToken validation successfulzmsslim/src/Slim/Middleware/OAuth/KeycloakInstance.php:200
zmssliminfoGetting access tokenzmsslim/src/Slim/Middleware/OAuth/KeycloakInstance.php:216
zmssliminfoAccess token obtainedzmsslim/src/Slim/Middleware/OAuth/KeycloakInstance.php:223
zmssliminfoWriting token to sessionzmsslim/src/Slim/Middleware/OAuth/KeycloakInstance.php:244
zmssliminfoDeleting sessionzmsslim/src/Slim/Middleware/OAuth/KeycloakInstance.php:258
zmssliminfoReading token from sessionzmsslim/src/Slim/Middleware/OAuth/KeycloakInstance.php:271
zmsslimerrorUnknown OIDC provider requestedzmsslim/src/Slim/Middleware/OAuthMiddleware.php:71
zmsslimerror[Human zmsslim/src/Slim/Middleware/Session/SessionHuman.php:60
zmsslimerror(dynamic)zmsslim/src/Slim/Middleware/Session/SessionHuman.php:66
zmsslimnotice(dynamic)zmsslim/src/Slim/Middleware/Session/SessionHuman.php:44
zmsslimnotice(dynamic)zmsslim/src/Slim/Middleware/Session/SessionHuman.php:51
zmsslimcriticalPHP-Exception #{$extendedInfo[zmsslim/src/Slim/TwigExceptionHandler.php:76
zmsslimcritical(dynamic)zmsslim/src/Slim/TwigExceptionHandler.php:78
zmsslimcriticalNot catchable exception while rendering error pagezmsslim/src/Slim/TwigExceptionHandler.php:97
zmsstatisticwarningFailed to fetch /workstation/ for extendedInfozmsstatistic/src/Zmsstatistic/Helper/TwigExceptionHandler.php:26
zmsstatisticinfoLogin successfulzmsstatistic/src/Zmsstatistic/Index.php:94
zmsstatisticinfoLogin failed - invalid credentialszmsstatistic/src/Zmsstatistic/Index.php:112
zmsstatisticinfoUser already logged in - reusing existing sessionzmsstatistic/src/Zmsstatistic/Index.php:121
zmsstatisticinfoLogin failed - other errorzmsstatistic/src/Zmsstatistic/Index.php:137
zmsstatisticinfoUser logged outzmsstatistic/src/Zmsstatistic/Logout.php:41
zmsstatisticerrorOIDC Login errorzmsstatistic/src/Zmsstatistic/Oidc.php:52
zmsticketprinterdebugHOMEURLzmsticketprinter/src/Zmsticketprinter/Helper/HomeUrl.php:34
zmsticketprinterwarningError in getByHash, creating new organisation hashzmsticketprinter/src/Zmsticketprinter/Helper/Ticketprinter.php:41
  • zmsslim/src/Slim/Application.phpZMS_DEBUGLEVEL, DEBUGLEVEL, public static $log
  • zmsslim/src/Slim/Bootstrap.phpconfigureLogger(), ensureLogger(), normalizeLogLevelName()
  • zmsslim/src/Slim/LoggerService.php — HTTP request logging, rate limiting
  • zmsslim/src/Slim/Helper/ModuleLoggerInitializer.php — per-module logger env wiring and middleware registration
  • zmsslim/README.md — Slim bootstrap overview