Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Traefik Logs Parser Fails on Non-JSON Logs #1204

Open
qymab opened this issue Dec 27, 2024 · 1 comment
Open

Traefik Logs Parser Fails on Non-JSON Logs #1204

qymab opened this issue Dec 27, 2024 · 1 comment

Comments

@qymab
Copy link

qymab commented Dec 27, 2024

The crowdsecurity/traefik-logs parser fails when encountering non-JSON log lines, such as those generated by GeoBlock. These logs are plain text and not in JSON format, causing the UnmarshalJSON function to throw an error. This results in the following error message:

level=warning msg="failed to run filter : invalid character 'I' looking for beginning of value (1:1)
| UnmarshalJSON(evt.Parsed.message, evt.Unmarshaled, \"traefik\") in [\"\", nil]
| ^" id=blue-grass name=child-crowdsecurity/traefik-logs stage=s01-parse

This happens because the parser attempts to process all log lines, including non-JSON lines, which are incompatible with the UnmarshalJSON function.


Steps to Reproduce:

  1. Configure Traefik to log both access logs and GeoBlock logs in the same file.
  2. Enable the crowdsecurity/traefik-logs parser in CrowdSec.
  3. Feed the combined log file to CrowdSec.
  4. Observe the parser failing on non-JSON log lines (e.g., INFO: GeoBlock).

Expected Behavior:

The crowdsecurity/traefik-logs parser should:

  • Ignore non-JSON log lines (e.g., GeoBlock logs) by default.
  • Process only valid JSON log lines from Traefik.

Actual Behavior:

The parser fails when encountering non-JSON log lines, causing errors like:

invalid character 'I' looking for beginning of value

Environment:

  • CrowdSec Version: v1.6.4
  • GeoBlock Version: v0.2.8
  • Traefik Version: v3
  • Operating System: Docker/Debian

Additional Context:

GeoBlock logs are plain text logs generated by Traefik, such as:

INFO: GeoBlock: 2024/12/26 11:36:01 allow local IPs: true
INFO: GeoBlock: 2024/12/26 11:36:01 log local requests: false

These logs are not in JSON format and should not be processed by the crowdsecurity/traefik-logs parser. Including a filter to exclude non-JSON lines would resolve this issue and prevent unnecessary errors.


@LaurenceJJones
Copy link
Contributor

LaurenceJJones commented Dec 27, 2024

Hey 👋🏻

Thank you opening an issue.

So there an issue with trying to guess if the log line is a not a JSON log line, since traefik supports logging "plain text" known as "CLF" also so what we could do is test if evt.Parsed.message[0] == '{' which would test if the first byte is an opening bracket but we may fall into the trap of whitespace.

However, an easier solution I seen is making sure general traefik log messages and access logs go to different files (which you configure crowdsec to only monitor the access logs) or if both go to stdout then divert general traefik messages to a file instead.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants