{"id":20820883,"url":"https://github.com/webdad/amelie","last_synced_at":"2026-02-19T14:04:35.165Z","repository":{"id":152505256,"uuid":"105878691","full_name":"WebDaD/amelie","owner":"WebDaD","description":"(A)melie - (m)ore (e)asy (l)ogging (i)n (e)verything","archived":false,"fork":false,"pushed_at":"2017-12-20T13:45:57.000Z","size":133,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-11T09:09:25.545Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"unlicense","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/WebDaD.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-10-05T10:50:09.000Z","updated_at":"2017-11-17T07:44:58.000Z","dependencies_parsed_at":"2024-06-08T05:15:07.223Z","dependency_job_id":null,"html_url":"https://github.com/WebDaD/amelie","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/WebDaD/amelie","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WebDaD%2Famelie","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WebDaD%2Famelie/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WebDaD%2Famelie/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WebDaD%2Famelie/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/WebDaD","download_url":"https://codeload.github.com/WebDaD/amelie/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/WebDaD%2Famelie/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29616958,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-19T13:04:20.082Z","status":"ssl_error","status_checked_at":"2026-02-19T13:03:33.775Z","response_time":117,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-17T22:10:36.298Z","updated_at":"2026-02-19T14:04:30.158Z","avatar_url":"https://github.com/WebDaD.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cimg src=\"https://raw.githubusercontent.com/WebDaD/amelie/master/amelie_logo.png\" width=\"64\" height=\"64\"/\u003e (A)melie - (m)ore (e)asy (l)ogging (i)n (e)verything\r\n================================\r\n\r\nThis Repository holds all concepts behind amelie and links to the reference solutions.\r\n\r\nTODO:\r\n- schemes neu machen\r\n- xsd neu machen\r\n- Add a raml for the server api\r\n- Add some puml graphics\r\n  - CLI input parsing\r\n  - example arch\r\n- Add json schemes\r\n- Add XML xsd\r\n- Add database-table-create files\r\n  - mssql\r\n- Security:\r\n  - ip accetp list (single, range, wildcard)\r\n  - mac allow list (client may send it, if configured)\r\n  - certitifactes\r\n  - https://jwt.io/ https://www.npmjs.com/package/jsonwebtoken\r\n  - private public key\r\n- Config-File for Clients / Server:\r\n  - Keys, Examples, Defaults\r\n  - What File is not important (json for node.js, app.config for c#...)\r\n  - examoples: json, xml, ini\r\n- integrate examples, etc into README\r\n- website under /docs\r\n\r\n\r\n\r\n- [Concepts](#concepts)\r\n  - [A Log Entry](#a-log-entry)\r\n    - [ID](#id)\r\n    - [Source](#source)\r\n    - [Level](#level)\r\n    - [Message(140 chars)](#message140-chars)\r\n    - [message_long](#message_long)\r\n    - [TimeStamp](#timestamp)\r\n- [Architecture](#architecture)\r\n  - [Clients](#clients)\r\n  - [Libraries](#libraries)\r\n  - [Servers](#servers)\r\n    - [Export Formats](#export-formats)\r\n    - [Paths](#paths)\r\n  - [Registries](#registries)\r\n    - [Server](#server)\r\n    - [Clients](#clients-1)\r\n  - [Pipes](#pipes)\r\n  - [Monitors](#monitors)\r\n  - [Stats](#stats)\r\n- [Links](#links)\r\n  - [Servers](#servers-1)\r\n  - [Clients](#clients-2)\r\n  - [Libraries](#libraries-1)\r\n  - [Registry-Server](#registry-server)\r\n  - [Registry-Client](#registry-client)\r\n  - [Pipes](#pipes-1)\r\n  - [Stats](#stats-1)\r\n- [Design](#design)\r\n\r\n# Concepts\r\nHere are the concepts used by amelie\r\n\r\n## A Log Entry\r\nConsists of\r\n* ID\r\n* Source\r\n* Level\r\n* Message(140 chars)\r\n* message_long\r\n* TimeStamp\r\n\r\n### ID\r\nThis is a unique ID. It is generated by the server using an uuid-generator compliant to [RFC 4122](https://tools.ietf.org/rfc/rfc4122.txt)\r\n\r\n## Source\r\nThe Source that has sent the log entry\r\n\r\n### Level\r\nA Log-Level. May be any string you like.\r\nWe recommend:\r\n* info\r\n* warn\r\n* error\r\n\r\n### Message(140 chars)\r\nA short version of the log message. You can send it to the server or leave the work of trimming the long message to the server.\r\n\r\n### message_long\r\nThe Log Message in its full beauty. May Contain tags (#tag), other sources (@source) and links (http:// / https:// ...)\r\n\r\n### TimeStamp\r\nA [RFC 3339](https://tools.ietf.org/rfc/rfc3339.txt) date-time string (with or without UTC offset)\r\n\r\n# Architecture\r\namelie consists of logging clients and servers to save logfiles.\r\nAddtional components are registries (server and client), pipes and stats-clients\r\n\r\n## Clients\r\nAll Clients must be able to:\r\n* Write a Log Entry to any server\r\n* Take any string and convert it to log-entry fields using regex and a config\r\n* Read the full Get API\r\n* CLI must take standard in or be able to use one argument, others are parameters\r\n* CLI can be able to use a file-watcher\r\n* GUIs must have all fields avaiable, may be hidden.\r\n* Have a config with the following settings to be used as defaults:\r\n\t* Default Value for Level\r\n\t* Default Value Source\r\n\t* Default Value for a Server (IP:Port)\r\n\t* Default Message Parser ((.) == message)\r\n\r\n## Libraries\r\nAre Extensions / Classes / modules / plugins for other programs to use.\r\nThey:\r\n* Write a Log Entry to any server\r\n* Take any string and convert it to log-entry fields using regex and a config\r\n* Read the full Get API\r\n* Have a config with the following settings to be used as defaults:\r\n\t* Default Value for Level\r\n\t* Default Value Source\r\n\t* Default Value for a Server (IP:Port)\r\n\t* Default Message Parser ((.) == message)\r\n\r\n## Servers\r\nAll Servers must be reachable via http and share in common:\r\n* Export Formats\r\n* HTTP-Paths\r\n\r\nAll Server must accept and serve XML and JSON on all endpoints\r\n\r\n### Export Formats\r\nYou can get your data as:\r\n* json\r\n* xml\r\n* csv\r\n* txt\r\n\r\n### Paths\r\n* POST /log (body: source, level, message (optional), message_long, timestamp (optional))\r\n* GET /log  - get all log entries\r\n* GET /log/sources  - get all sources\r\n* GET /log/levels  - get all Levels\r\n* GET /log/tags  - get all Tags\r\n* GET /log/:id  - get object with id\r\n* GET /log/source/:source  - get all entries to source\r\n* GET /log/level/:level - get all entries to level\r\n* GET /log/tag/:tag - get all entries to tag\r\n* GET /search?query (query: source, level, from, to, tag, string, ...)\r\n* GET /log/timestamp/:from/[:to]  - get from, if no to then now\r\n* GET /log/last  - get newest Entry\r\n* GET /log/last/:number  - get newest entries, where number is the number of entries to get\r\n\r\n## Registries\r\nCan save logger api endpoints and display latest. And can search in the saves apis\r\n\r\n### Server\r\nA Registry must support the following Paths\r\n* POST /server (body: api-endpoint, identifier) - Add a new endpoint\r\n* GET /server - get list of servers connected\r\n* DELETE /server - remove a server from the list\r\n* PUT /server (body: api-endpoint, identifier) - Update an existing endpoint\r\n* GET /server/:identifier/log  - get all log entries of the endpoint\r\n* GET /server/:identifier/log/sources  - get all sources of the endpoint\r\n* GET /server/:identifier/log/levels  - get all Levels of the endpoint\r\n* GET /server/:identifier/log/tags  - get all Tags of the endpoint\r\n* GET /server/:identifier/log/:id  - get object with id of the endpoint\r\n* GET /server/:identifier/log/source/:source  - get all entries to source of the endpoint\r\n* GET /server/:identifier/log/level/:level - get all entries to level of the endpoint\r\n* GET /server/:identifier/log/tag/:tag - get all entries to tag of the endpoint\r\n* GET /server/:identifier/search?query (query: source, level, from, to, tag, string, ...) of the endpoint\r\n* GET /server/:identifier/log/timestamp/:from/[:to]  - get from, if no to then now of the endpoint\r\n* GET /server/:identifier/log/last  - get newest Entry of the endpoint\r\n* GET /server/:identifier/log/last/:number  - get newest entries, where number is the number of entries to get of the endpoint\r\n\r\n### Clients\r\nAll clients must be able to consume and use the full registry-server-api.\r\n\r\n## Pipes\r\nConsist of two parts:\r\n1. Behaves like a Logger Server, but sends something (email, file, ftp) with the info\r\n2. Watches for something and behaves like a client\r\n\r\n## Monitors\r\nAllow users to see changes in logs. This can be using sockets or creating an rss-feed.\r\nMonitors are standalone and use existing API-Servers.\r\n\r\n## Stats\r\nStats-Clients are special, as there are no limitations to them.\r\nJust be sure not to overload the servers you perform stats against...\r\n\r\n# Links\r\nHere are the Links to all projects using these concepts. Entries that are not linked are planned, but not set up yet.\r\nFeel Free to File a Pull-Request with more solutions or create one of the entries!\r\n\r\nAnd please consider our naming convention:\r\n`amelie-[type]-[language]`\r\n\r\n\r\n## Servers\r\n* amelie-server-php-mysql\r\n* amelie-server-node.js-file\r\n\r\n## Clients\r\n* amelie-client-perl\r\n* amelie-client-node.js-cli\r\n* amelie-client-windows-console-application\r\n* amelie-client-windows-winforms\r\n* amelie-client-bash\r\n* amelie-client-go\r\n\r\n## Libraries\r\n* amelie-lib-server-nodejs\r\n* amelie-lib-server-php\r\n* amelie-lib-server-csharp\r\n* amelie-lib-server-go\r\n* amelie-lib-client-nodejs\r\n* amelie-lib-client-php\r\n* [amelie-lib-client-csharp](https://github.com/WebDaD/amelie-lib-client-csharp)\r\n* amelie-lib-client-go\r\n\r\n## Registry-Server\r\n* amelie-registry-server-php-mysql\r\n* amelie-registry-server-node.js-file\r\n\r\n## Registry-Client\r\n* amelie-registry-client-perl\r\n* amelie-registry-client-node.js-cli\r\n* amelie-registry-client-windows-console-application\r\n* amelie-registry-client-bash\r\n* amelie-registry-client-go\r\n\r\n## Pipes\r\n* amelie-pipe-sending-mail-php\r\n* amelie-pipe-receiving-mail-php\r\n* amelie-pipe-sending-ftp-php\r\n* amelie-pipe-receiving-ftp-php\r\n\r\n## Monitors\r\n* amelie-monitor-nodejs-socket-io\r\n* amelie-monitor-php-rssfeed\r\n\r\n## Stats\r\n* amelie-stats-perl\r\n* amelie-stats-r\r\n\r\n# Design\r\nHere are some simple Design Infos.  \r\nMain Color: #ff007f  \r\nLogo:  \r\n![Logo amelie](https://raw.githubusercontent.com/WebDaD/amelie/master/amelie_logo.png)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwebdad%2Famelie","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwebdad%2Famelie","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwebdad%2Famelie/lists"}