analisis_logs / generador_logs.py
spjasper's picture
version2
1d16b92
raw
history blame
5.21 kB
import random
import datetime
import argparse
# --- Configuración de los Mensajes de Log ---
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_varied_log_line(current_time):
"""Genera una única línea de log variada (comportamiento original)."""
log_level = random.choices(["INFO", "DEBUG", "WARNING", "ERROR"], [0.65, 0.20, 0.10, 0.05], k=1)[0]
message_template = random.choice(LOG_MESSAGES[log_level])
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"]),
random_value=round(random.uniform(0, 1), 4), header_info="{...}"
)
timestamp = current_time.strftime('%Y-%m-%d %H:%M:%S') + f",{current_time.microsecond // 1000:03d}"
return f"[{timestamp}] {log_level}: {message}"
def generate_uniform_log_line(current_time):
"""Genera una línea de log que siempre sigue la misma plantilla."""
# Usamos siempre la misma plantilla para que el modelo de ML no encuentre anomalías.
template = "INFO: Data processing task {task_id} completed in {duration} seconds."
message = template.format(
task_id=random.randint(10000, 99999),
duration=round(random.uniform(0.5, 15.2), 2)
)
timestamp = current_time.strftime('%Y-%m-%d %H:%M:%S') + f",{current_time.microsecond // 1000:03d}"
return f"[{timestamp}] {message}"
def create_log_file(filename, num_lines, mode):
"""Crea un archivo de log con un número específico de líneas y en un modo determinado."""
print(f"Generando {num_lines} líneas de log en modo '{mode}' para el archivo '{filename}'...")
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):
time_increment = random.uniform(0.05, 3.0)
current_time += datetime.timedelta(seconds=time_increment)
if mode == 'uniform':
log_line = generate_uniform_log_line(current_time)
else: # El modo por defecto es 'varied'
log_line = generate_varied_log_line(current_time)
f.write(log_line + "\n")
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__":
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)"
)
# --- NUEVO ARGUMENTO PARA ELEGIR EL MODO ---
parser.add_argument(
"--mode", type=str, choices=['varied', 'uniform'], default='varied',
help="Elige el tipo de log a generar:\n"
"'varied': mezcla realista de logs (comportamiento por defecto).\n"
"'uniform': logs muy repetitivos para no generar anomalías de ML."
)
args = parser.parse_args()
create_log_file(args.output, args.num_lines, args.mode)