import json
import logging
import os
from datetime import datetime
class MetadataLogger:
def __init__(self, log_file="metadata_migration.log", version_mapping=None):
self.log_file = log_file
self.logger = logging.getLogger(__name__)
self.logger.setLevel(logging.INFO)
# Create a file handler
file_handler = logging.FileHandler(log_file)
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
self.logger.addHandler(file_handler)
self.version_mapping = version_mapping if version_mapping else {} # Dict: OldVersion: NewVersion
def log_operation(self, operation_type, metadata, old_version=None, new_version=None):
"""Logs a metadata operation.
Args:
operation_type (str): The type of operation (e.g., 'migrate', 'transform', 'validate').
metadata (dict): The metadata being operated on.
old_version (str, optional): The version of the metadata before the operation. Defaults to None.
new_version (str, optional): The version of the metadata after the operation. Defaults to None.
"""
log_entry = {
"operation_type": operation_type,
"timestamp": datetime.now().isoformat(),
"metadata": metadata,
"old_version": old_version,
"new_version": new_version
}
self.logger.info(json.dumps(log_entry))
def register_version_mapping(self, old_version, new_version):
"""Registers a mapping between old and new metadata versions.
Args:
old_version (str): The old metadata version.
new_version (str): The new metadata version.
"""
self.version_mapping[old_version] = new_version
self.logger.info(f"Registered version mapping: {old_version} -> {new_version}")
def get_new_version(self, old_version):
"""Retrieves the new version for a given old version.
Args:
old_version (str): The old metadata version.
Returns:
str: The new metadata version, or None if no mapping exists.
"""
return self.version_mapping.get(old_version)
def load_metadata(filepath):
"""Loads metadata from a JSON file.
Args:
filepath (str): The path to the JSON metadata file.
Returns:
dict: The loaded metadata. Returns an empty dict if file not found.
"""
try:
with open(filepath, 'r') as f:
metadata = json.load(f)
return metadata
except FileNotFoundError:
print(f"Warning: Metadata file not found at {filepath}. Returning empty dictionary.")
return {}
except json.JSONDecodeError:
print(f"Error decoding JSON from {filepath}. Returning empty dictionary.")
return {}
if __name__ == '__main__':
# Example Usage
logger = MetadataLogger()
logger.register_version_mapping("v1.0", "v2.0")
# Simulate a metadata migration
metadata = load_metadata("metadata_v1.json") # Replace with your actual file
if metadata:
logger.log_operation("migrate", metadata, old_version="v1.0", new_version="v2.0")
# Simulate a transformation
transformed_metadata = {"name": "NewName", "value": 123}
logger.log_operation("transform", transformed_metadata, old_version="v2.0")
# Simulate a validation
validated_metadata = {"valid": True}
logger.log_operation("validate", validated_metadata, old_version="v2.0")
# Retrieving the new version
new_version = logger.get_new_version("v1.0")
print(f"The new version for v1.0 is: {new_version}")
Add your comment