1. import argparse
  2. import re
  3. import json
  4. def filter_logs(log_file, filters):
  5. """Filters log entries based on provided filters."""
  6. filtered_entries = []
  7. try:
  8. with open(log_file, 'r') as f:
  9. for line in f:
  10. match = True
  11. for filter_name, filter_value in filters.items():
  12. if filter_name == "level":
  13. if filter_value.lower() != line.lower().split()[0].lower():
  14. match = False
  15. break
  16. elif filter_name == "message":
  17. if filter_value.lower() not in line.lower():
  18. match = False
  19. break
  20. elif filter_name == "time":
  21. try:
  22. time_str = line.split()[1] # Assuming time is the second element
  23. if filter_value < time_str:
  24. match = False
  25. break
  26. except (IndexError, ValueError):
  27. match = False
  28. break
  29. if match:
  30. filtered_entries.append(line.strip())
  31. except FileNotFoundError:
  32. print(f"Error: Log file '{log_file}' not found.")
  33. return None
  34. return filtered_entries
  35. def main():
  36. """Parses command-line arguments and filters log entries."""
  37. parser = argparse.ArgumentParser(description="Filter log entries from a file.")
  38. parser.add_argument("log_file", help="Path to the log file.")
  39. parser.add_argument("--filters", nargs='+', help="Filters to apply (e.g., level:error message:exception)")
  40. args = parser.parse_args()
  41. if not args.filters:
  42. print("Usage: python filter_logs.py <log_file> --filters <filter1> <filter2> ...")
  43. return
  44. filters = {}
  45. for filter_str in args.filters:
  46. try:
  47. name, value = filter_str.split(":", 1)
  48. filters[name.strip()] = value.strip()
  49. except ValueError:
  50. print(f"Invalid filter format: {filter_str}. Use name:value")
  51. return
  52. filtered_entries = filter_logs(args.log_file, filters)
  53. if filtered_entries:
  54. for entry in filtered_entries:
  55. print(entry)
  56. if __name__ == "__main__":
  57. main()

Add your comment