6 Commits
Author SHA1 Message Date
Chris Troutner 03caa3cd67 Merge pull request #23 from Permissionless-Software-Foundation/ct-unstable
fix(logging): Improved logging
2026-03-17 15:34:43 -07:00
Chris Troutner 6c8d512d1a fix(logging): Improved logging 2026-03-17 15:33:25 -07:00
Chris Troutner cc78aad785 Merge pull request #22 from Permissionless-Software-Foundation/ct-unstable
fix(logs): Reducing log noise
2026-03-16 20:52:28 -07:00
Chris Troutner 91f99405c1 fix(logs): Reducing log noise 2026-03-16 20:51:33 -07:00
Chris Troutner a959416b10 Merge pull request #21 from Permissionless-Software-Foundation/ct-unstable
fix(Docker): Persisting winston logs
2026-03-16 20:08:46 -07:00
Chris Troutner 562a196998 fix(Docker): Persisting winston logs 2026-03-16 20:08:04 -07:00
7 changed files with 105 additions and 3 deletions
+5 -1
View File
@@ -59,6 +59,7 @@ class Server {
try { try {
// Create an Express instance. // Create an Express instance.
const app = express() const app = express()
app.set('trust proxy', true)
const x402Settings = getX402Settings() const x402Settings = getX402Settings()
const basicAuthSettings = getBasicAuthSettings() const basicAuthSettings = getBasicAuthSettings()
@@ -183,7 +184,10 @@ class Server {
// Request logging middleware // Request logging middleware
app.use((req, res, next) => { app.use((req, res, next) => {
wlogger.info(`${req.method} ${req.path}`) wlogger.info(`${req.method} ${req.path}`, {
client_ip: req.ip,
remote_address: req.socket?.remoteAddress || null
})
next() next()
}) })
+21
View File
@@ -0,0 +1,21 @@
# 2026-03-16 Update Log
## Summary
Reduced noisy error logging for common SLP transaction misses in the `/v6/slp/txid` path.
## Changes Made
- Updated `src/use-cases/slp-use-cases.js` in `getTxid()`:
- Added a guard for expected missing-record errors (`404` + `Key not found in database`).
- Skips `wlogger.error()` for that specific, common case.
- Still rethrows the error so API response behavior is unchanged.
- Updated `src/controllers/rest-api/slp/controller.js` in `handleError()`:
- Added the same guard to suppress duplicate error-level logs for the same expected case.
- Keeps normal error logging for all other errors.
## Outcome
- The common "Key not found in database" case no longer pollutes error logs.
- Unexpected failures continue to be logged at error level.
- Client-facing status and error message behavior remains unchanged.
+60
View File
@@ -0,0 +1,60 @@
# 2026-03-17 Update Log
## Summary
Enhanced REST request logging to capture client network identity in Winston logs and enabled proxy-aware IP resolution.
## Changes Made
- Updated `bin/server.js`:
- Set Express proxy handling with `app.set('trust proxy', true)`.
- Kept the current Winston request message format (`"${req.method} ${req.path}"`).
- Added structured Winston metadata fields to request logs:
- `client_ip` from `req.ip`
- `remote_address` from `req.socket.remoteAddress`
## Useful Fields Available for REST Request Logging
- Routing and request basics:
- `method` (`req.method`)
- `path` (`req.path`)
- `original_url` (`req.originalUrl`)
- `query` (`req.query`)
- Client network identity:
- `client_ip` (`req.ip`)
- `forwarded_ips` (`req.ips`, when behind one or more proxies)
- `remote_address` (`req.socket.remoteAddress`)
- HTTP and transport:
- `protocol` (`req.protocol`)
- `secure` (`req.secure`)
- `http_version` (`req.httpVersion`)
- `host` (`req.get('host')`)
- `origin` (`req.get('origin')`)
- `referer` (`req.get('referer')`)
- `user_agent` (`req.get('user-agent')`)
- Request/response performance and size:
- `status_code` (`res.statusCode`, from `res.on('finish')`)
- `duration_ms` (elapsed time between request start and response finish)
- `request_size_bytes` (`req.get('content-length')`)
- `response_size_bytes` (`res.getHeader('content-length')`)
- App-specific request context in this codebase:
- `basic_auth_valid` (`req.locals.basicAuthValid`)
- x402 decision/bypass status (derived from middleware path and config)
## Already Logging
- In Winston request logs:
- `message` with method + path (for example `GET /v6/full-node/blockchain/getBlockCount`)
- `client_ip`
- `remote_address`
- `timestamp` (from Winston timestamp formatter)
- `level`
- In console endpoint logs:
- Request line with method, path, and `req.ip`
- Response line with method, path, and final `res.statusCode`
## Outcome
- Request logs now preserve existing behavior while adding IP attribution fields.
- `trust proxy` ensures `req.ip` is proxy-aware when the server is deployed behind a reverse proxy.
- The project now has a documented list of high-value request fields for future logging expansion.
+1
View File
@@ -0,0 +1 @@
+2
View File
@@ -17,4 +17,6 @@ services:
volumes: volumes:
#- ./start-rest2nostr.sh:/home/safeuser/REST2NOSTR/start-rest2nostr.sh #- ./start-rest2nostr.sh:/home/safeuser/REST2NOSTR/start-rest2nostr.sh
- ./.env:/home/safeuser/.env - ./.env:/home/safeuser/.env
- ../data:/home/safeuser/psf-bch-api/production/data
- ../data/logs:/home/safeuser/psf-bch-api/logs
restart: always restart: always
+8 -1
View File
@@ -208,7 +208,14 @@ class SlpRESTController {
} }
handleError (err, res) { handleError (err, res) {
wlogger.error('Error in SlpRESTController:', err) const isCommonMissingTxError =
err?.status === 404 &&
typeof err?.message === 'string' &&
err.message.includes('Key not found in database')
if (!isCommonMissingTxError) {
wlogger.error('Error in SlpRESTController:', err)
}
const status = err.status || 500 const status = err.status || 500
const message = err.message || 'Internal server error' const message = err.message || 'Internal server error'
+8 -1
View File
@@ -98,7 +98,14 @@ class SlpUseCases {
try { try {
return await this.slpIndexer.post('slp/tx/', { txid }) return await this.slpIndexer.post('slp/tx/', { txid })
} catch (err) { } catch (err) {
wlogger.error('Error in SlpUseCases.getTxid()', err) const isCommonMissingTxError =
err?.status === 404 &&
typeof err?.message === 'string' &&
err.message.includes('Key not found in database')
if (!isCommonMissingTxError) {
wlogger.error('Error in SlpUseCases.getTxid()', err)
}
throw err throw err
} }
} }