fixed logging
This commit is contained in:
parent
d0e8fd9e3f
commit
7c2e055dd4
8 changed files with 19 additions and 45 deletions
|
|
@ -121,7 +121,6 @@ LOKI_USERNAME=
|
|||
LOKI_PASSWORD=
|
||||
LOKI_TENANT_ID=
|
||||
LOKI_PUSH_TIMEOUT=10000
|
||||
LOKI_FLUSH_INTERVAL_MS=5000
|
||||
LOKI_BATCH_SIZE=1024
|
||||
LOKI_BATCH_WAIT=1000
|
||||
LOKI_RETENTION_PERIOD=30d
|
||||
|
|
|
|||
|
|
@ -37,7 +37,6 @@ LOKI_PASSWORD=
|
|||
LOKI_RETENTION_DAYS=30
|
||||
LOKI_LABELS=environment=development,service=stock-bot
|
||||
LOKI_BATCH_SIZE=100
|
||||
LOKI_FLUSH_INTERVAL_MS=5000
|
||||
|
||||
# Feature Flags
|
||||
ENABLE_ML_SIGNALS=false
|
||||
|
|
|
|||
|
|
@ -116,7 +116,6 @@ LOKI_USERNAME=${LOKI_USERNAME}
|
|||
LOKI_PASSWORD=${LOKI_PASSWORD}
|
||||
LOKI_TENANT_ID=${LOKI_TENANT_ID}
|
||||
LOKI_PUSH_TIMEOUT=30000
|
||||
LOKI_FLUSH_INTERVAL_MS=5000
|
||||
LOKI_BATCH_SIZE=2048
|
||||
LOKI_BATCH_WAIT=5000
|
||||
LOKI_RETENTION_PERIOD=90d
|
||||
|
|
|
|||
|
|
@ -12,7 +12,6 @@ loadEnvVariables();
|
|||
const app = new Hono();
|
||||
const logger = createLogger('data-service');
|
||||
const PORT = parseInt(process.env.DATA_SERVICE_PORT || '3002');
|
||||
logger.info(`Data Service starting on port ${PORT}`);
|
||||
// Health check endpoint
|
||||
app.get('/health', (c) => {
|
||||
return c.json({
|
||||
|
|
|
|||
|
|
@ -78,7 +78,7 @@ LOKI_PORT=3100 # Loki server port
|
|||
LOKI_RETENTION_DAYS=30 # Days to retain logs
|
||||
LOKI_LABELS=environment=development,service=stock-bot # Default labels
|
||||
LOKI_BATCH_SIZE=100 # Number of logs to batch before sending
|
||||
LOKI_FLUSH_INTERVAL_MS=5000 # Max time to wait before sending logs
|
||||
LOKI_BATCH_WAIT=5 # Max time to wait before sending logs
|
||||
```
|
||||
|
||||
## Useful Loki Queries
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ export const lokiConfig = cleanEnv(process.env, {
|
|||
// Push Configuration
|
||||
LOKI_PUSH_TIMEOUT: num({ default: 10000, desc: 'Push timeout in ms' }),
|
||||
LOKI_BATCH_SIZE: num({ default: 1024, desc: 'Batch size for log entries' }),
|
||||
LOKI_BATCH_WAIT: num({ default: 1000, desc: 'Batch wait time in ms' }),
|
||||
LOKI_BATCH_WAIT: num({ default: 5, desc: 'Batch wait time in ms' }),
|
||||
|
||||
// Retention Settings
|
||||
LOKI_RETENTION_PERIOD: str({ default: '30d', desc: 'Log retention period' }),
|
||||
|
|
@ -35,8 +35,6 @@ export const lokiConfig = cleanEnv(process.env, {
|
|||
LOKI_DEFAULT_LABELS: str({ default: '', desc: 'Default labels for all log entries (JSON format)' }),
|
||||
LOKI_SERVICE_LABEL: str({ default: 'stock-bot', desc: 'Service label for log entries' }),
|
||||
LOKI_ENVIRONMENT_LABEL: str({ default: 'development', desc: 'Environment label for log entries' }),
|
||||
|
||||
LOKI_FLUSH_INTERVAL_MS: num({ default: 5000, desc: 'Flush interval ms' }),
|
||||
});
|
||||
|
||||
// Export typed configuration object
|
||||
|
|
@ -60,5 +58,4 @@ export const {
|
|||
LOKI_DEFAULT_LABELS,
|
||||
LOKI_SERVICE_LABEL,
|
||||
LOKI_ENVIRONMENT_LABEL,
|
||||
LOKI_FLUSH_INTERVAL_MS,
|
||||
} = lokiConfig;
|
||||
|
|
|
|||
|
|
@ -163,7 +163,6 @@ LOG_FILE_PATH=./logs
|
|||
LOKI_HOST=localhost
|
||||
LOKI_PORT=3100
|
||||
LOKI_BATCH_SIZE=1024
|
||||
LOKI_FLUSH_INTERVAL_MS=5000
|
||||
```
|
||||
|
||||
## Advanced Usage
|
||||
|
|
@ -332,7 +331,6 @@ To use in your service:
|
|||
### High memory usage
|
||||
|
||||
- Reduce `LOKI_BATCH_SIZE` if batching too many logs
|
||||
- Decrease `LOKI_FLUSH_INTERVAL_MS` to flush more frequently
|
||||
- Disable file logging if not needed
|
||||
|
||||
### Missing logs
|
||||
|
|
|
|||
|
|
@ -19,17 +19,6 @@ import type { LogLevel, LogContext, LogMetadata } from './types';
|
|||
// Global logger instances cache
|
||||
const loggerInstances = new Map<string, pino.Logger>();
|
||||
|
||||
// Pino log level mapping from string to number
|
||||
const PINO_LEVELS: Record<LogLevel, number> = {
|
||||
silly: 10,
|
||||
debug: 20,
|
||||
verbose: 25,
|
||||
http: 30,
|
||||
info: 30,
|
||||
warn: 40,
|
||||
error: 50
|
||||
};
|
||||
|
||||
/**
|
||||
* Create transport configuration for Pino based on options
|
||||
*/
|
||||
|
|
@ -50,16 +39,11 @@ function createTransports(serviceName: string, options?: {
|
|||
if (enableConsole) {
|
||||
targets.push({
|
||||
target: 'pino-pretty',
|
||||
level: loggingConfig.LOG_LEVEL,
|
||||
options: {
|
||||
level: loggingConfig.LOG_LEVEL, options: {
|
||||
colorize: true,
|
||||
translateTime: 'yyyy-mm-dd HH:MM:ss.l',
|
||||
ignore: 'pid,hostname',
|
||||
messageFormat: '[{service}] {msg}',
|
||||
customPrettifiers: {
|
||||
service: (service: string) => `${service}`,
|
||||
level: (level: string) => `[${level.toUpperCase()}]`
|
||||
}
|
||||
messageFormat: '[{service}] {msg}'
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
@ -95,7 +79,7 @@ function createTransports(serviceName: string, options?: {
|
|||
level: loggingConfig.LOG_LEVEL,
|
||||
options: {
|
||||
batching: true,
|
||||
interval: lokiConfig.LOKI_FLUSH_INTERVAL_MS,
|
||||
interval: lokiConfig.LOKI_BATCH_WAIT,
|
||||
host: lokiConfig.LOKI_URL || `http://${lokiConfig.LOKI_HOST}:${lokiConfig.LOKI_PORT}`,
|
||||
basicAuth: lokiConfig.LOKI_USERNAME && lokiConfig.LOKI_PASSWORD
|
||||
? {
|
||||
|
|
@ -109,11 +93,13 @@ function createTransports(serviceName: string, options?: {
|
|||
...(lokiConfig.LOKI_DEFAULT_LABELS ? JSON.parse(lokiConfig.LOKI_DEFAULT_LABELS) : {})
|
||||
},
|
||||
timeout: lokiConfig.LOKI_PUSH_TIMEOUT || 10000,
|
||||
silenceErrors: false
|
||||
silenceErrors: false,
|
||||
// Better JSON handling
|
||||
replaceTimestamp: false,
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
return {
|
||||
targets
|
||||
};
|
||||
|
|
@ -161,27 +147,25 @@ function buildLogger(serviceName: string, options?: {
|
|||
enableFile,
|
||||
enableLoki
|
||||
});
|
||||
|
||||
const loggerConfig: pino.LoggerOptions = {
|
||||
// level: PINO_LEVELS[level] ? level : 'info',
|
||||
// customLevels: PINO_LEVELS,
|
||||
useOnlyCustomLevels: false,
|
||||
level: level,
|
||||
timestamp: () => `,"timestamp":"${new Date().toISOString()}"`,
|
||||
// formatters: {
|
||||
// level: (label: string) => ({ level: label }),
|
||||
// bindings: () => ({})
|
||||
// },
|
||||
base: {
|
||||
service: serviceName,
|
||||
environment: loggingConfig.LOG_ENVIRONMENT,
|
||||
version: loggingConfig.LOG_SERVICE_VERSION
|
||||
},
|
||||
transport
|
||||
}
|
||||
};
|
||||
|
||||
// Only add transport if targets exist to avoid worker thread issues
|
||||
if (transport && transport.targets && transport.targets.length > 0) {
|
||||
loggerConfig.transport = transport;
|
||||
}
|
||||
|
||||
return pino(loggerConfig);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Enhanced Logger class with convenience methods and flexible message handling
|
||||
*/
|
||||
|
|
@ -199,8 +183,7 @@ export class Logger {
|
|||
this.serviceName = serviceName;
|
||||
this.context = context;
|
||||
this.pino = createLogger(serviceName, options);
|
||||
}
|
||||
/**
|
||||
} /**
|
||||
* Flexible log method that accepts string or object messages
|
||||
*/
|
||||
log(level: LogLevel, message: string | object, metadata?: LogMetadata): void {
|
||||
|
|
@ -221,7 +204,7 @@ export class Logger {
|
|||
}
|
||||
|
||||
/**
|
||||
* Map custom log levels to Pino levels
|
||||
* Map custom log levels to standard Pino levels
|
||||
*/
|
||||
private mapToPinoLevel(level: LogLevel): string {
|
||||
switch (level) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue