Server log reportDevelopment & Customization

A Python script that reads your web server's access logs and turns them into a clear report of pages and errors

Usually ready in 15 minutesRevisions includedQuality check
Packages
Payment protectionDetails
  • Revisions within the package are free.
  • If you do not respond within 3 days of delivery, the work is accepted automatically.

The money is reserved when you pay and released only once you accept the work.

A Python script that reads your web server's access logs and turns them into a clear report of pages and errors

Example result

Example for the Standard package

Merging the monthly sales files of 9 shops into one Excel report

How it is run

python merge_sales.py --month 2026-10
2026-11-02 09:14:03 INFO  Folder: sales/2026-10, 9 files found
2026-11-02 09:14:03 INFO  shop-01.csv: 1,284 rows
2026-11-02 09:14:04 INFO  shop-02.xlsx: 967 rows
2026-11-02 09:14:04 WARN  shop-07.csv: 3 rows without a price skipped (lines 88, 412, 913)
2026-11-02 09:14:05 INFO  Done: 10,412 rows -> report-2026-10.xlsx (sheets "Sales" and "Totals")

Settings, not code

The column names of each shop live in settings.ini, so a new shop or a renamed column is a line there:

[columns]
date = Date, Sale date, Day
product = Product, Item, Name
quantity = Qty, Quantity, Pcs
price = Price, Unit price

A part of the code

def read_shop_file(path: Path, columns: dict[str, list[str]]) -> pd.DataFrame:
    """Reads one shop's file and gives it the report's column names."""
    table = pd.read_excel(path) if path.suffix == ".xlsx" else pd.read_csv(path, encoding="utf-8-sig")
    renamed = {}
    for name, variants in columns.items():
        found = next((c for c in table.columns if c.strip() in variants), None)
        if found is None:
            raise ReportError(f"{path.name}: no column for '{name}' (looked for {', '.join(variants)})")
        renamed[found] = name
    table = table.rename(columns=renamed)[list(columns)]
    table["shop"] = path.stem
    return table

Files: a ZIP archive with merge_sales.py (310 lines), settings.ini, requirements.txt and a README with installing Python, running the script and what each message in the log means. The client runs it on their own computer.

Client: a small chain of 9 stationery shops; each shop sends its sales for the month as a CSV or Excel file, with slightly different column names. Task: one script that reads every file in a folder, brings the columns to one shape, and writes a single Excel report with all sales and a sheet of totals by shop.

The client and all details are made up.

About this service

Your web server writes down every request in its access log, but a file of millions of lines tells you little until it is counted. This Python script reads Nginx or Apache access logs, including older compressed ones, and makes a report: requests by day and hour, the most visited pages, status codes, the pages that return 404 or 500 and where visitors came from. Premium counts search engine crawlers apart from people and saves an Excel workbook with a tab per section. Visitors' IP addresses stay out of the report by default, or are shortened if you need them. Send us the log format line from your server's settings and 20-30 lines with addresses changed. You run it on your server or computer; it reads logs and does not change any settings.

What is included

  • What you getA ZIP archive with the Python script, a README with step-by-step instructions and, from Standard, a settings file with log paths and report options; the code is also shown on the order page.
  • Nginx and ApacheThe common log formats, or yours if it differs
  • Errors with pagesWhich addresses give 404 or 500, and how often
  • Old logs tooFrom Standard, compressed .gz files read as they are
  • No personal dataIP addresses left out or shortened
  • Readable codeWith comments, easy to add a section later

How it works

  1. 1
    TaskYou send the log format and a few lines with addresses changed
  2. 2
    CodeWe write the script and the guide to running it
  3. 3
    Try itYou run it on a copy of one day's log and look at the report
  4. 4
    ChangesYou ask for changes within your package and send any error message

What we need from you

Your web server (Nginx or Apache), the log_format or LogFormat line from its settings if it was changed, and 20-30 lines of the access log with IP addresses replaced by made-up ones. Where the logs are kept and how they are rotated, how big a day's log is, what the report should show and in what form (CSV or Excel), and where it will run: the server itself (with its system) or your computer.

We will ask you:

  • Which web server and log format?
  • What should the report show?
  • How often do you need it?
  • Where will it run?

Compare packages

PackagesBasicOne log, one report$16StandardReport with settings$33PremiumLog report tool$67
Deadline1 day2 days3 days
Revisions123
Codeup to 150 linesup to 400 linesup to 1,000 lines
Files of code1up to 3up to 8
Settings fileNoYesYes
Clear error messages and a logNoYesYes
Run options and a guide to running it on a scheduleNoNoYes
Guide to installing and running it (README)YesYesYes
LanguagePythonPythonPython
Order BasicOrder StandardOrder Premium

Payment protection

You pay when you order, but the money is released only for accepted work.

  • Fixed priceThe package price does not change after you pay.
  • The money is reservedWhen you pay, the amount is only reserved. It is released to the service once you accept the work.
  • Checked before deliveryEvery result goes through a quality check before it reaches you, and you see it on the order page before accepting it.
  • Free revisionsAsk for changes within your brief as many times as the package allows.
  • Acceptance after 3 daysIf within 3 days of delivery you neither accept the work nor ask for changes, it is accepted automatically. If you write in the order chat after delivery, the order waits; once we answer, we may start the 3 days again and will say so in the chat.
  • Redo or a full refundIf the result does not match your brief and the revisions did not fix it, or the work takes more than twice its deadline, write in the order chat: we will redo the work or refund the payment in full.
How it works →

Questions and answers

Is this the same as web analytics?

No. It counts what the server saw: every request, including those from crawlers and scripts, with no cookies or tracking code. Numbers will differ from your analytics service, and each view is useful in its own way.

What about visitors' IP addresses?

They count as personal data in many countries, so by default the report leaves them out. If you need them, for example to see one address flooding the site, they can be shortened.

Can it block bad visitors?

No. It only reads logs and makes a report; it does not change your server's settings or firewall.

Will you read my logs?

No. You run the script on your side. We only need the format line and a few lines with addresses changed.

Did not find your answer?

Packages