/

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

Previous
Duplicate Suppression