Structured JSON logging with context fields and sensitive field masking
implementation com.philiprehberger:json-loggerStructured JSON logging with context fields and sensitive field masking.
implementation("com.philiprehberger:json-logger:0.2.0")
<dependency>
<groupId>com.philiprehberger</groupId>
<artifactId>json-logger</artifactId>
<version>0.2.0</version>
</dependency>
import com.philiprehberger.jsonlogger.*
val logger = jsonLogger("UserService")
logger.info("User created") {
"userId" to "u-123"
"email" to "alice@example.com"
}
// {"timestamp":"...","level":"INFO","logger":"UserService","message":"User created","userId":"u-123","email":"alice@example.com"}
JsonLogger.maskFields("password", "token")
JsonLogger.addGlobalField("service", "user-api")
val logger = jsonLogger("api")
val requestLogger = logger.withContext("request_id" to requestId, "user_id" to userId)
requestLogger.info("Processing request")
// {"timestamp":"...","level":"INFO","logger":"api","message":"Processing request","request_id":"abc123","user_id":"42"}
val result = logger.timed(message = "Database query") {
database.query("SELECT * FROM users")
}
// {"timestamp":"...","level":"INFO","message":"Database query","duration_ms":45}
| Function / Class | Description |
|---|---|
jsonLogger(name) | Create a structured JSON logger |
logger.info(message) { fields } | Log with structured fields |
logger.error(message, throwable) { fields } | Log errors with stack trace |
JsonLogger.addGlobalField(key, value) | Add field to every log entry |
JsonLogger.maskFields(vararg fields) | Mark fields for masking |
JsonLogger.withContext() | Create child logger with baked-in fields |
JsonLogger.timed() | Log with automatic duration measurement |
JsonLogger.minLevel | Set minimum log level |
LogLevel | DEBUG, INFO, WARN, ERROR |
./gradlew test
./gradlew build
If you find this project useful: