> For the complete documentation index, see [llms.txt](https://mominur.gitbook.io/mominur-notes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://mominur.gitbook.io/mominur-notes/random-topics/structured-logging.md).

# Structured Logging

> Bug fixing is like detective work. The more structured your logs, the faster you solve the case.

একজন ডেভেলপার হিসেবে আমরা প্রতিনিয়ত বিভিন্ন সমস্যার সম্মুখীন হই। আজকে সাইট স্লো, কালকে ইউজার লগইন করতে পারছে না, পরশু ডেটা সেভ হচ্ছে না। এই সমস্যাগুলোর সমাধানে আমাদের প্রথম এবং অন্যতম নির্ভরযোগ্য হাতিয়ার হলো **log files**।

কিন্তু প্রশ্ন হলো — আপনি কি এখনও traditional, unstructured log ব্যবহার করছেন?

যদি উত্তর হয় হ্যাঁ, তাহলে আপনার debugging process এখনও অপ্রয়োজনীয় জটিলতায় ঘেরা।\
এবং এই জায়গাতেই আসে **Structured Logging** — যেটা আপনার ডেভেলপমেন্ট ও প্রোডাকশন debugging এর rules-ই বদলে দিতে পারে।

***

### Structured Logging আসলে কী?

**Structured Logging** হলো এমন এক logging format, যেখানে প্রতিটি log message নির্দিষ্ট একটি structure অনুসরণ করে — সাধারণত key-value format এ লেখা হয় (যেমন JSON)। এর ফলে logs গুলো শুধু মানুষ নয়, মেশিনও সহজে parse, search এবং visualize করতে পারে।

#### উদাহরণ দেখুন:

**Traditional Log:**

```
User login failed for ID: 105 at 2025-05-03 14:21:00
```

**Structured Log (JSON):**

```json
{
  "timestamp": "2025-05-03T14:21:00Z",
  "event": "login_failed",
  "user_id": 105,
  "ip": "203.76.112.5",
  "reason": "invalid_password"
}
```

এই Structured Log এখন Elasticsearch, Datadog, Grafana, Kibana-এর মতো টুলগুলো খুব সহজে parse করে valuable insights তৈরি করতে পারে।

***

### কেন Structured Logging ব্যবহার করবেন?

#### সহজ ফিল্টারিং ও সার্চ

Traditional logs এ relevant log খুঁজে পাওয়া কষ্টসাধ্য। Structured logging এ আপনি নির্দিষ্ট key-value pair এর উপর ভিত্তি করে filter করতে পারবেন।

```bash
event:login_failed AND user_id:105
```

একটাই কমান্ডে, একদম দরকারি data।

***

#### Debugging অনেক দ্রুত হয়

ধরা যাক প্রোডাকশনে ইউজার লগইন করতে পারছে না। Traditional log এ শুধু এই লাইন:

```
Login failed.
```

কিন্তু Structured Logging ব্যবহার করলে:

```json
{
  "event": "login_failed",
  "username": "mominur123",
  "ip": "192.168.0.101",
  "timestamp": "2025-05-03T14:30:00Z",
  "reason": "invalid_password"
}
```

এখন Kibana বা Splunk-এ search দিয়ে কয়েক সেকেন্ডেই বুঝে গেলেন কোন ইউজার, কখন, কোন IP থেকে Failed চেষ্টা করেছিল।

***

#### Modern Tool Integration

Structured logs সরাসরি modern observability টুলগুলোতে feed করা যায়, যেমন:

* **Kibana**: Elasticsearch এর সাথে যুক্ত হয়ে dashboards ও analytics তৈরি করে।
* **Loki + Grafana**: Lightweight log aggregation system।
* **Datadog / Splunk**: Real-time monitoring ও alerting।

এছাড়া এসব টুলে alert system configure করে আপনি নির্দিষ্ট event এর উপর ভিত্তি করে automated notificationও পেতে পারেন।

***

### বাস্তব উদাহরণ: Structured Logging কিভাবে Debugging বাঁচায়

ধরি, একটি সার্ভার প্রতি ঘণ্টায় হঠাৎ করে slow হয়ে যাচ্ছে। Traditional log এ দেখা গেলো:

```
Request timed out at 14:00
Request timed out at 15:00
Request timed out at 16:00
```

কিন্তু কে request করেছে, কোন endpoint এ, কোন ডেটায় — কিছুই বোঝা যাচ্ছে না।

#### Structured Log ব্যবহার করলে:

```json
{
  "event": "timeout_error",
  "endpoint": "/api/payment",
  "user_id": 213,
  "ip": "203.76.112.5",
  "payload_size": "1.2MB",
  "timestamp": "2025-05-03T14:00:00Z"
}
```

এখন simple query দিলেই আপনি বুঝে যাবেন, কে, কখন, কী নিয়ে request করছিল। হয়তো দেখলেন বড় payload আসছিল `/api/payment` endpoint এ, সেটাই সমস্যা — এক মুহূর্তেই issue চিহ্নিত করা সম্ভব।

***

### কিভাবে Structured Logging শুরু করবেন?

#### ১. Format নির্ধারণ করুন

সাধারণত **JSON** সবচেয়ে জনপ্রিয় structured log format।

#### ২. Logging Library সেটআপ করুন

**Python (Example):**

```python
import logging
import json

class JSONFormatter(logging.Formatter):
    def format(self, record):
        log_data = {
            "timestamp": self.formatTime(record),
            "level": record.levelname,
            "message": record.getMessage(),
            "module": record.module
        }
        return json.dumps(log_data)

logger = logging.getLogger("structuredLogger")
handler = logging.StreamHandler()
handler.setFormatter(JSONFormatter())
logger.addHandler(handler)

logger.info("User logged in successfully")
```

***

### Best Practices

Always include:

* `timestamp`
* `event name`
* `user_id` (if applicable)
* `IP address`
* `error details`

Avoid writing log messages as long strings — break into key-values.\
Avoid logging sensitive info (password, tokens, etc.)

***

### **How to Connect Logs Across Multiple Services**

ধরুন আপনি  একটি ওয়েব অ্যাপ্লিকেশনে **Order Service API**, **Payment Service API**, এবং **Notification Service API** ব্যবহার করেন, তবে প্রতিটি সার্ভিসের লগ কিভাবে একসাথে সংযুক্ত করবেন এবং সমস্যার সমাধান দ্রুত কিভাবে করবেন, সেটা বুঝে নেওয়া খুবই জরুরি।

#### **Request ID এবং Transaction ID দিয়ে লগ কিভাবে সংযুক্ত করবেন?**

1. **Request ID তৈরি করুন:**\
   যখন ব্যবহারকারী অর্ডার দেবে, তখন একটি **Request ID** তৈরি করুন, যা এই রিকোয়েস্টের জন্য ইউনিক হবে। এই **Request ID** পরবর্তীতে **Payment Service API** এবং **Notification Service API** এ পাঠানো হবে।
2. **Transaction ID তৈরি করুন:**\
   প্রতিটি সার্ভিসের জন্য একটি **Transaction ID** তৈরি করুন, যা প্রতিটি নির্দিষ্ট অপারেশন ট্র্যাক করতে সাহায্য করবে।
3. **Request ID এবং Transaction ID** propagate **করুন:**\
   **Order Service API** যখন **Payment Service API** কে কল করবে, তখন এটি **Request ID** এবং নতুন **Transaction ID** পাঠাবে। পরবর্তীতে **Payment Service API** আবার **Notification Service API** কে একই **Request ID** দিয়ে কল করবে, এবং একটি নতুন **Transaction ID** তৈরি করবে।
4. **Structured Logs তৈরি করুন:**\
   প্রতিটি সার্ভিসে লগগুলি স্ট্রাকচারড ফরম্যাটে থাকবে, যাতে **Request ID**, **Transaction ID**, টাইমস্ট্যাম্প, সার্ভিসের নাম, লগ লেভেল ইত্যাদি থাকবে।

***

**Order Service API:**

```json
{
  "request_id": "req-12345",
  "transaction_id": "txn-abc123",
  "service": "Order Service",
  "message": "Order received. Initiating order creation.",
  "timestamp": "2025-05-01T10:00:00Z",
  "log_level": "INFO"
}
```

**Payment Service API:**

```json
{
  "request_id": "req-12345",
  "transaction_id": "txn-def456",
  "service": "Payment Service",
  "message": "Payment processing for order req-12345",
  "timestamp": "2025-05-01T10:01:00Z",
  "log_level": "INFO"
}
```

**Notification Service API:**

```json
{
  "request_id": "req-12345",
  "transaction_id": "txn-ghi789",
  "service": "Notification Service",
  "message": "Sending notification for successful payment on order req-12345",
  "timestamp": "2025-05-01T10:02:00Z",
  "log_level": "INFO"
}
```

***

#### **বাগ ট্রেসিংয়ের সুবিধা:**

1. **Traceability:** **Request ID** এর মাধ্যমে আপনি সমস্ত সার্ভিসের লগ একত্রিত করতে পারবেন, যা ডিবাগিং প্রক্রিয়াকে অনেক সহজ করে দেবে।
2. **দ্রুত সমাধান:** **Request ID** এবং **Transaction ID** ব্যবহারের ফলে আপনি দ্রুত সমস্যার উৎস চিহ্নিত করতে পারবেন।
3. **Context Preservation:** কোনো সার্ভিসে সমস্যা হলে, আপনি সম্পূর্ণ প্রক্রিয়া ট্র্যাক করতে পারবেন এবং দ্রুত সমাধান খুঁজে পেতে সাহায্য করবে।

***

Traditional logging অনেকটা Unorganized ডায়েরির মতো — কিছু লিখেছেন, কিন্তু সেটা আবার খুঁজে পাওয়া কঠিন। Structured Logging সেই ডায়েরিকে একটি indexed database-এ রূপান্তর করে, যেটা আপনি যখনই দরকার, নির্ভুলভাবে access করতে পারেন।

Debugging সহজ করা, alert তৈরি করা, root cause analysis — সবকিছুই দ্রুত এবং কার্যকর হয় Structured Logging এর মাধ্যমে।
