بڑے پیمانے پر C اطلاقیے میں، Gmail ایک اہم ذریعہ ہے، نگرانی، نگرانی اور نظام صحت کے لیے،

کیوں ایک کیمیائی نظام تعمیر کریں

معیاری serviews، مثلاً یا POSX ایپی، اکثر بڑے اطلاقات کی طرف سے درکار گرین لینڈنگ اور کارکردگی کی کمی۔ ایک دستور لاگو پیش کرتا ہے:

  • Optimed production: جب لاگ سطحیں دبا دی جائیں تو غیر ضروری طور پر غیر ضروری کارکردگی اور فارمیٹ سے گریز کریں۔
  • Flexible فارمیٹنگ: [حوالہ درکار اوقات، تراش شناخت کنندہ اور مصدر پیمائی کو بہتر طور پر پڑھنے کے لیے لاج پڑھنے اور اس کی تیاری میں بہتری آتی ہے۔
  • Granular قابو :] بغیر وقفہ کے جاری کردہ مخصوص لاگ سطحوں میں فعال کرنا/disab مخصوص لاج کی سطحیں۔
  • Multiple منزلیں : [1] تحریری طور پر نگرانی، فائل، نیٹ ورک صوتی یا بیرونی نگرانیی نظامات کو غیر واضح طور پر لکھنے کے لیے لکھا گیا ہے۔
  • [Thread s محفوظ:] کثیر القومی اطلاقات میں باہمی برآمدات کو روکنے کے لیے استعمال ہونے والے انفنٹری یا ایٹمی عمل استعمال کریں۔

ڈیزائن کے متعلق تجاویز

کسی بھی کوڈ کو لکھنے سے پہلے آپ کے نظام کے بنیادی اجزاء کو متعین کریں۔یہ فیصلے ایپ آئی ڈی سے ہر چیز کو تشکیل دیتے ہیں تاکہ وقتی کارکردگی چلائی جا سکے۔

لاگ انس

[ فٹ‌نوٹ :8 ] ، [ فٹ‌نوٹ ] ، [ فٹ‌نوٹ ] ، [ فٹ‌نوٹ ] ، [ فٹ‌نوٹ ] ، [ فٹ‌نوٹ :7) ، [ فٹ‌نوٹ ] اور [ فٹ‌نوٹ : ۹ ] ] ۔ [ فٹ‌نوٹ ] استعمال کریں ۔ [ فٹ‌نوٹ ]

لاگ منزلیں

