پرش به مطلب اصلی

دریافت خروجی استاندارد (stdout) کانتینر

خروجی استاندارد کانتینر را دریافت می‌کند (جریان real-time خروجی).


🧩 دستور کلی

async getContainerStdOut(containerId, options = {})

شرح عملکرد

این متد خروجی استاندارد کانتینر را دریافت می‌کند. شامل:

  • تأیید کانتینر موجود است
  • دریافت stdout از container manager
  • بازگرداندن جریان یا رشته خروجی
  • logging عملیات

مهم: این متد خروجی فعلی stdout کانتینر را برمی‌گرداند. برای لاگ‌های کامل، از getContainerLogs() استفاده کنید.


ورودی‌ها

پارامترنوعاجباریتوضیح
containerIdStringبلهشناسه یا نام کانتینر
optionsObjectبلهگزینه‌های stdout
options.followBooleanخیردنبال کردن زنده (future feature)
options.filterStringخیرفیلتر بر اساس regex (future feature)

خروجی

نوع: Object یا String

{
data: "Container output lines...\nMore output...",
timestamp: "2025-11-30T14:30:45Z"
}

یا رشته مستقیم:

Container started successfully
Processing requests...
Service listening on port 8080

استثناها (Errors)

ResolveContainerName (500)

پیام: "Database error occurred while resolving container name or ID."

زمان رخ دادن: خطای دیتابیس در تطابق شناسه/نام کانتینر

جزئیات:

{
"type": "DB_ERROR",
"statusCode": 500,
"input": "container-id",
"error": "Database connection lost"
}

راهنمای حل:

  • اتصال دیتابیس را بررسی کنید
  • دیتابیس را راه‌اندازی کنید

ContainerNotFound (404)

پیام: "Container not found."

زمان رخ دادن: کانتینری با شناسه/نام درخواستی یافت نشود

جزئیات:

{
"type": "NOT_FOUND",
"statusCode": 404,
"containerId": "invalid-id"
}

راهنمای حل:

  • شناسه کانتینر را بررسی کنید
  • listContainers() استفاده کنید تا تمام کانتینرها را ببینید
  • نام یا ID صحیح را وارد کنید

InspectFailure (500)

پیام: "Failed to retrieve container stdout."

زمان رخ دادن: خطا در دریافت stdout از container manager

جزئیات:

{
"type": "CONTAINER_SERVICE_ERROR",
"statusCode": 500,
"containerId": "abc123def456",
"error": "Container manager communication failed"
}

راهنمای حل:

  • Container manager را بررسی کنید
  • سرویس container runtime را تأیید کنید
  • کانتینر درحال اجرا است یا خیر؟

GenericFailure (500)

پیام: "Generic failure during stdout retrieval."

زمان رخ دادن: خطای عمومی در دریافت stdout

جزئیات:

{
"type": "GENERIC_ERROR",
"statusCode": 500,
"containerId": "abc123def456",
"error": "Read operation failed"
}

راهنمای حل:

  • اجازه‌های فایل را بررسی کنید
  • فضای دیسک را تأیید کنید
  • container runtime logs را بررسی کنید

مثال‌های استفاده

مثال 1: دریافت خروجی ساده

const K3Core = require('k3-core');

(async () => {
const k3 = new K3Core();

try {
const stdout = await k3.containerCore.getContainerStdOut('my-container', {});
console.log('Container output:');
console.log(stdout.data || stdout);
} catch (error) {
console.log(error.createFullMessage());
}
})();

مثال 2: نمایش خروجی خط به خط

(async () => {
const k3 = new K3Core();

try {
const stdout = await k3.containerCore.getContainerStdOut('app-container', {});
const output = stdout.data || stdout;

const lines = output.split('\n');
console.log(`Total lines: ${lines.length}`);

lines.forEach((line, index) => {
if (line.trim()) {
console.log(`${index + 1}. ${line}`);
}
});
} catch (error) {
console.log(error.createFullMessage());
}
})();

مثال 3: جستجوی خروجی برای کلیدواژه

(async () => {
const k3 = new K3Core();

try {
const stdout = await k3.containerCore.getContainerStdOut('web-server', {});
const output = stdout.data || stdout;

const keyword = 'ERROR';
const lines = output.split('\n');
const found = lines.filter(l => l.includes(keyword));

console.log(`Found ${found.length} lines containing "${keyword}":`);
found.forEach(line => console.log(` ${line}`));
} catch (error) {
console.log(error.createFullMessage());
}
})();

مثال 4: نمایش خروجی با رنگ‌بندی

(async () => {
const k3 = new K3Core();

try {
const stdout = await k3.containerCore.getContainerStdOut('app', {});
const output = stdout.data || stdout;

output.split('\n').forEach(line => {
if (!line.trim()) return;

if (line.includes('ERROR')) {
console.log(`\x1b[31m${line}\x1b[0m`); // قرمز
} else if (line.includes('WARN')) {
console.log(`\x1b[33m${line}\x1b[0m`); // زرد
} else if (line.includes('SUCCESS')) {
console.log(`\x1b[32m${line}\x1b[0m`); // سبز
} else if (line.includes('INFO')) {
console.log(`\x1b[36m${line}\x1b[0m`); // آبی
} else {
console.log(line);
}
});
} catch (error) {
console.log(error.createFullMessage());
}
})();

