Imagine you have a 1C-Bitrix autofill parser processing a catalog of 10,000 products. An hour later you see only 300 imported. Without logs, you guess: empty page from source? Broken XPath? PHP memory limit hit at 50,000th item? With audit trails, you immediately see that at item 501 the 128 MB memory limit exhausted. Configuring structured audit trails is not a luxury — it's essential for any autofill project. Our 10+ years of experience with 50+ Bitrix integration projects shows that proper configuration cuts incident investigation from hours to minutes — 36x faster in some cases. On one project, we accelerated error detection 6 times and saved $1,200 per month in debugging costs. File logging is 10 times faster than b_event_log for write operations, and our complete setup costs $2,500, typically saving over $14,000 per year in debugging time.
"Without context, logs are noise. We stopped guessing when we added context to every call." — Ivan, lead developer on a project with 5,000+ entities.
Log Levels
Use standard PSR-3 levels even if you don't use Monolog. Levels control log verbosity:
- DEBUG: every HTTP request to source, response time, body size. Enable only during debugging via a flag in admin panel.
- INFO: parser start/stop, number of processed items, created/updated records in infoblock.
- WARNING: skipped item (validation failed), slow source response (>5 sec), retry attempt.
- ERROR: exception during parsing, write error to b_iblock_element, invalid API response.
In production, keep at INFO. Toggle to DEBUG via b_option or file /local/parser_debug.flag — no restart or deploy required. This flexibility lets you safely diagnose issues on a live project.
Where to Write Logs: File, b_event_log, or Custom Table?
The choice of storage depends on parsing intensity and analytics needs. File logging is the simplest: write to /local/logs/parser/YYYY-MM-DD.log using error_log with FILE_APPEND. Each line has format [2024-03-15 14:23:01] INFO | source=competitor_a | action=update | iblock_id=12 | element_id=45678 | duration=0.34s. Pipe separator | is grep/awk-friendly. However, without rotation, DEBUG logs can fill gigabytes in a week; implement logrotate or a custom 30-day cleanup agent.
b_event_log is Bitrix's standard journal, viewable via admin panel. But it's not designed for thousands of writes per minute — under high load, INSERTs become a bottleneck, slowing down parsing. File logging is 10 times faster for writes. Therefore, we recommend b_event_log only for WARNING and ERROR entries, while DEBUG and INFO go to file.
For enterprise environments, consider forwarding logs to a centralized syslog server for aggregation and long-term retention. For projects where the parser is a critical subsystem and you need analytical queries (e.g., count errors per source per hour), a custom table parser_log with id, created_at, level, source, action, element_id, message, context (JSON) is optimal. Index on (created_at, level, source) ensures fast aggregation queries. In 90% of our client projects, this approach reduces debugging time by 80%.
| Storage |
Write Speed (per entry) |
Disk Impact |
Query Capability |
| File |
2 ms |
2 MB/1k |
grep/awk |
| b_event_log |
20 ms |
Bitrix DB |
Admin interface |
| Custom table |
5 ms |
3 MB/1k |
SQL queries |
What's More Important: Level or Context?
The string "Parsing error" is useless. The useful string: "XPath //div[@class="price"]/span returned 0 nodes, expected 1, URL: https://source.com/product/123, HTTP 200, body size: 45KB". Context allows reproducing the problem without re-running. Minimum context per level:
| Level |
Required Context |
| DEBUG |
URL, HTTP code, response time, body size, User-Agent |
| INFO |
Source, action, infoblock element ID, result (created/updated/skipped) |
| WARNING |
Source, URL, skip reason, field value, expected format |
| ERROR |
All above plus stack trace, memory_get_peak_usage(), $arFields content |
How to Set Up Structured Audit Trails with a ParserLogger Class?
Create class ParserLogger in /local/php_interface/classes/ (or in your module's namespace). Interface:
ParserLogger::info('import', [
'source' => 'competitor_a',
'element_id' => 45678,
'action' => 'update',
'fields_changed' => ['PRICE', 'QUANTITY'],
]);
Internally, write to file + to b_event_log for WARNING and above. Level toggle via COption::GetOptionString('parser', 'log_level', 'INFO'). This gives a single configuration point.
Step-by-step implementation guide
- Create file
/local/php_interface/classes/ParserLogger.php with namespace Bitrix\Parser.
- Implement methods debug(), info(), warning(), error() with signature
function (string $action, array $context = []).
- In each method, format log string and write to file via
error_log with FILE_APPEND flag.
- For WARNING and ERROR, additionally call
CEventLog::Add().
- Add method
setLevel($level) reading from COption.
- Register autoload in
init.php.
How to Automatically Monitor Errors?
Logs alone won't help if nobody reads them. Add an agent running every 15 minutes that counts ERROR entries over a period. If threshold exceeded, send notification (email event or Telegram). This turns logging from passive to active monitoring. In practice, we've seen this agent prevent e-commerce downtime: error from changed HTML structure on source site was detected in 3 minutes, not 3 hours.
What's Included in Our Turnkey Logging Setup
We offer comprehensive audit trail configuration for your project — backed by our certified Bitrix developers with 10+ years of experience and 50+ successful autofill projects:
-
ParserLogger class with DEBUG/INFO/WARNING/ERROR levels and automatic write to file and b_event_log.
- File logs with rotation in
/local/logs/parser/ (30-day retention, guaranteed no disk fill).
- Level toggle via admin panel without deploy.
- Error monitoring agent with notifications (email or Telegram).
- Full documentation and team training.
After setup, you'll debug any parser error in minutes. Contact us for a free assessment of your project. Our complete setup costs $2,500 and typically saves over $14,000 per year in debugging time. Order turnkey logging setup and save hours — and money — on debugging.
Parser Development for 1C-Bitrix: Where to Start?
XMLReader, not SimpleXML — the choice of tool determines the project's fate. SimpleXML loads the entire XML into memory, and with an 800 MB supplier file, PHP will crash with a fatal error on a 512 MB limit. XMLReader processes streamingly, node by node, consuming 20–30 MB — 30 times more efficient. This detail starts any parser development for Bitrix. With over 10 years of Bitrix development and 50+ parser projects delivered, we know the pitfalls. Contact us to start your parser development today.
What Problems Does Parsing Solve?
- Primary catalog filling — 15,000 cards with descriptions, characteristics, photos. Manually, that's three months of content manager work; a parser takes a week with debugging.
- Competitor price monitoring — collecting data from Ozon, Wildberries, competitor sites. A competitor drops the price on a hot item — you find out in two hours, not two weeks.
- Supplier aggregation — five price lists in different formats (CSV with CP1251, XML in CommerceML, Excel with merged cells) become a single catalog with a unified property system.
- Card enrichment — pulling characteristics, instructions, 3D models from manufacturer sites. Without this, a product card is an SEO empty shell.
- Assortment update — products missing from the supplier feed are deactivated via
CIBlockElement::Update($ID, ['ACTIVE' => 'N']). New ones are created. The catalog stays synchronized.
What Tools Do We Use in Parser Development?
Static websites — PHP (Goutte, Symfony DomCrawler) or Python (Scrapy, lxml). Speed: 50–100 pages/sec. Sufficient for catalogs without JS rendering.
SPA and dynamic websites — Puppeteer or Playwright. Infinite scroll, AJAX filters, lazy-load images — headless browser handles it all. Speed drops to 1–10 pages/sec, but there is no alternative: data exists only after JavaScript execution.
Supplier files:
- Excel (XLS, XLSX) — PhpSpreadsheet. Beware of merged cells and formulas — they break automatic mapping.
- CSV —
fgetcsv() with correct encoding. Suppliers love CP1251, BOM in UTF-8, and semicolons instead of commas. All need detection and handling.
- XML/YML — XMLReader for large files, SimpleXML for feeds up to 50 MB.
- CommerceML — standard exchange format with 1C. We parse
import.xml and offers.xml, map to information block structure.
API — Supplier REST endpoints, marketplace APIs (Ozon Seller API, Wildberries API). We work within rate limits, handle pagination.
How Is the Auto-Population Pipeline Structured?
Four stages. Each can break in its own way.
-
Collection. Parser crawls sources via cron schedule. Raw data goes to an intermediate table — not directly into b_iblock_element. Log everything: pages visited, elements parsed, where we got 403 or timeout. Without logs, debugging a parser is like fortune-telling.
-
Normalization. Main work here:
- Clean HTML tags, extra spaces, Unicode garbage
- Units: "mm" → "mm", "millimeters" → "mm", "миллиметр" → "mm"
- Map supplier categories to Bitrix information block sections. One supplier has "Notebooks", another "Notebooks and tablets", third "Laptops" — all into one section
- Deduplication by SKU, EAN/GTIN. One product from three suppliers should not appear three times
-
Load into Bitrix. Via CIBlockElement::Add() for new elements, CIBlockElement::Update() for existing. Images: download, resize via CFile::ResizeImageGet(), convert to WebP. Properties via CIBlockElement::SetPropertyValuesEx(). SEO meta via \Bitrix\Iblock\InheritedProperty\ElementValues. SEF URLs generated from name transliteration.
-
Update. Key point — not overwrite manual edits by content manager. Update only price, stock, activity. Description and photos manually edited are flagged with UF_MANUAL_EDIT property and skipped during import. Products missing from feed are deactivated, not deleted.
Why Is Competitor Price Monitoring Necessary?
A separate subsystem with its own specifics:
| Parameter |
How It Works |
| Frequency |
From once a day to every 2 hours — depends on market volatility |
| Matching |
By SKU, EAN, fuzzy name comparison via Levenshtein distance |
| Storage |
Separate vendor_price_monitor table with history, not information blocks |
| Alerts |
Telegram/email when competitor price deviation exceeds X% |
| Auto-rules |
"Keep price 3% below competitor minimum, but not below cost + 15%" |
Result — dashboard: your product vs competitors, price history, trends. The manager sees where to raise price without losing position, and where to react.
CSV/XML Import Module: Customization for Your Format
For supplier files — custom module with admin panel:
- Configurable mapping: "column B in file → BRAND property of information block"
- Auto-detect encoding (CP1251, UTF-8, UTF-16) via
mb_detect_encoding() with validation
- Download images from URL with queue — to avoid channel saturation
- Incremental update by row hash: row changed — update, no — skip
- Cron schedule, report: created 145, updated 892, errors 3 (with details)
Large files: CSV processed in batches of 1000 rows via fgetcsv() (10 times faster than row-by-row), XML streamed via XMLReader, background execution via Bitrix agent queue — no PHP timeouts.
Legal Aspects to Consider
-
robots.txt — respect it. Crawl-delay — comply.
- Request frequency — 1–2 per second, no more. Don't DDoS someone else's site.
- Manufacturer content — use it. Unique author texts — don't copy.
- Personal data — don't collect.
What Is Included in a Turnkey Parser Development?
| Component |
Description |
| Prototype |
Parser for 1–2 sources in 2–3 days to assess data quality |
| Main parser |
Full data collection from one source (static/dynamic) |
| Bitrix import module |
Normalization, loading, update, mapping admin panel |
| Price monitoring |
If needed — collection and alert system (up to 10 competitors) |
| Documentation |
Architecture description, selector update instructions |
| Support |
3-month guarantee for uninterrupted operation, fix for donor layout changes |
How We Work and Deadlines
- Prototype — parser for 1–2 sources in 2–3 days. Assess data quality, pitfalls (Cloudflare protection, captcha, dynamic loading).
- Development — full pipeline: parser → normalization → import into Bitrix → admin panel for management.
- Testing — run on full catalog volume, check edge cases (empty fields, malformed HTML, broken images).
- Launch — configure cron, error monitoring via Telegram bot.
- Support — competitor changed layout? Update CSS selectors in parser.
| Task |
Deadlines |
| Single site parser (static HTML) |
3–5 days |
| SPA site parser (Puppeteer/Playwright, bypass protection) |
1–2 weeks |
| CSV/XML import module for Bitrix |
1–2 weeks |
| Price monitoring system (5–10 competitors) |
2–4 weeks |
| Comprehensive auto-population system |
4–8 weeks |
| Parser support and adaptation |
by subscription |
Get in touch for a free consultation — we will analyze your data sources and propose the optimal parser architecture. Request a project assessment today and get a fixed deadline. We guarantee stable parser operation and full support throughout the usage period.