Skip to content

Логування та налагоджувальний вивід

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 включає розбір потоків вмісту на рівні об’єктів та розпізнавання метрик шрифтів на рівні гліфів — стане у пригоді, коли одна сторінка витягується неправильно і потрібно з’ясувати, який оператор що породив. Очікуйте тисячі рядків на сторінку.

Пов’язані розділи