ذرا غور کریں کہ کہاں لاگیں لکھی جائیں گی ۔

  • Consulation – ترقی اور تیز رفتاری کے لیے.
  • ] – ڈسک کی جگہ کو منظم کرنے کے لیے گردش اور آرکائیو کے ساتھ.
  • [Syslog – مرکزی طور پر بننے والی اکائیات کے لیے
  • – UCDP یا TCP Sockets for فاصلےی ریزون (مثلاً Grylog, ELK Stock)۔

ایک اچھی طرح سے تیار کردہ لاگجر ایک ایسے دھماکا خیز مواد کا استعمال کرتا ہے جس کی مدد سے آپ کو چلانے کے وقت میں منزلیں شامل یا دور کرنے کے قابل ہو جاتے ہیں۔

کنونشن اور کنونشن

اپني کچھي شکلوں کو تناسب رکھنے کے ليے لا گ اي بارك شکل ميں فیصلہ کريں ۔ عام فارم ميں بسا اوقات ، لا کى سطح ، سُست فائل/ لائن ، ٹائپس ، اور پیام ۔ جسٹ کو آسان بنانا مگر اسپرٹنگ کے لیے ٹھوس اسم فا ئل کو استعمال کريں (مثلاً پائپ یا ٹیوبس ) اور گرم راستوں ميں متحرک یادداشت کو متحرک نہ کرنا

محفوظ کریں

کثیر التعداد اطلاقات میں، غیر فعال تحریر کردہ معلوماتی پیداوار پیدا کرسکتے ہیں [1] استعمال کریں(POSX system) یا کریتی حصہ (on on on urredent area) استعمال کریں ۔

بنیادی لاگ‌گر کی شناخت

شروع میں ایک سادہ عمل سے جو ضروری ضروریات کو احاطہ کرتا ہے: لاگ سطحیں، باراتپ فارمیٹ اور دوبارہ تبدیل شدہ پیام سازی۔ ذیل میں درج شدہ کوڈ ایک بنیاد فراہم کرتا ہے۔

لاگ کلاس انیم اور معاون فیٹنگ

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <time.h>
#include <pthread.h>

typedef enum {
 LOG_LEVEL_TRACE,
 LOG_LEVEL_DEBUG,
 LOG_LEVEL_INFO,
 LOG_LEVEL_WARN,
 LOG_LEVEL_ERROR,
 LOG_LEVEL_FATAL
} LogLevel;

static const char* level_strings[] = {
 "TRACE", "DEBUG", "INFO", "WARN", "ERROR", "FATAL"
};

static LogLevel g_min_level = LOG_LEVEL_INFO;
static pthread_mutex_t g_log_mutex = PTHREAD_MUTEX_INITIALIZER;

پیام بھیجا جا رہا ہے

بنیادی طور پر استعمال ہونے والا عمل پیغام کو محفوظ انداز میں تشکیل دینے کے لیے استعمال ہوتا ہے۔ایکسفر بفر گرم راستے میں موجود ڈھیروں سے گریز کرتا ہے لیکن بہت طویل پیغامات کے لیے بفرہ کی خوشبو سے خبردار رہنا۔

void log_message(LogLevel level, const char* file, int line, const char* func, const char* format, ...) {
 if (level < g_min_level) return;

 time_t now = time(NULL);
 struct tm* tm_info = localtime(&now);
 char time_buf[20];
 strftime(time_buf, sizeof(time_buf), "%Y-%m-%d %H:%M:%S", tm_info);

 pthread_mutex_lock(&g_log_mutex);

 // Write header
 fprintf(stdout, "[%s] [%s] [%s:%d %s] ", time_buf, level_strings[level], file, line, func);

 va_list args;
 va_start(args, format);
 vfprintf(stdout, format, args);
 va_end(args);

 fprintf(stdout, "\n");
 fflush(stdout); // Ensure immediate output for debugging

 pthread_mutex_unlock(&g_log_mutex);
}

سہولت کے لیے، میکروس کا تعین کریں جو خودبخود ماخذ فائل اور لائن پر قبضہ کر لیں:

#define LOG_TRACE(...) log_message(LOG_LEVEL_TRACE, __FILE__, __LINE__, __func__, __VA_ARGS__)
#define LOG_DEBUG(...) log_message(LOG_LEVEL_DEBUG, __FILE__, __LINE__, __func__, __VA_ARGS__)
// ... similar for INFO, WARN, ERROR, FATAL

استعمال:

int main() {
 LOG_INFO("Application started on port %d", 8080);
 LOG_WARN("Disk usage exceeding %.1f%%", 85.3);
 LOG_ERROR("Failed to open file: %s", "config.dat");
 return 0;
}

فائل کا ما حاصل اور رٹ‌ٹیشن شامل کرنا

ترقی کے دوران میں دوبارہ حاصل ہونے والی برآمدات مفید ہیں لیکن پیداواری نظاموں کو مستقل لاگس کی ضرورت ہے. فائل کو گرانے کے لیے بھی شامل کریں جو لاگ فائل کے ایک سیٹ کو لکھے ہوئے

فائل رولر

فائل پوائنٹر کے ساتھ لاگger کو ملا ئيں آپ یا تو سخت ترین کووڈ کر سکتے هيں یا پھر اسے قابلِ تلا ش کر سکتے هيں وہی شمارندیکس فائل کو محفوظ کرتا ہے۔

static FILE* g_log_file = NULL;

int log_init_file(const char* path) {
 g_log_file = fopen(path, "a");
 return (g_log_file != NULL) ? 0 : -1;
}

void log_message_file(LogLevel level, const char* file, int line, const char* func, const char* format, ...) {
 // Same timestamp and header logic, but write to g_log_file
 // ...
}

لاگ روٹشن سٹرٹیج

لاگ فائل کو تمام ڈسک گاہ کو نا اُتارنے سے روکنے کے لیے، فائل حجم پر مبنی، تاریخ یا دونوں پر مبنی ڈسک پر عمل پیرا ہونے کی کوشش کرنا۔ آسان تدبیر:

  • موجودہ فائل حجم کو جانچ کر ہر لکھنے کے بعد (یا غیر واضح)۔
  • جب فائل سے تجاوز کر جاتا ہے (مثلاً 100 MB) تو اس کا نام بدل کر ( ، پھر پرانی فائل اتاری گئی اور پھر تازہ [FLT:FLT:T] کھول دیتا ہے۔
  • سب سے قدیم فائل کو حذف کریں ۔

مثال کی تصویر:

void log_rotate_if_needed() {
 if (g_log_file && ftell(g_log_file) > MAX_LOG_SIZE) {
 fclose(g_log_file);
 // Rename and compress logic
 g_log_file = fopen(LOG_PATH, "a");
 }
}

پرفارمنس کیلئے Asychronous uses

سیدھی آئی/O گرم راستے میں سوراخ اور ذلت آمیز کارکردگی کو بلاک کر سکتے ہیں. Asychronous spect decouples artmentting from from ڈسک یا نیٹ ورک سے ایک پروڈیوسر ⁇ consumerqueue لکھتے ہیں۔

دباؤ کا ریشو:

لاگسس کو محفوظ کرنے کے لئے

فوائد:

  • اطلاقی نعروں کا کبھی I/O کے لئے انتظار نہیں کیا.
  • اگر آپ کسی کو بتائیں گے کہ آپ کو اِس کے بارے میں کیسا محسوس ہوتا ہے تو آپ کو کیا کرنا چاہئے ؟
  • بیٹچینگ لکھتا ہے کہ نظامِ شمسی کو کم و بیش (system) کہتے ہیں۔

نقل‌مکانی کرنا

#define QUEUE_SIZE 8192
static char g_log_queue[QUEUE_SIZE][MAX_LOG_LINE];
static volatile int g_queue_head = 0, g_queue_tail = 0;
static pthread_mutex_t g_queue_mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t g_queue_notify = PTHREAD_COND_INITIALIZER;

void push_log(const char* logline) {
 pthread_mutex_lock(&g_queue_mutex);
 // Copy and advance head (ring buffer)
 strncpy(g_log_queue[g_queue_head], logline, MAX_LOG_LINE);
 g_queue_head = (g_queue_head + 1) % QUEUE_SIZE;
 pthread_cond_signal(&g_queue_notify);
 pthread_mutex_unlock(&g_queue_mutex);
}

void* log_flush_thread(void* arg) {
 while (1) {
 pthread_mutex_lock(&g_queue_mutex);
 while (g_queue_head == g_queue_tail)
 pthread_cond_wait(&g_queue_notify, &g_queue_mutex);
 // Dequeue and write to file/console
 char buffer[MAX_LOG_LINE];
 strncpy(buffer, g_log_queue[g_queue_tail], MAX_LOG_LINE);
 g_queue_tail = (g_queue_tail + 1) % QUEUE_SIZE;
 pthread_mutex_unlock(&g_queue_mutex);
 // Perform I/O (protected by the same file mutex)
 fputs(buffer, g_log_file);
 }
 return NULL;
}

اضافی معلومات

ایک بار جب بنیادی نظام عمل میں آ جاتا ہے تو ان عوامل کو بڑے اطلاقات کے لیے ملاحظہ کیجئے۔

جی‌نہیں ۔

cJGBEL] چیز بنانے کے لیے ایک ہلکے وزن کا مطالعہ کریں:

{"timestamp":"2025-03-20T10:15:30Z","level":"ERROR","module":"auth","message":"Login failed","user":"john"}

اگرچہ یہ شکل‌وصورت ایک ایسی مشین ہے جس میں ایک خاص آلہ تیار کِیا جاتا ہے ۔

Syslog یا نیٹ ورک کے ذریعے دور دراز کرو

تقسیمی نظامات کے لیے، آگے چل کر ایک مرکزی منزل تک.

فائل رولر

ڈرنے والوں کو ڈرل کرنے کی اجازت دے تا کہ وه اوپری ای ڈی بنانے کے لیے لا ئے سطح ، فائل راستہ ، گردشی حجم اور آؤٹ ہونے والی منزلوں کو ۔ پرسےسے ایک آسان آئینی آئینی آئینی فائل یا استعمال شدہ ماحول کی تبدیلی کے ذریعے (جیسے،

بہترین مشقیں اور پُراسرار چیزیں

ایسی غلطیوں سے گریز کریں جو اُس کی اہمیت کو کم کر دیتی ہیں ۔

سر پر کام کرنا

پلگ انس کو بر طا ل نہ بن ئے ہمیشہ فارمیٹ کے مباحثوں سے پہلے لاگ انس کا چیک کريں ۔مکرس استعمال کريں جو سطح کا حساب جلدی سے جائزہ لے گا کر نے والے راستے میں قدم رکھ ليے سے گریز کریں؛ اس کی جگہ اسٹاک بافیس بافی استعمال کریں۔

سیکورٹی خدشات

کبھی بھی لاگ حساس معلومات جیسے کہ پاس ورڈ، کریڈٹ کارڈ نمبر یا ذاتی ڈیٹا۔ شِٹِٹ صارف کو درآمد کرنا اور پیداوار میں سرخ عمل کے میدانوں کو غور سے کام لینا

ایک کامیاب کاروبار

کمپنی قائم کریں ⁇ world settlements (مثلاً ، ، اور معیاری اوقات اوقات (UTC کو تقسیم کرنے کے لیے). دستاویزات فارمیٹ تاکہ ٹیموں کو دوبارہ منظم کیا جا سکے۔

کُنَّا

سی میں ایک دستوري نظام بڑے پیمانے پر اطلاق کي ضرورت هے بڑے پیمانے پر استعمال کي ضرورت هے ۔ ايک مضبوط ڈیزائن سے شروع کريں جو لاگ سطحوں کو ڈھانپے ، سوراخوں ، ٹِٹ اور فارمنگ سے آپ بتدریج ترقی کر سکتے هيں اس مضمون میں درج اس اساسیپيپي ، لاگس اور دوري سے آگے بڑھنے کے ليے مثالیں آپ ان کو اپنے مخصوص ماحول تک پہنچانے کي کام ميں لا ئی مدد کے لئے استعمال کر سکتے هيں