PracticeBeginner

Logging in Code

Logging is the practice of emitting a durable, timestamped, structured record of what a trading program does and decides, using severity levels and correlation ids, so that live behaviour can be monitored, audited and debugged after the fact, which print statements cannot provide.

Quick Answer

Logging emits a durable, timestamped record of what an unattended trading system saw, decided and sent, tagged with severity levels (INFO, WARNING, ERROR) and correlation ids that tie an order to its fill. Structured logs let you reconstruct an incident hours later and drive alerts, which scattered print statements cannot.

Definition: Logging in Code

Logging in Code is the practice of emitting timestamped, leveled, structured records of what a trading program does and decides, enabling monitoring, auditing and after-the-fact debugging.

Key takeaways: Logging in Code

  • Logging gives a durable, timestamped, structured record that print statements cannot
  • Use severity levels consistently so production can filter to what needs attention and alert on errors
  • Structured (key-value/JSON) logs are queryable, enabling dashboards and post-incident analysis
  • Attach correlation ids to trace a single order or decision end to end across components
  • Never log secrets, rotate and retain files, and log asynchronously off the hot path

Logging in Code at a glance

Logging in Code — key facts at a glance, Indian algorithmic-trading context.
SubjectDurable record of system behaviour
RecordsInputs, decisions, orders, errors (timestamped)
Severity levelsDEBUG, INFO, WARNING, ERROR, CRITICAL
StructureMachine-parseable fields + correlation ids
EnablesMonitoring, auditing, incident reconstruction
Beatsprint() — no level, no persistence
Failure modeLogging secrets or blocking the hot path

Logging in Code in simple words

Logging means having your program write down what it is doing, with a timestamp and a severity, to a file or a logging system, so you can see what happened later. In trading this is essential: when an order behaves unexpectedly, the logs are often the only record of what your code saw and decided at that moment. A proper logging library, unlike scattered print statements, gives you levels, structure and control over where the records go.

What Logging in Code is for

Logging exists so that an automated, unattended trading system leaves an auditable trail of its inputs, decisions and actions, enabling monitoring in real time and reconstruction of events after an incident.

Logging in Code — professional explanation

Why logging, not print

A print statement writes a string to standard output and is gone; it has no severity, no timestamp by default, no structure, no way to route or filter, and it clutters code you then have to remove. A logging framework is purpose-built: it attaches a timestamp and severity to every record, lets you set a threshold so debug detail can be suppressed in production, and can send records to multiple destinations (console, rotating files, a central log system) at once. In an unattended trading system that must run for hours and be understood after the fact, this is not a nicety, the logs are frequently the only evidence of what the code perceived and decided when something went wrong, so treating logging as core infrastructure rather than debugging scaffolding is essential.

Log levels and their discipline

Standard severity levels, typically DEBUG, INFO, WARNING, ERROR and CRITICAL, let one codebase emit both fine-grained detail and high-level events, with a runtime threshold deciding what is actually recorded. DEBUG carries verbose internal detail useful in development; INFO records normal significant events (a signal generated, an order placed and filled); WARNING flags recoverable anomalies (a retried API call, a stale-but-usable quote); ERROR marks a failed operation (an order rejected); CRITICAL marks a system-threatening condition (data feed down, risk limit breached, kill switch fired). The discipline is to choose levels consistently so that filtering to WARNING and above in production surfaces exactly what needs attention without drowning in noise, and so alerts can be wired to ERROR and CRITICAL.

Structured logging

Traditional logs are free-text lines that are easy for a human to read but painful for a machine to search and aggregate. Structured logging emits each record as key-value data (commonly JSON) with named fields, timestamp, level, event, symbol, order_id, quantity, price, latency, rather than a formatted sentence. The payoff is that logs become queryable: you can filter every event for a given order_id, aggregate fills by symbol, or compute the distribution of decision-to-fill latency, which is impossible with unstructured text at scale. For a trading system feeding a monitoring stack, structured logs are what make dashboards, alerts and post-incident analysis tractable.

Correlation ids: tracing one decision end to end

A single trading decision fans out across components, a tick arrives, a signal is computed, risk checks run, an order is sent, acknowledgements and fills return, possibly across services and threads. A correlation id (a unique identifier attached to all log records arising from the same originating event or order) lets you reconstruct that entire chain by filtering on one id, even when the records are interleaved with thousands of others. In a distributed or asynchronous system this is often the only practical way to answer why did this specific order do that, because without a shared id the causally related records are scattered and impossible to stitch together.

What to log in a trading system

The rule of thumb is to log enough to reconstruct any decision and any order's life, without logging so much that the signal drowns or you leak secrets. Log the inputs a decision was based on (the relevant quote or bar and computed indicators), the decision itself (signal generated, with reasons), every order event (submitted, acknowledged, filled, partially filled, rejected, cancelled, with ids, prices and sizes), risk checks and any veto, errors and retries, and system lifecycle events (start, stop, config loaded, kill switch). Critically, never log secrets, full API keys, tokens or passwords must be redacted, because logs are often less protected than the secret store. Timestamps should be precise and in a consistent zone, and each record should carry enough context (symbol, order id, correlation id) to be meaningful on its own.

Operational concerns: performance, rotation, retention

Logging has costs that matter in a low-latency, always-on system. Synchronous logging on the hot path can add latency and, if a disk stalls, even block trading, so high-throughput systems log asynchronously (a background thread or queue drains records) and avoid excessive DEBUG in production. Log files must be rotated (capped in size and rolled over) so they do not fill the disk and halt the system, and retained for a defined period to satisfy debugging and any audit needs before being archived or deleted. In distributed setups logs are shipped to a central aggregator so they survive a machine failure and can be searched in one place. These concerns are why logging is designed, not bolted on.

