ログとデバッグ出力
PDF Oxide は Rust の log クレートを通じて、内部の debug・trace・warn・error ログを出力します。v0.3.24 以降、すべてのバインディングにグローバルな set_log_level / get_log_level 関数が追加され、Python・Node.js・Go・C#・Rust を横断して一貫したメッセージ制御が可能になりました。
v0.3.21 以降、Python のロギング統合が完全に尊重されるようになり、eprintln! 経由で logging.basicConfig を迂回するメッセージはなくなりました。
ログレベル
| レベル | 値 | 説明 |
|---|---|---|
OFF |
0 | ログ出力をすべて抑制する |
ERROR |
1 | 抽出を停止させるパニックやパース失敗 |
WARN |
2 | 回復済みエラー、問題を回避した不正なコンテンツ |
INFO |
3 | 高レベル操作(オープン・保存・認証) |
DEBUG |
4 | 内部の判断(カラム検出・読み取り順序) |
TRACE |
5 | オブジェクト単位の演算子解析、グリフ単位のメトリクス |
デフォルト: WARN。
Python
PDF Oxide のログマクロは logging.getLogger("pdf_oxide") に転送されます:
Python
import logging
import pdf_oxide
logging.basicConfig(level=logging.DEBUG)
# Equivalent to:
pdf_oxide.set_log_level("debug")
doc = pdf_oxide.PdfDocument("tricky.pdf")
doc.extract_text(0) # emits debug logs to root handler
C++
#include <pdf_oxide/pdf_oxide.hpp>
pdf_oxide::set_log_level(4); // 0=Off 1=Error 2=Warn 3=Info 4=Debug 5=Trace
Swift
import PdfOxide
setLogLevel(4) // 0=Off 1=Error 2=Warn 3=Info 4=Debug 5=Trace
Dart
import 'package:pdf_oxide/pdf_oxide.dart';
setLogLevel(4); // 0=Off 1=Error 2=Warn 3=Info 4=Debug 5=Trace
R
library(pdfoxide)
pdf_set_log_level(4L) # 0=Off 1=Error 2=Warn 3=Info 4=Debug 5=Trace
Julia
using PdfOxide
set_log_level(4) # 0=Off 1=Error 2=Warn 3=Info 4=Debug 5=Trace
Zig
const pdf_oxide = @import("pdf_oxide");
pdf_oxide.setLogLevel(4); // 0=Off 1=Error 2=Warn 3=Info 4=Debug 5=Trace
Objective-C
#import <POXPdfOxide.h>
[POXSigning setLogLevel:4]; // 0=Off 1=Error 2=Warn 3=Info 4=Debug 5=Trace
Elixir
PdfOxide.set_log_level(4) # 0=Off 1=Error 2=Warn 3=Info 4=Debug 5=Trace
PDF Oxide の出力だけを専用ロガーに振り向けるには:
Python
import logging
handler = logging.FileHandler("pdf_oxide.log")
handler.setFormatter(logging.Formatter("%(asctime)s %(levelname)s %(message)s"))
log = logging.getLogger("pdf_oxide")
log.addHandler(handler)
log.setLevel(logging.DEBUG)
Node.js
Node.js
const { setLogLevel } = require("pdf-oxide");
setLogLevel("debug"); // one of "off"|"error"|"warn"|"info"|"debug"|"trace"
C++
#include <pdf_oxide/pdf_oxide.hpp>
pdf_oxide::set_log_level(4); // 0=Off 1=Error 2=Warn 3=Info 4=Debug 5=Trace
Swift
import PdfOxide
setLogLevel(4) // 0=Off 1=Error 2=Warn 3=Info 4=Debug 5=Trace
Dart
import 'package:pdf_oxide/pdf_oxide.dart';
setLogLevel(4); // 0=Off 1=Error 2=Warn 3=Info 4=Debug 5=Trace
R
library(pdfoxide)
pdf_set_log_level(4L) # 0=Off 1=Error 2=Warn 3=Info 4=Debug 5=Trace
Julia
using PdfOxide
set_log_level(4) # 0=Off 1=Error 2=Warn 3=Info 4=Debug 5=Trace
Zig
const pdf_oxide = @import("pdf_oxide");
pdf_oxide.setLogLevel(4); // 0=Off 1=Error 2=Warn 3=Info 4=Debug 5=Trace
Objective-C
#import <POXPdfOxide.h>
[POXSigning setLogLevel:4]; // 0=Off 1=Error 2=Warn 3=Info 4=Debug 5=Trace
Elixir
PdfOxide.set_log_level(4) # 0=Off 1=Error 2=Warn 3=Info 4=Debug 5=Trace
ログは [LEVEL] message 形式で stderr に出力されます。任意のロガーにパイプできます:
Node.js
const { pipeline } = require("stream");
pipeline(
process.stderr,
myBunyanSink,
(err) => err && console.error("log pipe failed", err)
);
Go
Go
import pdfoxide "github.com/yfedoseev/pdf_oxide/go"
pdfoxide.SetLogLevel(pdfoxide.LogDebug)
C++
#include <pdf_oxide/pdf_oxide.hpp>
pdf_oxide::set_log_level(4); // 0=Off 1=Error 2=Warn 3=Info 4=Debug 5=Trace
Swift
import PdfOxide
setLogLevel(4) // 0=Off 1=Error 2=Warn 3=Info 4=Debug 5=Trace
Dart
import 'package:pdf_oxide/pdf_oxide.dart';
setLogLevel(4); // 0=Off 1=Error 2=Warn 3=Info 4=Debug 5=Trace
R
library(pdfoxide)
pdf_set_log_level(4L) # 0=Off 1=Error 2=Warn 3=Info 4=Debug 5=Trace
Julia
using PdfOxide
set_log_level(4) # 0=Off 1=Error 2=Warn 3=Info 4=Debug 5=Trace
Zig
const pdf_oxide = @import("pdf_oxide");
pdf_oxide.setLogLevel(4); // 0=Off 1=Error 2=Warn 3=Info 4=Debug 5=Trace
Objective-C
#import <POXPdfOxide.h>
[POXSigning setLogLevel:4]; // 0=Off 1=Error 2=Warn 3=Info 4=Debug 5=Trace
Elixir
PdfOxide.set_log_level(4) # 0=Off 1=Error 2=Warn 3=Info 4=Debug 5=Trace
出力をキャプチャするには、バイナリ起動前に RUST_LOG 環境変数をセットします:
RUST_LOG=pdf_oxide=debug ./my-app
C#
C#
using PdfOxide.Core;
PdfOxide.Logging.SetLogLevel(LogLevel.Debug);
C++
#include <pdf_oxide/pdf_oxide.hpp>
pdf_oxide::set_log_level(4); // 0=Off 1=Error 2=Warn 3=Info 4=Debug 5=Trace
Swift
import PdfOxide
setLogLevel(4) // 0=Off 1=Error 2=Warn 3=Info 4=Debug 5=Trace
Dart
import 'package:pdf_oxide/pdf_oxide.dart';
setLogLevel(4); // 0=Off 1=Error 2=Warn 3=Info 4=Debug 5=Trace
R
library(pdfoxide)
pdf_set_log_level(4L) # 0=Off 1=Error 2=Warn 3=Info 4=Debug 5=Trace
Julia
using PdfOxide
set_log_level(4) # 0=Off 1=Error 2=Warn 3=Info 4=Debug 5=Trace
Zig
const pdf_oxide = @import("pdf_oxide");
pdf_oxide.setLogLevel(4); // 0=Off 1=Error 2=Warn 3=Info 4=Debug 5=Trace
Objective-C
#import <POXPdfOxide.h>
[POXSigning setLogLevel:4]; // 0=Off 1=Error 2=Warn 3=Info 4=Debug 5=Trace
Elixir
PdfOxide.set_log_level(4) # 0=Off 1=Error 2=Warn 3=Info 4=Debug 5=Trace
ILogger に接続するには:
C#
var logger = loggerFactory.CreateLogger("PdfOxide");
PdfOxide.Logging.OnLog += (level, message) =>
{
logger.Log(Map(level), message);
};
Rust
log 互換のバックエンド(env_logger・tracing-log・slog-stdlog など)を使用できます。PDF Oxide は pdf_oxide ターゲット経由でログを出力します:
Rust
fn main() {
env_logger::builder()
.filter_module("pdf_oxide", log::LevelFilter::Debug)
.init();
let doc = pdf_oxide::PdfDocument::open("tricky.pdf").unwrap();
let _ = doc.extract_text(0);
}
DEBUG で何がわかる?
知っておくと便利な代表的なデバッグメッセージ:
Detected document script: Latin/Arabic/CJK— 読み取り順序のヒューリスティック選択結果。is_single_column_region = true— カラム検出器がシングルカラムレイアウトにフォールバック。Falling back to system font DejaVu Sans for ArialMT— フォント解決に失敗。Authenticating with user password—authenticate()成功後。Table detector: rejected 3 edges via coverage filter— エッジフィルタリングが適用された。
TRACE で何がわかる?
TRACE はオブジェクトごとのコンテンツストリーム解析と、グリフごとのフォントメトリクス解決を含みます。1ページの抽出結果が正しくない場合に、どの演算子が何を生成したかを確認するのに役立ちます。1ページあたり数千行に達することがあります。
関連ドキュメント
- レンダリング — レンダリング固有のログメッセージ(フォントフォールバックチェーン)。
- テキスト抽出のトラブルシューティング — 抽出結果のデバッグ。