An Azure service that is used to collect, analyze, and act on telemetry data from Azure and on-premises environments.
Hello rajesh kumar Thank you for posting your query on Microsoft Q&A platform.
Azure Monitor does not have a deduplication layer across tables or streams.
- Azure Monitor treats each ingestion pipeline as independent
- A DCR is an instruction, not a “routing rule with awareness of other DCRs”
- If the same log event enters AMA once, but matches multiple DCR data sources, it will be materialized multiple times
So when you see:
- Same device
- Same syslog message
- Appearing in:
-
Syslog(built‑in table)-
<Custom>_CL(custom table)
-
-
That means the log was accepted by two independent ingestion paths, not duplicated after ingestion.
There are only three ways a syslog message can reach Log Analytics:
- Linux Syslog data source in a DCR
- CEF/Syslog Security stream
- Custom ingestion (custom table) that still starts from syslog
In your case:
- The device sends logs → rsyslog/syslog‑ng
- AMA reads from syslog socket
- AMA evaluates all DCRs associated to that machine
- If:
- DCR‑A says “send this message to custom table”
- DCR‑B says “send syslog messages to Syslog table”
- Both will succeed
- Azure does not know they are “the same event”
- DCR‑A says “send this message to custom table”
This is expected behavior.
Azure Monitor cannot dedupe because TimeGenerated, ingestion time, and table schema are different.
Even if two rows look identical:
- They land in different tables
- With different schemas
- Potentially different ingestion timestamps
Deduplication would break audit guarantees — so it is intentionally absent.
As a resolution try below workarounds:
- One stream → one destination
If logs are meant only for the custom table:
- Do not collect Syslog at all for that device
Practically:
- The device should still emit syslog
- AMA should only have one DCR that:
- Reads syslog
- Transforms
- Writes to the custom table
- No Syslog stream in any other DCR scoped to that machine
- Transforms
- Reads syslog
This is the only way to guarantee zero duplication.
- Ingestion-time dropping: If you must keep Syslog for other messages:
- The Syslog DCR must explicitly drop messages already handled by the custom DCR
Because:
- KQL queries, retention, and purge do not reduce ingestion cost
- Only
transformKqlprevents storage and billing
You filter based on something inherent to the log, such as:
- Facility
- Program / process name
- Tag inserted by rsyslog
- Message prefix / pattern
This makes the two DCRs mutually exclusive.
- Facility separation at the source: This is the most correct approach.
- Device sends:
- Business logs →
local4- System logs → standard facilities
- Custom table DCR:
- Collects only
local4 - Syslog DCR:
- Explicitly excludes
local4
- Explicitly excludes
- Collects only
- Business logs →
Why this is superior:
- No KQL filtering cost
- No ambiguity
- Clear ownership of data
- Easier troubleshooting
- Scales cleanly
AMA does not send logs “to Azure” — it sends logs to DCRs. If two DCRs accept the same message, Azure stores it twice. Once you think in DCR‑first, the behavior becomes obvious and predictable.
Duplicate syslog entries are not caused by a logging bug or agent issue, they occur because the same syslog message matches multiple Data Collection Rules. Azure Monitor does not deduplicate across tables, so the only way to prevent this is to ensure that each syslog stream is ingested by exactly one DCR, either by disabling Syslog collection for that device, separating facilities at the source, or dropping overlapping messages at ingestion time using DCR transformations.
Thanks,
Suchitra.