مثال 5: تحلیل خروجی

(async () => {
const k3 = new K3Core();

try {
const stdout = await k3.containerCore.getContainerStdOut('service', {});
const output = stdout.data || stdout;

const lines = output.split('\n').filter(l => l.trim());
const analysis = {
total: lines.length,
errors: 0,
warnings: 0,
info: 0
};

lines.forEach(line => {
if (line.includes('ERROR')) analysis.errors++;
else if (line.includes('WARN')) analysis.warnings++;
else analysis.info++;
});

console.log('Output Analysis:');
console.log(` Total lines: ${analysis.total}`);
console.log(` Errors: ${analysis.errors}`);
console.log(` Warnings: ${analysis.warnings}`);
console.log(` Info/Other: ${analysis.info}`);
} catch (error) {
console.log(error.createFullMessage());
}
})();

مثال 6: صادرات خروجی به فایل

const fs = require('fs');
const path = require('path');

(async () => {
const k3 = new K3Core();

try {
const stdout = await k3.containerCore.getContainerStdOut('app', {});
const output = stdout.data || stdout;

const filename = `stdout-${Date.now()}.txt`;
const filepath = path.join('/tmp', filename);

fs.writeFileSync(filepath, output);
console.log(`Output saved to: ${filepath}`);
console.log(`Size: ${output.length} bytes`);
} catch (error) {
console.log(error.createFullMessage());
}
})();

مثال 7: دریافت خروجی و بررسی وضعیت

(async () => {
const k3 = new K3Core();
const containerId = 'monitor-service';

try {
// Step 1: بررسی کانتینر
const inspect = await k3.containerCore.inspectContainer(containerId);
console.log(`Container: ${inspect.name}`);
console.log(`Status: ${inspect.state?.running ? 'Running' : 'Stopped'}`);

// Step 2: دریافت stdout
const stdout = await k3.containerCore.getContainerStdOut(containerId, {});
const output = stdout.data || stdout;

const lines = output.split('\n').filter(l => l.trim());
console.log(`\nStdout: ${lines.length} lines`);

if (lines.length > 0) {
console.log('Last 5 lines:');
lines.slice(-5).forEach(line => console.log(` ${line}`));
}
} catch (error) {
console.log(error.createFullMessage());
}
})();

مثال 8: مقایسه stdout و logs

(async () => {
const k3 = new K3Core();
const containerId = 'app';

try {
// دریافت stdout
const stdout = await k3.containerCore.getContainerStdOut(containerId, {});
const stdoutData = stdout.data || stdout;

// دریافت logs
const logs = await k3.containerCore.getContainerLogs(containerId, {
number: 100
});

console.log('Comparison:');
console.log(` Stdout lines: ${stdoutData.split('\n').length}`);
console.log(` Log entries: ${logs.length}`);

// stdout معمولاً خروجی فعلی است
// logs تاریخچه کامل است

if (logs.length > 0) {
const lastLog = logs[logs.length - 1];
console.log(`\nLast log entry: ${lastLog.timestamp}`);
console.log(`Message: ${lastLog.message.substring(0, 60)}...`);
}
} catch (error) {
console.log(error.createFullMessage());
}
})();

الگوهای خطا و راهنمای حل

الگو 1: کانتینر یافت نشد

خطا: ContainerNotFound (404)

راهنمای حل:

try {
const stdout = await k3.containerCore.getContainerStdOut('unknown-container', {});
} catch (error) {
if (error.type === 'NOT_FOUND') {
console.log('Container not found');
const containers = await k3.containerCore.listContainers({ all: true });
console.log('Available containers:');
containers.forEach(c => console.log(` - ${c.name} (${c.id})`));

// تلاش مجدد با کانتینر معتبر
if (containers.length > 0) {
const stdout = await k3.containerCore.getContainerStdOut(
containers[0].name,
{}
);
console.log('Got stdout from first container');
}
} else {
console.log(error.createFullMessage());
}
}

الگو 2: Container manager خطا

خطا: InspectFailure (500)

راهنمای حل:

try {
const stdout = await k3.containerCore.getContainerStdOut('app', {});
} catch (error) {
if (error.type === 'CONTAINER_SERVICE_ERROR') {
console.log('Container manager error');

// بررسی وضعیت کانتینر
try {
const inspect = await k3.containerCore.inspectContainer('app');
console.log(`Container state: ${inspect.state?.running ? 'Running' : 'Stopped'}`);

if (!inspect.state?.running) {
console.log('Starting container...');
await k3.containerCore.startContainer('app', {});

// صبر برای شروع
await new Promise(resolve => setTimeout(resolve, 2000));

// دوباره تلاش
const stdout = await k3.containerCore.getContainerStdOut('app', {});
console.log('Successfully retrieved stdout after start');
}
} catch (e) {
console.log('Could not inspect container');
}
} else {
console.log(error.createFullMessage());
}
}

