vix logs
vix logs shows production logs for a Vix application.
Use it when you want to inspect systemd app logs, Nginx proxy logs, error logs, repeated failures, or live production output.
vix logsOverview
vix logs is the production log inspection command for Vix.
It can show:
- systemd app logs
- Nginx access logs
- Nginx error logs
- app errors
- proxy errors
- repeated error groups
- common network disconnect groups
- live logs
- logs since a specific time
- the last N lines
- JSON output for repeated error analysis
It is useful when:
- the app fails to start
- health checks fail
- public traffic does not work
- Nginx proxy behaves incorrectly
- WebSocket clients disconnect
- production logs are too noisy
- deployment failed and you need recent errors
Platform support
vix logs is currently supported on:
LinuxIt uses Linux production tools such as:
journalctl
tail
grep
sudoOn unsupported platforms, Vix reports that vix logs is currently supported on Linux only.
Usage
vix logs [target] [options]Targets
| Target | Purpose |
|---|---|
| no target | Show app logs and proxy logs. |
app | Show systemd app logs. |
proxy | Show Nginx access and error logs. |
errors | Show app errors and Nginx error logs. |
Basic examples
# Show app and proxy logs
vix logs
# Show only app logs
vix logs app
# Show only proxy logs
vix logs proxy
# Show app errors and proxy error logs
vix logs errors
# Follow logs live
vix logs --follow
# Alias for --follow
vix logs -f
# Show only common error lines
vix logs --errors
# Analyze repeated errors
vix logs errors --repeated
# Analyze repeated errors as JSON
vix logs errors --repeated --json
# Show logs since a systemd time expression
vix logs --since "1 hour ago"
# Show last 200 lines
vix logs -n 200
# Same as -n
vix logs --lines 200Configuration source
vix logs reads configuration from:
vix.jsonunder:
production.logsIt can also reuse service names from:
production.deploy.service
production.service.nameFull config example
{
"name": "PulseGrid",
"production": {
"service": {
"name": "pulsegrid"
},
"deploy": {
"service": "pulsegrid"
},
"logs": {
"service": "pulsegrid",
"nginx_access": "/var/log/nginx/pulsegrid.access.log",
"nginx_error": "/var/log/nginx/pulsegrid.error.log",
"lines": 120
}
}
}Logs config fields
| Field | Purpose |
|---|---|
production.logs.service | systemd service name used for app logs. |
production.logs.nginx_access | Nginx access log path. |
production.logs.nginx_error | Nginx error log path. |
production.logs.lines | Default number of lines to show. |
Service name detection
Vix resolves the service name in this order:
production.logs.service
production.deploy.service
production.service.name
project nameIf the service name ends with:
.serviceVix normalizes it internally and uses the service name for journalctl.
Example:
{
"production": {
"logs": {
"service": "pulsegrid.service"
}
}
}is treated as:
pulsegridDefault log paths
If no custom Nginx log paths are configured, Vix uses default paths based on the app name.
For an app named:
PulseGridthe default paths are:
/var/log/nginx/PulseGrid.access.log
/var/log/nginx/PulseGrid.error.logYou can override them:
{
"production": {
"logs": {
"nginx_access": "/var/log/nginx/pulsegrid.access.log",
"nginx_error": "/var/log/nginx/pulsegrid.error.log"
}
}
}Show all logs
Run:
vix logsThis shows:
app logs
proxy access logs
proxy error logsIt prints a summary first:
Logs
App: PulseGrid
Target: all
Service: pulsegrid
Nginx access: /var/log/nginx/pulsegrid.access.log
Nginx error: /var/log/nginx/pulsegrid.error.log
Lines: 120
Follow: no
Errors only: noThen it runs the needed system commands.
Show app logs
Run:
vix logs appThis uses:
journalctl -u <service> -n <lines> --no-pagerExample:
journalctl -u pulsegrid -n 120 --no-pagerUse this when the app:
- fails to start
- exits unexpectedly
- crashes
- logs runtime errors
- cannot bind a port
- cannot open a file
- cannot connect to a database
Show proxy logs
Run:
vix logs proxyThis shows:
Nginx access log
Nginx error logIt uses commands shaped like:
sudo tail -n 120 /var/log/nginx/pulsegrid.access.log
sudo tail -n 120 /var/log/nginx/pulsegrid.error.logUse this when:
- public traffic does not reach the app
- Nginx returns 502 or 504
- TLS works but upstream fails
- WebSocket proxying fails
- proxy headers or upstream ports are wrong
Show error logs
Run:
vix logs errorsThis shows:
filtered app errors
Nginx error logIt filters app logs using common error keywords such as:
error
failed
failure
exception
panic
fatal
critical
timeout
refused
deniedUse this when you want to focus on failures instead of normal traffic.
Error filtering
You can filter logs by common error keywords with:
vix logs --errorsThis applies to app logs and proxy logs where supported.
Example:
vix logs app --errors
vix logs proxy --errors
vix logs --errorsThe filter looks for common failure words such as:
error
failed
failure
exception
panic
fatal
critical
timeout
refused
deniedFollow logs live
Use --follow or -f:
vix logs --follow
vix logs -f
vix logs app -f
vix logs proxy -fFor app logs, this maps to:
journalctl -u <service> -fFor proxy logs, this maps to:
sudo tail -f <log-file>Use follow mode when you want to watch logs while:
- restarting a service
- testing a route
- hitting the public URL
- connecting a WebSocket client
- running a deployment
Show logs since a time
Use --since:
vix logs --since "1 hour ago"
vix logs app --since "today"
vix logs errors --since "10 minutes ago"--since is passed to journalctl for app logs.
Examples of valid systemd time expressions:
1 hour ago
10 minutes ago
today
yesterday
2026-05-28 10:00:00Show last N lines
Use --lines or -n:
vix logs --lines 200
vix logs -n 200
vix logs app -n 50
vix logs proxy -n 300If not configured, the default is usually:
120You can also set the default in vix.json:
{
"production": {
"logs": {
"lines": 200
}
}
}Repeated error analysis
Use --repeated to analyze repeated failures:
vix logs errors --repeatedThis reads app and proxy error-like lines, normalizes them, groups repeated messages, and reports common patterns.
Example output shape:
Repeated Errors
Analyzed lines: 120
Repeated groups: 2
12x upstream timed out
5x connection refused
Common Network Disconnects
Detected groups: 3
Hidden normal noise: 18 lines
14x client disconnected
3x connection reset by peer
1x timeoutThis is useful when production logs are noisy and you want to know which problems repeat the most.
Repeated error JSON
Use:
vix logs errors --repeated --jsonExample output shape:
{
"analyzed_lines": 120,
"repeated_groups": 2,
"network_disconnect_groups": 3,
"hidden_normal_noise_lines": 18,
"repeated_errors": [
{
"message": "upstream timed out",
"count": 12
}
],
"network_disconnects": [
{
"name": "client disconnected",
"count": 14
}
]
}Use JSON output for:
- CI
- dashboards
- automation
- production monitoring experiments
- deployment reports
Normal network disconnect noise
Production logs often contain normal disconnects.
Examples:
broken pipe
connection reset by peer
client closed connection
client prematurely closed connection
websocket disconnected
EOFThese do not always mean your app is broken.
They often mean the client closed the connection.
vix logs errors --repeated groups this noise separately so it does not hide real repeated failures.
Normal network noise groups include:
client disconnected
connection reset by peer
websocket disconnectedThe report can show:
Hidden normal noise: 18 linesThis helps production logs stay useful.
Network disconnect groups
The repeated error analyzer can group common network failures such as:
| Group | Meaning |
|---|---|
client disconnected | Client closed the connection, broken pipe, EOF, or similar. |
connection reset by peer | Remote side reset the connection. |
websocket disconnected | WebSocket client disconnected. |
upstream disconnected | Upstream closed the connection early. |
connection refused | Upstream or target refused the connection. |
timeout | A request or upstream timed out. |
The goal is to separate normal production noise from real repeated failures.
Commands printed before execution
vix logs prints the command it is about to run.
Example:
Command: journalctl -u pulsegrid -n 120 --no-pagerThis makes log inspection transparent.
If you need to debug manually, you can copy the command and run it yourself.
Target behavior
No target
vix logsRuns:
app logs
proxy access logs
proxy error logsapp
vix logs appRuns:
systemd app logsproxy
vix logs proxyRuns:
Nginx access logs
Nginx error logserrors
vix logs errorsRuns:
filtered app errors
Nginx error logsIt also enables error filtering internally.
Full production logs config
{
"name": "PulseGrid",
"production": {
"service": {
"name": "pulsegrid"
},
"proxy": {
"domain": "pulsegrid.example.com",
"http": {
"port": 8080
}
},
"logs": {
"service": "pulsegrid",
"nginx_access": "/var/log/nginx/pulsegrid.access.log",
"nginx_error": "/var/log/nginx/pulsegrid.error.log",
"lines": 120
}
}
}Then run:
vix logs
vix logs app
vix logs proxy
vix logs errors
vix logs errors --repeatedRelationship with vix service
vix service manages the app service.
vix logs app reads logs for that service.
Typical flow:
vix service status
vix logs appAfter a restart:
vix service restart
vix logs app -fRelationship with vix proxy nginx
vix proxy nginx manages Nginx config.
vix logs proxy reads Nginx access and error logs.
Typical flow:
vix proxy nginx check
vix logs proxyIf the public endpoint fails:
vix proxy nginx check
vix logs proxy --errorsRelationship with vix health
vix health tells you whether an endpoint is healthy.
vix logs tells you why it may be unhealthy.
Typical flow:
vix health
vix logs errors
vix logs errors --repeatedRelationship with vix doctor production
vix doctor production gives a readiness overview.
vix logs gives detailed runtime evidence.
Typical flow:
vix doctor production
vix logs errorsRelationship with vix deploy
A deployment command can show logs on failure.
Manual flow:
vix deploy
vix health
vix logs errorsIf repeated failures appear:
vix logs errors --repeatedOptions
| Option | Description |
|---|---|
app | Show systemd app logs. |
proxy | Show Nginx access and error logs. |
errors | Show app errors and Nginx error logs. |
--follow | Follow logs live. |
-f | Alias for --follow. |
--errors | Filter logs by common error keywords. |
--repeated | Detect repeated errors and common network disconnect groups. |
--json | Print supported output as JSON. Currently useful with --repeated. |
--since <time> | Filter app logs by a systemd time expression. |
--lines <n> | Show last N lines. |
-n <n> | Alias for --lines. |
-h, --help | Show help. |
Common workflows
Inspect everything
vix logsInspect app logs
vix logs appInspect proxy logs
vix logs proxyInspect only errors
vix logs errorsFollow app logs while restarting
vix service restart
vix logs app -fFollow proxy logs while testing public URL
vix logs proxy -fShow recent errors
vix logs errors -n 200Show errors from the last hour
vix logs errors --since "1 hour ago"Analyze repeated errors
vix logs errors --repeatedAnalyze repeated errors as JSON
vix logs errors --repeated --jsonCommon mistakes
Running outside the project directory
Wrong:
cd ~
vix logsCorrect:
cd /path/to/myapp
vix logsvix logs reads vix.json from the current project directory.
Expecting logs to start the service
vix logs only reads logs.
Start the service with:
vix service startExpecting logs to fix health failures
vix logs helps you inspect failures.
Use the right command to fix the source of the issue.
Examples:
vix service restart
vix proxy nginx check
vix health local
vix health publicUsing --json without --repeated
JSON output is currently useful for repeated error analysis.
Use:
vix logs errors --repeated --jsonExpecting --since to filter Nginx log files
--since is passed to journalctl for app logs.
Nginx log files are read with tail.
Forgetting sudo permissions for Nginx logs
Proxy logs are usually under:
/var/log/nginx/Vix reads them using sudo tail.
Make sure your user can use sudo.
Missing Nginx log files
If Vix reports that a log file is missing, check:
{
"production": {
"logs": {
"nginx_access": "/var/log/nginx/pulsegrid.access.log",
"nginx_error": "/var/log/nginx/pulsegrid.error.log"
}
}
}or configure Nginx to write logs at those paths.
Troubleshooting
Missing service name
If app logs cannot be read, configure:
{
"production": {
"logs": {
"service": "pulsegrid"
}
}
}You can also define:
{
"production": {
"service": {
"name": "pulsegrid"
}
}
}App logs are empty
Check service status:
vix service statusThen inspect directly:
journalctl -u pulsegrid -n 120 --no-pagerProxy access log not found
Check the configured path:
{
"production": {
"logs": {
"nginx_access": "/var/log/nginx/pulsegrid.access.log"
}
}
}Then check Nginx config:
vix proxy nginx checkProxy error log not found
Check:
{
"production": {
"logs": {
"nginx_error": "/var/log/nginx/pulsegrid.error.log"
}
}
}Then inspect Nginx:
sudo nginx -tPublic URL fails
Run:
vix health public
vix proxy nginx check
vix logs proxy --errorsLocal app fails
Run:
vix health local
vix service status
vix logs app --errorsWebSocket fails
Run:
vix health websocket
vix proxy nginx check
vix logs errors --repeatedToo many disconnect messages
Run:
vix logs errors --repeatedNormal disconnects are grouped separately so you can focus on actual repeated failures.
Best practices
Keep log configuration in vix.json.
Use vix logs app for app crashes and service startup errors.
Use vix logs proxy for Nginx and public traffic issues.
Use vix logs errors when you want failure-focused logs.
Use vix logs errors --repeated when logs are noisy.
Use vix logs app -f while restarting the service.
Use vix logs proxy -f while testing the public URL.
Use vix health before logs to know which layer is failing.
Use vix doctor production after logs to confirm readiness.
Related commands
| Command | Purpose |
|---|---|
vix service | Manage the systemd app service. |
vix proxy nginx | Manage Nginx reverse proxy configuration. |
vix health | Check local, public, and WebSocket endpoints. |
vix doctor production | Inspect production readiness. |
vix deploy | Deploy the production app. |
vix build | Build the app binary. |
vix run | Run the app manually. |
Next step
Check endpoint health.