import argparse
import re
import json
def filter_logs(log_file, filters):
"""Filters log entries based on provided filters."""
filtered_entries = []
try:
with open(log_file, 'r') as f:
for line in f:
match = True
for filter_name, filter_value in filters.items():
if filter_name == "level":
if filter_value.lower() != line.lower().split()[0].lower():
match = False
break
elif filter_name == "message":
if filter_value.lower() not in line.lower():
match = False
break
elif filter_name == "time":
try:
time_str = line.split()[1] # Assuming time is the second element
if filter_value < time_str:
match = False
break
except (IndexError, ValueError):
match = False
break
if match:
filtered_entries.append(line.strip())
except FileNotFoundError:
print(f"Error: Log file '{log_file}' not found.")
return None
return filtered_entries
def main():
"""Parses command-line arguments and filters log entries."""
parser = argparse.ArgumentParser(description="Filter log entries from a file.")
parser.add_argument("log_file", help="Path to the log file.")
parser.add_argument("--filters", nargs='+', help="Filters to apply (e.g., level:error message:exception)")
args = parser.parse_args()
if not args.filters:
print("Usage: python filter_logs.py <log_file> --filters <filter1> <filter2> ...")
return
filters = {}
for filter_str in args.filters:
try:
name, value = filter_str.split(":", 1)
filters[name.strip()] = value.strip()
except ValueError:
print(f"Invalid filter format: {filter_str}. Use name:value")
return
filtered_entries = filter_logs(args.log_file, filters)
if filtered_entries:
for entry in filtered_entries:
print(entry)
if __name__ == "__main__":
main()
Add your comment