Spaces:
Sleeping
Sleeping
| import random | |
| import datetime | |
| import argparse | |
| # --- Configuración de los Mensajes de Log --- | |
| # Puedes personalizar estos mensajes para que se parezcan más a tus logs reales. | |
| LOG_MESSAGES = { | |
| "INFO": [ | |
| "User {user_id} logged in successfully from IP {ip_address}.", | |
| "Request received for endpoint /api/v1/data.", | |
| "Processing batch job #{job_id} started.", | |
| "Data synchronization with external service completed.", | |
| "Configuration reloaded successfully.", | |
| "Cache cleared for key: '{cache_key}'.", | |
| ], | |
| "WARNING": [ | |
| "API response time is high: {response_time}ms for endpoint /api/v1/status.", | |
| "Disk space is running low on /dev/sda1 ({disk_space}% used).", | |
| "A deprecated function 'old_function()' was called.", | |
| "Could not resolve hostname 'temp-service.local', using fallback.", | |
| "User session for {user_id} is about to expire.", | |
| ], | |
| "ERROR": [ | |
| "Database connection failed: Timeout expired.", | |
| "NullPointerException in module 'PaymentProcessor' at line {line_number}.", | |
| "Failed to write to file /var/logs/app.log: Permission denied.", | |
| "Critical component 'MessageQueue' is not responding.", | |
| "Authentication failed for user '{user_name}'. Invalid credentials provided.", | |
| ], | |
| "DEBUG": [ | |
| "Executing SQL query: SELECT * FROM users WHERE id={user_id}.", | |
| "Variable 'x' has value: {random_value}.", | |
| "Entering function 'calculate_metrics()'.", | |
| "HTTP request headers: {header_info}.", | |
| ] | |
| } | |
| def generate_random_ip(): | |
| """Genera una dirección IP aleatoria.""" | |
| return ".".join(str(random.randint(1, 255)) for _ in range(4)) | |
| def generate_log_line(current_time): | |
| """ | |
| Genera una única línea de log con un nivel y mensaje aleatorio. | |
| Los niveles tienen diferentes probabilidades para ser más realistas. | |
| """ | |
| # Probabilidades: INFO (65%), DEBUG (20%), WARNING (10%), ERROR (5%) | |
| log_level = random.choices( | |
| population=["INFO", "DEBUG", "WARNING", "ERROR"], | |
| weights=[0.65, 0.20, 0.10, 0.05], | |
| k=1 | |
| )[0] | |
| # Elige un mensaje aleatorio para el nivel seleccionado | |
| message_template = random.choice(LOG_MESSAGES[log_level]) | |
| # Rellena el template con datos aleatorios para hacerlo más dinámico | |
| message = message_template.format( | |
| user_id=random.randint(100, 999), | |
| ip_address=generate_random_ip(), | |
| job_id=random.randint(1000, 9999), | |
| cache_key=f"user_data_{random.randint(1, 100)}", | |
| response_time=random.randint(200, 2000), | |
| disk_space=random.randint(85, 99), | |
| line_number=random.randint(50, 500), | |
| user_name=random.choice(["admin", "guest", "testuser", "api_service"]), | |
| random_value=round(random.uniform(0, 1), 4), | |
| header_info="{...}" | |
| ) | |
| # Formatea el timestamp: [YYYY-MM-DD HH:MM:SS,ms] | |
| timestamp = current_time.strftime('%Y-%m-%d %H:%M:%S') + f",{current_time.microsecond // 1000:03d}" | |
| return f"[{timestamp}] {log_level}: {message}" | |
| def create_log_file(filename, num_lines): | |
| """Crea un archivo de log con un número específico de líneas.""" | |
| print(f"Generando {num_lines} líneas de log en el archivo '{filename}'...") | |
| # Empezamos desde hace unas horas para que los logs no sean todos del mismo segundo | |
| current_time = datetime.datetime.now() - datetime.timedelta(hours=3) | |
| try: | |
| with open(filename, 'w', encoding='utf-8') as f: | |
| for i in range(num_lines): | |
| # Incrementa el tiempo aleatoriamente para cada línea (entre 50ms y 3s) | |
| time_increment = random.uniform(0.05, 3.0) | |
| current_time += datetime.timedelta(seconds=time_increment) | |
| log_line = generate_log_line(current_time) | |
| f.write(log_line + "\n") | |
| # Imprime un progreso para archivos grandes | |
| if (i + 1) % 1000 == 0: | |
| print(f" ... {i + 1} líneas generadas") | |
| print(f"¡Éxito! Archivo '{filename}' creado con {num_lines} líneas.") | |
| except IOError as e: | |
| print(f"Error al escribir en el archivo '{filename}': {e}") | |
| if __name__ == "__main__": | |
| # Configura el parser de argumentos para usar el script desde la terminal | |
| parser = argparse.ArgumentParser( | |
| description="Generador de Archivos de Log de Muestra.", | |
| formatter_class=argparse.RawTextHelpFormatter | |
| ) | |
| parser.add_argument( | |
| "num_lines", | |
| type=int, | |
| help="El número de líneas de log a generar." | |
| ) | |
| parser.add_argument( | |
| "-o", "--output", | |
| type=str, | |
| default="sample.log", | |
| help="El nombre del archivo de log de salida.\n(default: sample.log)" | |
| ) | |
| args = parser.parse_args() | |
| create_log_file(args.output, args.num_lines) |