الگو 3: فیلتر کردن خروجی

راهنمای حل:

const filterStdOut = async (containerId, keyword) => {
try {
const stdout = await k3.containerCore.getContainerStdOut(containerId, {});
const output = stdout.data || stdout;

const lines = output.split('\n');
const filtered = lines.filter(line =>
line.toLowerCase().includes(keyword.toLowerCase())
);

return {
total: lines.length,
matched: filtered.length,
lines: filtered
};
} catch (error) {
console.log('Filter failed:', error.message);
return { total: 0, matched: 0, lines: [] };
}
};

const result = await filterStdOut('app', 'error');
console.log(`Found ${result.matched} out of ${result.total} lines`);
result.lines.forEach(line => console.log(` ${line}`));

الگو 4: نمایش stdout به صورت real-time

راهنمای حل:

class StdOutMonitor {
constructor(containerId, interval = 2000) {
this.containerId = containerId;
this.interval = interval;
this.lastSize = 0;
}

async start(k3) {
console.log(`Monitoring stdout for ${this.containerId}...`);

this.intervalId = setInterval(async () => {
try {
const stdout = await k3.containerCore.getContainerStdOut(
this.containerId,
{}
);
const output = stdout.data || stdout;

if (output.length > this.lastSize) {
const newOutput = output.substring(this.lastSize);
console.log(newOutput);
this.lastSize = output.length;
}
} catch (error) {
if (error.message.includes('ENOENT')) {
console.log('(Waiting for container output...)');
} else {
console.error('Error:', error.message);
}
}
}, this.interval);
}

stop() {
if (this.intervalId) {
clearInterval(this.intervalId);
console.log('Monitor stopped');
}
}
}

const monitor = new StdOutMonitor('app', 1000);
await monitor.start(k3);

الگو 5: تحلیل عمیق stdout

راهنمای حل:

const analyzeStdOut = async (containerId) => {
try {
const stdout = await k3.containerCore.getContainerStdOut(containerId, {});
const output = stdout.data || stdout;

const lines = output.split('\n').filter(l => l.trim());

const analysis = {
total: lines.length,
errors: [],
warnings: [],
info: [],
performance: [],
timestamps: []
};

lines.forEach(line => {
if (line.match(/error|failed|exception/i)) {
analysis.errors.push(line);
} else if (line.match(/warn|warning|deprecated/i)) {
analysis.warnings.push(line);
} else if (line.match(/info|debug|verbose/i)) {
analysis.info.push(line);
}

// جستجوی اطلاعات performance
if (line.match(/\d+ms|duration|latency|timeout/i)) {
analysis.performance.push(line);
}
});

return analysis;
} catch (error) {
console.log('Analysis failed:', error.message);
return null;
}
};

const analysis = await analyzeStdOut('app');
console.log('StdOut Analysis:');
console.log(` Total: ${analysis.total} lines`);
console.log(` Errors: ${analysis.errors.length}`);
console.log(` Warnings: ${analysis.warnings.length}`);
console.log(` Performance mentions: ${analysis.performance.length}`);

نکات عملی

  1. stdout vs logs:

    • stdout: خروجی فعلی (real-time)
    • logs: تاریخچه کامل (parsed entries)
  2. Output Format:

    • رشته یا Object با property data
    • خطوط \n جدا شده
  3. Container State:

    • stdout برای کانتینرهای فعال بهتر کار می‌کند
    • کانتینرهای متوقف ممکن است stdout خالی داشته باشند
  4. Performance:

    • برای stdout بزرگ از regex filter استفاده کنید
    • split و parse می‌تواند هزینه داشته باشد
  5. Real-time Monitoring:

    • polling بهتر از stream برای سادگی
    • interval 1-2 ثانیه کافی است
  6. Error Patterns:

    • ENOENT = هیچ output یا فایل باز نشده
    • CONTAINER_SERVICE_ERROR = runtime issue
  7. File Descriptors:

    • stdout معمولاً fd=1 است
    • Container manager باید fd را track کند

دنباله عملیات

  1. Resolve container ID/name
  2. Fetch stdout from container manager
  3. Handle errors and exceptions
  4. Return stdout data
  5. Log operation

مرجع سریع

وضعیتکدتوضیح
موفق200stdout دریافت شد
خالی200stdout خالی است
یافت نشد404ContainerNotFound
خطای runtime500InspectFailure
خطای عمومی500GenericFailure

موارد استفاده

Real-time Monitoring

const monitor = new StdOutMonitor('app');
await monitor.start(k3);

Debugging

const stdout = await getContainerStdOut('app', {});
const errors = stdout.split('\n').filter(l => l.includes('ERROR'));

Log Aggregation

const stdout = await getContainerStdOut('app', {});
fs.appendFileSync('aggregate.log', stdout);

Alert Triggering

const stdout = await getContainerStdOut('app', {});
if (stdout.includes('CRITICAL')) {
await sendAlert();
}

نسخه: 1.3
تاریخ آپدیت: 9 آذرماه ۱۴۰۴
تیم توسعه: K3 Development Team