دریافت خروجی استاندارد (stdout) کانتینر
خروجی استاندارد کانتینر را دریافت میکند (جریان real-time خروجی).
🧩 دستور کلی
async getContainerStdOut(containerId, options = {})
شرح عملکرد
این متد خروجی استاندارد کانتینر را دریافت میکند. شامل:
- تأیید کانتینر موجود است
- دریافت stdout از container manager
- بازگرداندن جریان یا رشته خروجی
- logging عملیات
مهم: این متد خروجی فعلی stdout کانتینر را برمیگرداند. برای لاگهای کامل، از getContainerLogs() استفاده کنید.
ورودیها
| پارامتر | نوع | اجباری | توضیح |
|---|---|---|---|
containerId | String | بله | شناسه یا نام کانتینر |
options | Object | بله | گزینههای stdout |
options.follow | Boolean | خیر | دنبال کردن زنده (future feature) |
options.filter | String | خیر | فیلتر بر اساس 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}`);
نکات عملی
-
stdout vs logs:
stdout: خروجی فعلی (real-time)logs: تاریخچه کامل (parsed entries)
-
Output Format:
- رشته یا Object با property
data - خطوط \n جدا شده
- رشته یا Object با property
-
Container State:
- stdout برای کانتینرهای فعال بهتر کار میکند
- کانتینرهای متوقف ممکن است stdout خالی داشته باشند
-
Performance:
- برای stdout بزرگ از regex filter استفاده کنید
- split و parse میتواند هزینه داشته باشد
-
Real-time Monitoring:
- polling بهتر از stream برای سادگی
- interval 1-2 ثانیه کافی است
-
Error Patterns:
- ENOENT = هیچ output یا فایل باز نشده
- CONTAINER_SERVICE_ERROR = runtime issue
-
File Descriptors:
- stdout معمولاً fd=1 است
- Container manager باید fd را track کند
دنباله عملیات
- Resolve container ID/name
- Fetch stdout from container manager
- Handle errors and exceptions
- Return stdout data
- Log operation
مرجع سریع
| وضعیت | کد | توضیح |
|---|---|---|
| موفق | 200 | stdout دریافت شد |
| خالی | 200 | stdout خالی است |
| یافت نشد | 404 | ContainerNotFound |
| خطای runtime | 500 | InspectFailure |
| خطای عمومی | 500 | GenericFailure |
موارد استفاده
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