HarmonyOSアプリケーション開発では、デバッグ効率を向上させるためにログ出力位置の特定が重要課題です。本稿では、スタックトレース情報を活用した自動位置特定機能の実装手法を解説します。
実装後のログ出力例:
W [EntryAbility.ets:23] ユーザー認証失敗 - ID: user_001この形式により、エディタ上でファイルパスをクリックするだけで該当コード位置へ直接ジャンプ可能です。 コアコンポーネントの実装 スタックトレース解析クラスを新たに構築します。以下のTraceLocatorクラスは、エラースタックから必要な位置情報を抽出します。
export class TraceLocator {
static extractPosition(depth: number, actualLine: number): string {
const error = new Error();
const stackLines = (error.stack || '').split('\n');
if (stackLines.length <= depth + 1) return `[line:${actualLine}]`;
const targetLine = stackLines[depth + 1].trim();
const fileMatch = targetLine.match(/\((.*?):\d+:\d+\)/);
if (fileMatch && fileMatch[1]) {
const filePath = fileMatch[1].replace('file://', '');
const fileName = filePath.split('/').pop() || 'unknown';
return `[${fileName}:${actualLine}]`;
}
return `[line:${actualLine}]`;
}
}
拡張ログ機能の実装
TraceLocatorを活用したログユーティリティクラスを構築します。
class DebugLogger {
static warning(tag: string, ...messages: unknown[]): void {
const currentLine = new Error().stack?.split('\n')[2]
.match(/:(\d+):\d+\)/)?.[1] || '??';
const location = TraceLocator.extractPosition(3, parseInt(currentLine));
const formatted = `[${tag}] ${location} ${messages.join(' ')}`;
console.warn(`W ${formatted}`);
}
}
実装例
アプリケーションコード内での使用方法:
// ユーザー操作処理中
if (!authResult) {
DebugLogger.warning('SECURITY', '認証トークン検証失敗', token);
}
出力結果:
W [SECURITY] [AuthService.ets:47] 認証トークン検証失敗 eyJhbGciOiJIUzI1NiIs注意点 TypeScriptからETSへのトランスパイル過程で行番号がずれる可能性があります。本実装ではErrorオブジェクトのスタックトレースを動的に取得するため、トランスパイル後の実際の行番号を自動判別します。ただし、minify処理が適用された環境では位置情報が正確でない場合があります。