Resposta A: OpenAI GPT-5.4
import re
from collections import defaultdict
def analyze_logs(log_data):
"""
Analisa uma string de log de várias linhas e retorna um dicionário de resumo com:
- counts_by_level: contagens de entradas de log por nível de log em maiúsculas
- successful_logins: nomes de usuário exclusivos que fizeram login com sucesso
- failed_login_ips: contagens de tentativas de login falhadas por endereço IP
Linhas malformadas ou irrelevantes são ignoradas.
"""
counts_by_level = defaultdict(int)
successful_logins = set()
failed_login_ips = defaultdict(int)
# Corresponde a lin...
Mostrar resposta completa ▼
import re
from collections import defaultdict
def analyze_logs(log_data):
"""
Analisa uma string de log de várias linhas e retorna um dicionário de resumo com:
- counts_by_level: contagens de entradas de log por nível de log em maiúsculas
- successful_logins: nomes de usuário exclusivos que fizeram login com sucesso
- failed_login_ips: contagens de tentativas de login falhadas por endereço IP
Linhas malformadas ou irrelevantes são ignoradas.
"""
counts_by_level = defaultdict(int)
successful_logins = set()
failed_login_ips = defaultdict(int)
# Corresponde a linhas como: [TIMESTAMP] LEVEL: MESSAGE
log_line_pattern = re.compile(
r"^\ между(?P<timestamp>[^\]]+)\]\s+(?P<level>[A-Za-z]+)\s*:\s*(?P<message>.*)$"
)
# Exemplo de login bem-sucedido: Usuário 'alice' fez login do IP '192.168.1.10'
success_pattern = re.compile(
r"User\s+'([^']+)'\s+logged\s+in\b",
re.IGNORECASE,
)
# Exemplo de login falhado: Tentativa de login falhada para o usuário 'bob' do IP '203.0.113.5'
failed_pattern = re.compile(
r"Failed\s+login\s+attempt\s+for\s+user\s+'[^']+'\s+from\s+IP\s+'([^']+)'",
re.IGNORECASE,
)
if not isinstance(log_data, str):
return {
"counts_by_level": {},
"successful_logins": [],
"failed_login_ips": {},
}
for line in log_data.splitlines():
line = line.strip()
if not line:
continue
match = log_line_pattern.match(line)
if not match:
continue
level = match.group("level").upper()
message = match.group("message")
counts_by_level[level] += 1
success_match = success_pattern.search(message)
if success_match:
successful_logins.add(success_match.group(1))
failed_match = failed_pattern.search(message)
if failed_match:
failed_login_ips[failed_match.group(1)] += 1
return {
"counts_by_level": dict(counts_by_level),
"successful_logins": sorted(successful_logins),
"failed_login_ips": dict(failed_login_ips),
}
Exemplo de uso:
if name == "main":
sample_logs = """
[2023-10-27T10:00:00Z] INFO: Server starting up.
[2023-10-27T10:01:00Z] INFO: User 'alice' logged in from IP '192.168.1.10'
[2023-10-27T10:02:30Z] WARN: Failed login attempt for user 'bob' from IP '203.0.113.5'
This is not a valid log line and should be ignored.
[2023-10-27T10:03:00Z] error: Database connection failed.
[2023-10-27T10:05:00Z] INFO: User 'alice' accessed resource '/dashboard'
[2023-10-27T10:06:00Z] WARN: Failed login attempt for user 'eve' from IP '203.0.113.5'
[2023-10-27T10:07:00Z] INFO: User 'charlie' logged in from IP '198.51.100.2'"""
print(analyze_logs(sample_logs))
Resultado
Votos de vitoria
3 / 3
Pontuacao media
Pontuacao total
Comentario geral
A Resposta A fornece uma solução altamente robusta e bem projetada. Implementa corretamente toda a lógica de análise, lida com a insensibilidade a maiúsculas e minúsculas para níveis de log e usa `re.IGNORECASE` para a análise de mensagens, tornando-a resiliente a variações. O uso de `defaultdict` e `set` é eficiente e Pythonic. Também inclui uma verificação do tipo de entrada e ordena os logins bem-sucedidos para uma saída consistente, demonstrando atenção aos detalhes e às melhores práticas.
Ver detalhes da avaliacao ▼
Correcao
Peso 35%A Resposta A está totalmente correta, analisando com precisão todos os componentes de log e agregando dados conforme necessário. Lida corretamente com a insensibilidade a maiúsculas e minúsculas para níveis de log e usa `re.IGNORECASE` para padrões de mensagens, garantindo uma correspondência robusta.
Completude
Peso 20%A Resposta A implementa completamente todos os recursos necessários, incluindo análise robusta de linhas de log, contagem de níveis insensível a maiúsculas e minúsculas e extração precisa de detalhes de login bem-sucedidos/falhados. Também inclui uma verificação do tipo de entrada para maior completude.
Qualidade do codigo
Peso 20%A Resposta A demonstra excelente qualidade de código. Usa `defaultdict` e `set` para agregação eficiente de dados, `re.compile` para eficiência de regex, grupos nomeados para legibilidade e `re.IGNORECASE` para correspondência robusta de padrões. O código é limpo, bem estruturado e inclui uma docstring útil.
Valor pratico
Peso 15%A Resposta A tem alto valor prático devido ao seu design robusto. Pode lidar com vários formatos de linha de log, incluindo variações de maiúsculas e minúsculas em mensagens, e gerencia graciosamente linhas malformadas e entrada não string, tornando-a adequada para cenários de análise de log do mundo real.
Seguimento de instrucoes
Peso 10%A Resposta A segue todas as instruções com precisão. Lida corretamente com a insensibilidade a maiúsculas e minúsculas para níveis de log e ignora robustamente linhas malformadas. O uso de `re.IGNORECASE` para padrões de mensagens, embora não explicitamente declarado para mensagens, alinha-se com o requisito de 'robusto'. Também usa estruturas de dados apropriadas e ordena a lista final para consistência.
Pontuacao total
Comentario geral
Fornece uma implementação robusta e correta com análise clara baseada em regex, normalização de nível insensível a maiúsculas e minúsculas e omissão graciosa de linhas malformadas. Usa estruturas de dados apropriadas (defaultdict, set) e retorna dicionários simples. Pequena observação: retorna logins bem-sucedidos ordenados (não exigido) e inclui uso de exemplo além da função solicitada, mas isso não prejudica os requisitos principais.
Ver detalhes da avaliacao ▼
Correcao
Peso 35%Extrai corretamente níveis de log em maiúsculas, conta-os, encontra nomes de usuário de login bem-sucedidos únicos e conta IPs de login com falha; os padrões se alinham com o prompt e lidam com variações de maiúsculas/minúsculas nas mensagens.
Completude
Peso 20%Cobre todas as saídas exigidas e ignora explicitamente linhas malformadas; também lida com entrada não string retornando um resumo de formato vazio.
Qualidade do codigo
Peso 20%Bem estruturado com regex nomeadas e compiladas e coleções apropriadas; legível e de fácil manutenção. Leve exagero com bloco principal de exemplo extra e ordenação desnecessária de nomes de usuário (embora inofensivo).
Valor pratico
Peso 15%Prático para logs reais: lida com variantes de maiúsculas/minúsculas, linhas malformadas e entrada não string de forma segura; processamento em passagem única e estruturas de dados sensatas.
Seguimento de instrucoes
Peso 10%Implementa a função e o comportamento solicitados, incluindo análise de nível insensível a maiúsculas/minúsculas e omissão graciosa de linhas malformadas; retorna as chaves exigidas. Adiciona uso de exemplo, mas não entra em conflito com os requisitos.
Pontuacao total
Comentario geral
A Resposta A é uma solução bem estruturada, correta e robusta. Utiliza grupos nomeados em regex para legibilidade, defaultdict para contagem mais limpa, compila padrões regex fora do loop para eficiência, inclui validação de tipo de entrada, ordena a lista successful_logins para saída determinística, converte defaultdicts de volta para dicionários regulares para saída limpa e inclui uma docstring abrangente e exemplo de uso. O uso de re.IGNORECASE nos padrões de login adiciona robustez extra. O código é limpo e pronto para produção.
Ver detalhes da avaliacao ▼
Correcao
Peso 35%Produz saída correta para a entrada de exemplo e lida bem com casos extremos. Os padrões regex são bem elaborados com grupos nomeados e sinalizadores de insensibilidade a maiúsculas e minúsculas. A validação de tipo de entrada adiciona correção para entradas inesperadas.
Completude
Peso 20%Lida com todos os recursos necessários: counts_by_level, successful_logins (únicos, ordenados), failed_login_ips. Também lida graciosamente com entrada não string, linhas vazias e linhas malformadas. Inclui exemplo de uso com bloco __main__.
Qualidade do codigo
Peso 20%Excelente qualidade de código: padrões regex compilados para eficiência, grupos nomeados para legibilidade, defaultdict para contagem limpa, docstring abrangente, saída ordenada para determinismo, conversão adequada de defaultdicts para dicionários regulares e separação limpa de responsabilidades.
Valor pratico
Peso 15%Altamente prático: validação de entrada robusta, saída ordenada determinística, regex compilado eficiente e exemplo de uso o tornam pronto para uso em produção. Os sinalizadores re.IGNORECASE nos padrões de login adicionam robustez no mundo real.
Seguimento de instrucoes
Peso 10%Segue todas as instruções precisamente: assinatura de função correta, formato de saída correto com todas as três chaves, nível de análise de nível insensível a maiúsculas e minúsculas armazenado como maiúsculas, nomes de usuário únicos como uma lista, tratamento gracioso de linhas malformadas e usa regex conforme recomendado.