protected Map<String, ?> getMappedAuditActionContext(final AuditActionContext auditActionContext) {
        var map = new LinkedHashMap<String, Object>();
        if (isFieldAuditable(AuditableFields.WHO)) {
            map.put("who", readFieldValue(auditActionContext.getPrincipal()));
        }
        if (isFieldAuditable(AuditableFields.WHAT)) {
            map.put("what", readFieldValue(auditActionContext.getResourceOperatedUpon()));
        }
        if (isFieldAuditable(AuditableFields.ACTION)) {
            map.put("action", readFieldValue(auditActionContext.getActionPerformed()));
        }
        if (isFieldAuditable(AuditableFields.APPLICATION)) {
            map.put("application", readFieldValue(auditActionContext.getApplicationCode()));
        }
        if (isFieldAuditable(AuditableFields.WHEN)) {
            map.put("when", readFieldValue(auditActionContext.getWhenActionWasPerformed().toString()));
        }
        
        val clientInfo = auditActionContext.getClientInfo();
        if (isFieldAuditable(AuditableFields.CLIENT_IP)) {
            map.put("clientIpAddress", readFieldValue(clientInfo.getClientIpAddress()));
        }
        if (isFieldAuditable(AuditableFields.SERVER_IP)) {
            map.put("serverIpAddress", readFieldValue(clientInfo.getServerIpAddress()));
        }
        if (isFieldAuditable(AuditableFields.USER_AGENT)) {
            map.put("userAgent", readFieldValue(clientInfo.getUserAgent()));
        }
        if (isFieldAuditable(AuditableFields.HEADERS)) {
            map.put("headers", clientInfo.getHeaders());
        }
        if (isFieldAuditable(AuditableFields.GEO_LOCATION)) {
            map.put("geoLocation", readFieldValue(clientInfo.getGeoLocation()));
        }
        if (isFieldAuditable(AuditableFields.DEVICE_FINGERPRINT)) {
            map.put("deviceFingerprint", readFieldValue(clientInfo.getDeviceFingerprint()));
        }
        if (isFieldAuditable(AuditableFields.TENANT)) {
            map.put("tenant", readFieldValue(clientInfo.getTenant()));
        }
        return map;
    }
Separator for single line log entries.
core/cas-server-core-audit-api/src/main/java/org/apereo/inspektr/audit/support/AbstractStringAuditTrailManager.java