Log Analytics - KQL - Log Quiet
In this blog post, we'll dive into using Azure's Kusto Query Language (KQL) to identify tables that have not received logs in the last day.
As businesses increasingly rely on Azure for their cloud solutions, maintaining an up-to-date and secure environment becomes crucial. One critical aspect is ensuring that log data is consistently received and analyzed. In this blog post, we'll dive into using Azure's Kusto Query Language (KQL) to identify tables that have not received logs in the last day. By pinpointing these gaps, you can proactively address potential issues in your logging infrastructure and ensure comprehensive monitoring of your cloud resources. Let's explore how KQL can help you maintain a robust and reliable logging system.
union withsource = _TableName *
| where TimeGenerated > ago(10d)
| summarize last_log = datetime_diff("day", now(), max(TimeGenerated)) by _TableName
| where last_log > 1
| project ['Table Name'] = _TableName, ['Last Record Received'] = last_log
| order by ['Last Record Received'] desc1.
union withsource = _TableName *This part of the query combines all tables in the database into a single result set. The withsource = _TableName clause adds a column named _TableName to the result, which contains the name of the table each record came from.
2.
| where TimeGenerated > ago(10d)This filters the combined result set to include only records where the TimeGenerated field is within the last 10 days. The ago(10d) function returns the date and time 10 days ago from the current time.
3.
| summarize last_log = datetime_diff("day", now(), max(TimeGenerated)) by _TableNameHere, the query summarises the data by table name:
max(TimeGenerated)finds the most recentTimeGeneratedvalue for each table.datetime_diff("day", now(), max(TimeGenerated))calculates the difference in days between the current date and the most recentTimeGeneratedvalue.last_logis the name given to this calculated difference.
4.
| where last_log > 1This filters the summarised results to include only those tables where the difference in days (last_log) is greater than 1. This means it filters out tables that have received records within the last day.
5.
| project ['Table Name'] = _TableName, ['Last Record Received'] = last_logThis part of the query renames the columns for better readability:
_TableNameis renamed toTable Name.last_logis renamed toLast Record Received.
6.
| order by ['Last Record Received'] descFinally, the query orders the results by the Last Record Received column in descending order, so tables with the most days since their last record are listed first.

Summary
This query identifies tables in the database that have not received any new records in the last day. It lists these tables along with the number of days since their last record, sorted in descending order.
Example Output
| Table Name | Last Record Received |
|---|---|
| Table1 | 5 |
| Table2 | 3 |
| Table3 | 2 |
This output indicates that Table1 has not received any new records for 5 days, Table2 for 3 days, and Table3 for 2 days.
It's a simple tried and tested method which won't fail you.
Either run it manually or implement it into a recurring logic app to send the message to you by any means such as directly to Teams, Email (don't recommend) or Service Now as a ticket.
