Skip to content

AWS CloudWatch Log Insights String Matching

AWS CloudWatch Log Insights provides powerful querying capabilities to search through your log data. One common requirement is filtering log messages that contain specific text patterns. This guide covers the most effective methods for string matching in Log Insights queries.

Problem Statement

When working with CloudWatch Log Insights, developers often need to filter log messages that contain specific substrings or patterns. The challenge is finding the most efficient and accurate method to perform this string matching while working within CloudWatch's query syntax constraints.

The original question asks how to filter log messages containing the text "user not found" using AWS Log Insights queries.

Solution Approaches

Here are the most effective methods for string matching in CloudWatch Log Insights:

1. Using the LIKE Operator with Regex Patterns

The LIKE operator with regular expressions is the most straightforward approach:

sql
fields @timestamp, @message
| filter @message like /user not found/
| sort @timestamp desc
| limit 20

TIP

This method is case-sensitive. Use (?i) flag for case-insensitive matching: /(?i)user not found/

2. Using strcontains() Function

The strcontains() function provides explicit string containment checking:

sql
fields @timestamp, @message
| filter strcontains(@message, "User not found")
| sort @timestamp desc
| limit 20

WARNING

The strcontains() function is case-sensitive. Ensure your search term matches the case in your logs exactly.

3. Using Regex Match Operator

For advanced pattern matching, use the regex match operator (=~):

sql
fields @timestamp, @message
| filter @message =~ /.*User not found.*/
| sort @timestamp desc
| limit 20

4. Using Query Generator (AI-Powered)

AWS now offers a Generative AI-powered query generator:

  1. Click on "Query generator" in the Log Insights interface
  2. Describe your filter in natural language (e.g., "Find log messages containing 'user not found'")
  3. The AI will generate the appropriate query syntax

Query Generator Example

Advanced Techniques

Case-Insensitive Matching

For case-insensitive searches, use regex with the (?i) flag:

sql
fields @timestamp, @message
| filter @message like /(?i)user not found/
| sort @timestamp desc
| limit 20

Pattern Extraction with Parse

For structured logs, combine parsing with filtering:

sql
fields @timestamp, @message
| parse @message "[*] * *" as @level, @severity, @info
| filter @severity="INFO" and strcontains(@info, "user not found")
| sort @timestamp desc
| limit 20

Field Assignment Filtering

Create computed fields for complex filtering:

sql
fields @timestamp, @message, strcontains(@message, "user not found") AS user_not_found
| filter user_not_found = 1
| sort @timestamp desc
| limit 20

Performance Considerations

  • Regex vs Simple String Matching: Simple string matching with LIKE or strcontains() is generally faster than complex regex patterns
  • Case Sensitivity: Case-sensitive searches are typically faster than case-insensitive ones
  • Parse Operations: Use parsing judiciously as it adds processing overhead

Best Practices

  1. Use the simplest matching method that meets your requirements
  2. Be specific with patterns to avoid matching unintended text
  3. Test queries with limit clauses before running them on large datasets
  4. Use the Query Generator for complex filtering requirements
  5. Combine multiple filters using and/or operators for precise results

Common Pitfalls

  • Forgetting that string matching is case-sensitive by default
  • Using overly broad regex patterns that match more than intended
  • Not considering performance implications when querying large log datasets

By understanding these string matching techniques, you can effectively filter and analyze your CloudWatch logs to find the specific information you need.