Worked example: Logging in Code

Illustrative example (Indian market)

Suppose a Bank Nifty order fills at a worse price than expected and you need to know why. With structured logging you filter every record carrying that order's correlation id and see, in sequence: the tick and computed z-score that triggered the signal (INFO), the risk check that approved one lot (INFO), the order submitted at 15:07:12.412 (INFO), a WARNING that the first API attempt timed out and was retried, and the fill at 15:07:12.910 nearly half a second later (INFO), explaining the slippage as a retry-induced delay, not a logic bug. Had the code used scattered print statements, these records would be unordered free text with no shared id and no latency detail, and the cause would be far harder to establish. This is an illustrative debugging trail, not a trade recommendation.

For an NSE live system, logging every order event with the broker order id, exchange timestamp and your correlation id makes it possible to reconcile your records against the broker's order and trade book at end of day, and to explain any discrepancy. API keys and access tokens (for example a Kite Connect token) must always be redacted from logs, since log files are commonly less protected than the secrets store.

Logging framework vs print statements

Logging framework vs print statements — Logging in Code, summarised for Indian F&O context.
AspectLogging frameworkprint()
Timestamp and severityAutomatic on every recordManual, usually absent
Filtering by levelYes, at runtimeNo
Structure / queryableYes (structured/JSON)No, free text
Multiple destinationsConsole, files, aggregatorStandard output only
Rotation and retentionBuilt in or configurableNone
Correlation / context fieldsSupportedManual and fragile

Advantages of Logging in Code

  • Creates a durable, timestamped, auditable record of what the system did and decided
  • Levels let one codebase emit both detail and high-level events, filtered at runtime
  • Structured logs are queryable, powering dashboards, alerts and post-incident analysis
  • Correlation ids let you trace one order or decision end to end across components
  • Enables end-of-day reconciliation against the broker's order and trade records

Limitations of Logging in Code

  • Synchronous logging on the hot path can add latency or even block trading if disk stalls
  • Over-logging drowns the signal and inflates storage and search cost
  • Logs can leak secrets if API keys or tokens are not carefully redacted
  • Structured logging and aggregation add setup and operational overhead
  • Logs record what the code chose to log; unlogged state remains invisible after the fact

How professionals treat Logging in Code

Professional trading systems treat logs as audit-grade infrastructure. They log structured JSON with consistent levels, attach a correlation id to every record arising from an order or decision, and ship logs asynchronously to a central aggregator (an ELK-style stack or equivalent) where they are searched, dashboarded and alerted on. ERROR and CRITICAL events page a human or trip automated controls; secrets are redacted by policy; timestamps are precise and in a fixed zone; and files are rotated and retained per a defined policy for debugging and compliance. The standard they hold is that any order's full lifecycle and the inputs behind any decision can be reconstructed from the logs alone.

Common misconceptions about Logging in Code

Misconception: You should log API keys or passwords.

Reality: Never. Secrets must be redacted from logs, because log files are frequently less protected than the secrets store and are shipped to aggregators and shared during debugging. A leaked key in a log can let someone access or trade your account.

Common mistakes with Logging in Code

  • Using print statements instead of a logging framework, losing levels, timestamps and structure
  • Logging secrets such as full API keys or access tokens into files that are poorly protected
  • Logging everything at one level (or all at DEBUG) so nothing can be filtered or alerted on
  • Free-text logs with no correlation id, making it impossible to trace one order across components
  • Synchronous, verbose logging on the latency-critical path, slowing or stalling execution
  • No log rotation, so files grow until the disk fills and the trading process halts

Logging in Code: frequently asked questions

Why log from inside strategy and execution code?

Because the code is the only place that sees each decision as it is made — the inputs, the branch taken, the order built. Logging at those points, not just at the system boundary, is what later lets you reconstruct why the code did what it did, reconcile against the broker, and debug a problem you cannot reproduce.

What is the difference between logging and print statements?

A logging framework attaches a timestamp and severity to every record, lets you filter by level at runtime, supports structure and multiple destinations, and handles rotation, whereas print writes an unstructured line to standard output with none of that. For an auditable, always-on trading system, print is inadequate.

How do you implement structured logging in code?

Emit each record as named key-value data, usually JSON, rather than a text sentence — most languages ship a library for it. Populate fields like timestamp, level, event, symbol, order_id and price on every record, and pass a logger carrying bound context through your functions so the fields attach automatically instead of by hand.

How do you propagate a correlation id through code?

Generate one id when an event originates — a tick or an order request — and thread it through every function and log call in that chain, often via a context object or a thread-local. Every record from tick to signal to order to fill then carries the same id, so filtering on it reconstructs the whole path in asynchronous or distributed code.

Can logging slow down my trading system?

Yes, if done synchronously on the latency-critical path, and a stalled disk could even block trading. High-throughput systems log asynchronously via a background thread or queue, keep DEBUG out of production, and ship logs off the hot path to avoid adding latency.

What is centralised logging?

It is shipping logs from all processes and machines to a single aggregator where they can be searched, visualised and alerted on together. This means logs survive a machine failure and a distributed system can be understood in one place rather than by hunting across many files.

Sources & references

  • Robert Kissell, “The Science of Algorithmic Trading and Portfolio Management”, Academic Press (Elsevier), 2013
  • Ernest P. Chan, “Quantitative Trading: How to Build Your Own Algorithmic Trading Business”, 2nd ed., Wiley, 2021

Published 10 July 2026. Educational content only — not investment advice. Markets and rules change; verify current conventions with SEBI, NSE/BSE and your broker.

Educational content only — not investment advice. Examples use illustrative numbers and simplified models. Algorithmic trading and derivatives involve substantial risk. See our Risk Disclosure and SEBI Disclaimer.