Global Metadata
Global metadata allows you to add consistent metadata that will be included with all subsequent logs automatically. This is useful for application-wide context like environment, version, or deployment information.
Adding Global Metadata
Use Log.addMetaContext()
to add metadata that will be included with all subsequent logs:
// Add global metadata
Log.addMetaContext('appVersion', '1.2.3');
Log.addMetaContext('environment', 'production');
Log.addMetaContext('server', process.env.HOSTNAME);
// All subsequent logs will include this metadata
Log.info('Application started'); // Includes appVersion, environment, server
Log.error('Database connection failed', {}, error); // Also includes the metadata
Common Global Metadata
Application Information
// Basic application context
Log.addMetaContext('applicationName', 'OrderService');
Log.addMetaContext('version', process.env.npm_package_version);
Log.addMetaContext('environment', process.env.NODE_ENV);
Log.addMetaContext('nodeVersion', process.version);
Deployment Context
// Cloud deployment context
Log.addMetaContext('deploymentId', process.env.DEPLOYMENT_ID);
Log.addMetaContext('region', process.env.AWS_REGION);
Log.addMetaContext('instanceId', process.env.EC2_INSTANCE_ID);
Log.addMetaContext('containerId', process.env.HOSTNAME);
Complex Objects and Arrays
You can add any type of data, including complex objects and arrays:
// Simple values
Log.addMetaContext('buildNumber', 12345);
Log.addMetaContext('isDebugMode', process.env.NODE_ENV === 'development');
// Complex objects
const deploymentInfo = {
version: '1.2.3',
branch: 'main',
commitHash: 'abc123def',
deployedAt: new Date().toISOString()
};
Log.addMetaContext('deployment', deploymentInfo);
// Arrays
Log.addMetaContext('features', ['featureA', 'featureB', 'featureC']);
Express.js Integration
Set global metadata during application startup:
import express from 'express';
import { Log } from '@bytehide/logger';
const app = express();
// Set application-wide metadata
Log.addMetaContext('applicationName', 'OrderService');
Log.addMetaContext('environment', process.env.NODE_ENV);
Log.addMetaContext('version', process.env.npm_package_version);
Log.addMetaContext('startTime', new Date().toISOString());
app.listen(3000, () => {
Log.info('Server started', {
context: { port: 3000 }
});
});
Configuration-Based Metadata
Load metadata from configuration files:
// config.json
{
"logging": {
"globalMetadata": {
"applicationName": "OrderService",
"environment": "production",
"region": "us-east-1",
"version": "2.1.0"
}
}
}
import config from './config.json';
// Load global metadata from configuration
const globalMetadata = config.logging.globalMetadata;
for (const [key, value] of Object.entries(globalMetadata)) {
Log.addMetaContext(key, value);
}
Environment-Based Metadata
// Load metadata based on environment
const environment = process.env.NODE_ENV || 'development';
// Common metadata
Log.addMetaContext('environment', environment);
Log.addMetaContext('nodeVersion', process.version);
Log.addMetaContext('platform', process.platform);
// Environment-specific metadata
if (environment === 'production') {
Log.addMetaContext('cluster', process.env.CLUSTER_ID);
Log.addMetaContext('region', process.env.AWS_REGION);
} else if (environment === 'development') {
Log.addMetaContext('developer', process.env.USER);
Log.addMetaContext('debugMode', true);
}
Package.json Integration
import packageJson from './package.json';
// Add package information as global metadata
Log.addMetaContext('packageName', packageJson.name);
Log.addMetaContext('version', packageJson.version);
Log.addMetaContext('description', packageJson.description);
Log.addMetaContext('author', packageJson.author);
Docker Integration
// Add Docker/container information
Log.addMetaContext('containerId', process.env.HOSTNAME);
Log.addMetaContext('imageTag', process.env.IMAGE_TAG);
Log.addMetaContext('buildDate', process.env.BUILD_DATE);
// Kubernetes information
if (process.env.KUBERNETES_SERVICE_HOST) {
Log.addMetaContext('k8sNamespace', process.env.NAMESPACE);
Log.addMetaContext('k8sPodName', process.env.POD_NAME);
Log.addMetaContext('k8sServiceName', process.env.SERVICE_NAME);
}
Performance Metadata
// System performance information
const getSystemInfo = () => ({
memoryUsage: process.memoryUsage(),
uptime: process.uptime(),
cpuUsage: process.cpuUsage()
});
// Add initial system info
Log.addMetaContext('systemInfo', getSystemInfo());
// Update periodically (optional)
setInterval(() => {
Log.addMetaContext('systemInfo', getSystemInfo());
}, 60000); // Update every minute
Best Practices
Best Practices
- Set global metadata during application startup, not runtime
- Use consistent naming conventions (camelCase recommended for JavaScript)
- Include useful debugging context like version, environment, deployment info
- Avoid sensitive data like passwords or tokens
- Keep metadata relevant and focused
Common Patterns
Startup Configuration
// startup.js
function configureGlobalMetadata() {
// Application metadata
Log.addMetaContext('applicationName', 'MyApp');
Log.addMetaContext('version', process.env.npm_package_version);
Log.addMetaContext('environment', process.env.NODE_ENV);
// Runtime metadata
Log.addMetaContext('nodeVersion', process.version);
Log.addMetaContext('platform', process.platform);
Log.addMetaContext('startTime', new Date().toISOString());
// Deployment metadata
if (process.env.DEPLOYMENT_ID) {
Log.addMetaContext('deploymentId', process.env.DEPLOYMENT_ID);
}
if (process.env.BUILD_NUMBER) {
Log.addMetaContext('buildNumber', parseInt(process.env.BUILD_NUMBER));
}
Log.info('Global metadata configured');
}
// Call during app initialization
configureGlobalMetadata();
Microservice Metadata
// microservice-config.js
export function configureServiceMetadata(serviceName) {
Log.addMetaContext('serviceName', serviceName);
Log.addMetaContext('serviceVersion', process.env.SERVICE_VERSION);
Log.addMetaContext('serviceId', process.env.SERVICE_ID || generateServiceId());
// Service discovery metadata
Log.addMetaContext('serviceRegistry', process.env.SERVICE_REGISTRY);
Log.addMetaContext('loadBalancer', process.env.LOAD_BALANCER);
// Health check metadata
Log.addMetaContext('healthCheckEndpoint', '/health');
Log.addMetaContext('metricsEndpoint', '/metrics');
}
// Usage
configureServiceMetadata('order-service');
Cloud Provider Metadata
// AWS metadata
if (process.env.AWS_REGION) {
Log.addMetaContext('cloud', 'aws');
Log.addMetaContext('region', process.env.AWS_REGION);
Log.addMetaContext('availabilityZone', process.env.AWS_AVAILABILITY_ZONE);
Log.addMetaContext('instanceType', process.env.AWS_INSTANCE_TYPE);
}
// Google Cloud metadata
if (process.env.GOOGLE_CLOUD_PROJECT) {
Log.addMetaContext('cloud', 'gcp');
Log.addMetaContext('project', process.env.GOOGLE_CLOUD_PROJECT);
Log.addMetaContext('zone', process.env.GOOGLE_CLOUD_ZONE);
}
// Azure metadata
if (process.env.AZURE_RESOURCE_GROUP) {
Log.addMetaContext('cloud', 'azure');
Log.addMetaContext('resourceGroup', process.env.AZURE_RESOURCE_GROUP);
Log.addMetaContext('subscription', process.env.AZURE_SUBSCRIPTION_ID);
}
Dynamic Metadata Updates
// Update metadata based on application state
class MetadataManager {
static updateConnectionStatus(status) {
Log.addMetaContext('dbConnectionStatus', status);
}
static updateActiveUsers(count) {
Log.addMetaContext('activeUsers', count);
}
static updateFeatureFlags(flags) {
Log.addMetaContext('featureFlags', flags);
}
}
// Usage
MetadataManager.updateConnectionStatus('connected');
MetadataManager.updateActiveUsers(150);
MetadataManager.updateFeatureFlags({ newCheckout: true, betaFeature: false });
Next Steps
- Tags - Organize and categorize logs
- Metadata & Context - Add context to individual logs
- User Identification - Associate logs with users
- Basic Logging - Learn fundamental logging methods