Логування та налагоджувальний вивід
PDF Oxide виводить внутрішні логи рівнів debug, trace, warn та error через Rust-крейт log. Починаючи з v0.3.24, кожна прив’язка надає глобальні функції set_log_level / get_log_level, які дають змогу однаково керувати повідомленнями в Python, Node.js, Go, C# та Rust.
Починаючи з v0.3.21, інтеграція з системою логування Python повністю дотримується — повідомлення більше не обходять logging.basicConfig через eprintln!.
Рівні логування
| Рівень | Значення | Опис |
|---|---|---|
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
Логи надходять до stderr у форматі [LEVEL] message. Перенаправте їх до будь-якого логера:
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 включає розбір потоків вмісту на рівні об’єктів та розпізнавання метрик шрифтів на рівні гліфів — стане у пригоді, коли одна сторінка витягується неправильно і потрібно з’ясувати, який оператор що породив. Очікуйте тисячі рядків на сторінку.
Пов’язані розділи
- Рендеринг — повідомлення логів, специфічні для рендерингу (ланцюжок підстановки шрифтів).
- Усунення несправностей витягування тексту — налагодження результатів витягування.