# Logger
_Path: en/lua/system/logger_
## Table of Contents
- Logging
## Content
# Logging
Structured logging with debug, info, warn, and error levels.
## Loading
```lua
local logger = require("logger")
```
### Debug
```lua
logger:debug("message", {key = "value"})
```
| Parameter | Type | Description |
|-----------|------|-------------|
| `message` | string | Log message |
| `fields` | table? | Contextual key-value pairs |
### Info
```lua
logger:info("message", {key = "value"})
```
| Parameter | Type | Description |
|-----------|------|-------------|
| `message` | string | Log message |
| `fields` | table? | Contextual key-value pairs |
### Warn
```lua
logger:warn("message", {key = "value"})
```
| Parameter | Type | Description |
|-----------|------|-------------|
| `message` | string | Log message |
| `fields` | table? | Contextual key-value pairs |
### Error
```lua
logger:error("message", {key = "value"})
```
| Parameter | Type | Description |
|-----------|------|-------------|
| `message` | string | Log message |
| `fields` | table? | Contextual key-value pairs |
### With Fields
Create a child logger with persistent fields.
```lua
local child = logger:with({request_id = id})
child:info("message")
```
| Parameter | Type | Description |
|-----------|------|-------------|
| `fields` | table | Fields to attach to all logs |
**Returns:** `Logger`
### Named Logger
Create a named child logger.
```lua
local named = logger:named("auth")
named:info("message")
```
| Parameter | Type | Description |
|-----------|------|-------------|
| `name` | string | Logger name |
**Returns:** `Logger`
## Errors
| Condition | Kind | Retryable |
|-----------|------|-----------|
| Empty name string | `errors.INVALID` | no |
See [Error Handling](lua/core/errors.md) for working with errors.
## Navigation
Previous: Environment (lua/system/env)
Next: I/O (lua/system/io)