chore: 引入统一日志模块,统一 cli 输出

This commit is contained in:
rbetree
2026-01-16 17:29:05 +08:00
parent f2f59108a0
commit 87d1f0244c
26 changed files with 903 additions and 150 deletions

View File

@@ -6,6 +6,9 @@ const net = require('node:net');
const Parser = require('rss-parser');
const { loadConfig } = require('../src/generator.js');
const { createLogger, isVerbose, startTimer } = require('../src/generator/utils/logger');
const log = createLogger('sync:articles');
const DEFAULT_RSS_SETTINGS = {
enabled: true,
@@ -488,7 +491,7 @@ async function processSourceSite(sourceSite, settings, parser, deadlineTs) {
throw lastError || new Error('未找到可用 Feed');
};
const startedAt = Date.now();
const elapsedMs = startTimer();
for (let i = 0; i <= settings.fetch.maxRetries; i += 1) {
try {
// eslint-disable-next-line no-await-in-loop
@@ -501,7 +504,7 @@ async function processSourceSite(sourceSite, settings, parser, deadlineTs) {
status: 'success',
error: '',
fetchedAt: new Date().toISOString(),
durationMs: Date.now() - startedAt,
durationMs: elapsedMs(),
},
articles: res.articles,
};
@@ -518,7 +521,7 @@ async function processSourceSite(sourceSite, settings, parser, deadlineTs) {
status: 'failed',
error: lastError ? String(lastError.message || lastError) : '未知错误',
fetchedAt: new Date().toISOString(),
durationMs: Date.now() - startedAt,
durationMs: elapsedMs(),
},
articles: [],
};
@@ -582,6 +585,7 @@ async function syncArticlesForPage(pageId, pageConfig, config, settings) {
pageConfig && Array.isArray(pageConfig.categories) ? pageConfig.categories : []
);
const elapsedMs = startTimer();
const startedAt = Date.now();
const deadlineTs = startedAt + settings.fetch.totalTimeoutMs;
@@ -635,7 +639,7 @@ async function syncArticlesForPage(pageId, pageConfig, config, settings) {
failedSites,
skippedSites,
totalArticles: limitedArticles.length,
durationMs: Date.now() - startedAt,
durationMs: elapsedMs(),
},
};
@@ -670,43 +674,63 @@ function pickArticlesPages(config, onlyPageId) {
}
async function main() {
const elapsedMs = startTimer();
const args = process.argv.slice(2);
const pageArgIndex = args.findIndex((a) => a === '--page');
const onlyPageId = pageArgIndex >= 0 ? args[pageArgIndex + 1] : null;
log.info('开始', { page: onlyPageId || '' });
const config = loadConfig();
const settings = getRssSettings(config);
if (!settings.enabled) {
console.log('[INFO] RSS 已禁用(RSS_ENABLED=false),跳过。');
log.ok('RSS 已禁用,跳过', { env: 'RSS_ENABLED=false' });
return;
}
const pages = pickArticlesPages(config, onlyPageId);
if (pages.length === 0) {
console.log('[INFO] 未找到需要同步的 articles 页面');
log.ok('未找到需要同步的 articles 页面,跳过');
return;
}
console.log(`[INFO] 准备同步 ${pages.length} 个 articles 页面缓存…`);
log.info('准备同步 articles 页面缓存', { pages: pages.length });
let success = 0;
let failed = 0;
for (const { pageId, pageConfig } of pages) {
try {
// eslint-disable-next-line no-await-in-loop
const { cachePath, cache } = await syncArticlesForPage(pageId, pageConfig, config, settings);
console.log(
`[INFO] 已生成缓存:${cachePath}articles=${cache.stats.totalArticles}, sites=${cache.stats.totalSites}`
);
success += 1;
log.ok('已生成缓存', {
page: pageId,
cache: cachePath,
articles: cache && cache.stats ? cache.stats.totalArticles : '',
sites: cache && cache.stats ? cache.stats.totalSites : '',
});
} catch (e) {
console.warn(`[WARN] 页面 ${pageId} 同步失败:${e.message || e}`);
failed += 1;
log.warn('页面同步失败已跳过best-effort', {
page: pageId,
message: e && e.message ? e.message : String(e),
});
if (isVerbose() && e && e.stack) console.error(e.stack);
// best-effort不阻断其他页面/后续 build
}
}
log.ok('完成', { ms: elapsedMs(), pages: pages.length, success, failed });
}
if (require.main === module) {
main().catch((err) => {
console.error('[ERROR] sync-articles 执行失败:', err);
log.error('执行失败best-effort不阻断后续 build/deploy', {
message: err && err.message ? err.message : String(err),
});
if (isVerbose() && err && err.stack) console.error(err.stack);
// best-effort不阻断后续 build/deploy错误已输出到日志便于排查
process.exitCode = 0;
});