{"id":18069216,"url":"https://github.com/dliocode/horse-datalogger","last_synced_at":"2026-02-02T02:03:46.434Z","repository":{"id":116477123,"uuid":"581492473","full_name":"dliocode/horse-datalogger","owner":"dliocode","description":"Horse-DataLogger: Middleware projetado para registrar todas às requisições e solicitações HTTP para Horse","archived":false,"fork":false,"pushed_at":"2023-09-20T19:26:22.000Z","size":68,"stargazers_count":19,"open_issues_count":1,"forks_count":6,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-06-25T12:51:45.407Z","etag":null,"topics":["api","datalogger","delphi","horse","http","log","logger","middleware","rest","server"],"latest_commit_sha":null,"homepage":"","language":"Pascal","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dliocode.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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,"zenodo":null}},"created_at":"2022-12-23T10:50:55.000Z","updated_at":"2024-08-23T23:53:27.000Z","dependencies_parsed_at":null,"dependency_job_id":"19393344-3fa2-4fb6-b43c-84197f11836b","html_url":"https://github.com/dliocode/horse-datalogger","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/dliocode/horse-datalogger","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dliocode%2Fhorse-datalogger","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dliocode%2Fhorse-datalogger/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dliocode%2Fhorse-datalogger/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dliocode%2Fhorse-datalogger/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dliocode","download_url":"https://codeload.github.com/dliocode/horse-datalogger/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dliocode%2Fhorse-datalogger/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29001519,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-02T01:32:03.847Z","status":"online","status_checked_at":"2026-02-02T02:00:07.448Z","response_time":58,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["api","datalogger","delphi","horse","http","log","logger","middleware","rest","server"],"created_at":"2024-10-31T08:09:36.979Z","updated_at":"2026-02-02T02:03:46.429Z","avatar_url":"https://github.com/dliocode.png","language":"Pascal","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Horse-DataLogger\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/github/v/release/dliocode/horse-datalogger?style=flat-square\"\u003e\n  \u003cimg src=\"https://img.shields.io/github/stars/dliocode/horse-datalogger?style=flat-square\"\u003e\n  \u003cimg src=\"https://img.shields.io/github/forks/dliocode/horse-datalogger?style=flat-square\"\u003e\n  \u003cimg src=\"https://img.shields.io/github/contributors/dliocode/horse-datalogger?color=orange\u0026style=flat-square\"\u003e\n  \u003cimg src=\"https://tokei.rs/b1/github/dliocode/horse-datalogger?color=red\u0026category=lines\"\u003e\n  \u003cimg src=\"https://tokei.rs/b1/github/dliocode/horse-datalogger?color=green\u0026category=code\"\u003e\n  \u003cimg src=\"https://tokei.rs/b1/github/dliocode/horse-datalogger?color=yellow\u0026category=files\"\u003e\n\u003c/p\u003e\n\n#\n\nMiddleware projetado para registrar todas às requisições e solicitações HTTP no [Horse](https://github.com/hashload/horse).\n\nSupport: developer.dlio@gmail.com\n\n## ⚙️ Instalação\n\n### Para instalar em seu projeto usando [boss](https://github.com/HashLoad/boss):\n\n```sh\n$ boss install github.com/dliocode/horse-datalogger\n```\n\n### Instalação Manual\n\nAdicione as seguintes pastas ao seu projeto, em _Project \u003e Options \u003e Delphi Compiler \u003e Search path_\n\n```\n../src\n```\n\n### Dependências\n\n[DataLogger](https://github.com/dliocode/datalogger) - Essa é ferramenta utilizado para registrar todas solicitações HTTP do Horse.\n\nPara mais informações de como utilizar essa ferramenta em outras situações, [clique aqui](https://github.com/dliocode/datalogger#providers).\n\n[ClientIP](https://github.com/dliocode/horse-utils-clientip) - Utilizado para capturar o IP.\n\n## Observações\n\nPara usar este Middleware é necessário entender algumas coisas.\n\n_Providers_: Serve essencialmente para armazenar seus logs.\n\n_Providers_ diponíveis: [Clique aqui](https://github.com/dliocode/datalogger#providers)\n\nEm qual posição é recomendado utilizar este _provider_ no [Horse](https://github.com/hashload/horse): Recomendamos que seja adicionado na primeira posição, para que seja registrado todas as informações passadas por ele.\n\n## Como Usar\n\nPara utilizar é necessário adicionar a Uses `Horse.DataLogger` e depois adicionar os _Providers_ escolhidos para fazer o registro dos logs;\n\nAgora que você já entendeu um pouco de como funciona, vamos aos exemplos;\n\n### Simples\n\n```delphi\nuses\n  Horse, Horse.Constants,\n  Horse.DataLogger,\n  DataLogger.Provider.Console, // Provider para Console\n  System.SysUtils;\n\nbegin\n  THorse\n  .Use(THorseDataLogger.Logger([TProviderConsole.Create])) // Adiconando Middleware e o Provider\n\n  .Get('/ping',\n    procedure(Req: THorseRequest; Res: THorseResponse; Next: TProc)\n    begin\n      Res.Send('pong');\n    end);\n\n  THorse.KeepConnectionAlive := True;\n  THorse.Listen(8080,\n    procedure(AHorse: THorse)\n    begin\n      Writeln(' ' + Format(START_RUNNING, [THorse.Host, THorse.Port]));\n      Writeln;\n    end);\nend.\n```\n\n## Formatos Predefinidos\n\n```\n  Combined, Common, Dev, Short, Tiny\n```\n\nCada formato possui uma estrutura diferente e preestabelecida.\n\n### Combined\n\nSaída de log combinada Apache padrão.\n\n```\n${request_remote_clientip} [${time}] \"${request_method} ${request_raw_path_info}${request_query} '${request_protocol_version}\" ${response_status_code} ${response_content_length} \"${request_referer}\" \"${request_user_agent}\"\n```\n\n### Common\n\nSaída de log comum Apache padrão.\n\n```\n${request_remote_clientip} [${time}] \"${request_method} ${request_raw_path_info}${request_query} '${request_protocol_version}\" ${response_status_code} ${response_content_length}\n```\n\n### Dev\n\nSaída de log simples\n\n```\n${request_method} ${request_raw_path_info}${request_query} ${response_status_code} ${execution_time} ms - ${response_content_length}\n```\n\n### Short\n\nMais curto que o padrão, incluindo também o tempo de resposta.\n\n```\n${request_remote_clientip} ${request_method} ${request_raw_path_info}${request_query} ${request_protocol_version} ${response_status_code} ${response_content_length} ${execution_time} ms\n```\n\n### Tiny\n\nSaída mínima de log\n\n```\n${request_method} ${request_raw_path_info}${request_query} ${response_status_code} ${response_content_length} - ${execution_time} ms\n```\n\n## Exemplo de uso\n\n```delphi\nuses\n  Horse, Horse.Constants,\n  Horse.DataLogger,\n  DataLogger.Provider.Console, // Provider para Console\n  System.SysUtils;\n\nbegin\n  THorse\n  .Use(\n    THorseDataLogger.Logger(\n      THorseDataLoggerFormat.tfCombined, // Formato dos logs\n      [TProviderConsole.Create]          // Adicionado o Middleware\n    )\n  )\n\n  .Get('/ping',\n    procedure(Req: THorseRequest; Res: THorseResponse; Next: TProc)\n    begin\n      Res.Send('pong');\n    end);\n\n   // output: 0:0:0:0:0:0:0:1 [2022-12-22 17:18:31:791] \"GET /ping HTTP/1.1\" 200 4 \"-\" \"PostmanRuntime/7.30.0\"\n\n  THorse.KeepConnectionAlive := True;\n  THorse.Listen(8080,\n    procedure(AHorse: THorse)\n    begin\n      Writeln(' ' + Format(START_RUNNING, [THorse.Host, THorse.Port]));\n      Writeln;\n    end);\nend.\n```\n\n## Formatos customizados\n\nVocê pode definir seus próprios formatos de utilização\n\n```delphi\nuses\n  Horse, Horse.Constants,\n  Horse.DataLogger,\n  DataLogger.Provider.Console, // Provider para Console\n  System.SysUtils;\n\nbegin\n  THorse\n  .Use(\n    THorseDataLogger.Logger(\n      // Formato dos logs\n      '${request_method} ${request_raw_path_info}${request_query} ${response_status_code} ${response_content_length} - ${execution_time} ms',\n\n      // Adicionado o Middleware\n      [TProviderConsole.Create]\n    )\n  )\n\n  .Get('/ping',\n    procedure(Req: THorseRequest; Res: THorseResponse; Next: TProc)\n    begin\n      Res.Send('pong');\n    end);\n\n   // output: 0:0:0:0:0:0:0:1 [2022-12-22 17:18:31:791] \"GET /ping HTTP/1.1\" 200 4 \"-\" \"PostmanRuntime/7.30.0\"\n\n  THorse.KeepConnectionAlive := True;\n  THorse.Listen(8080,\n    procedure(AHorse: THorse)\n    begin\n      Writeln(' ' + Format(START_RUNNING, [THorse.Host, THorse.Port]));\n      Writeln;\n    end);\nend.\n```\n\n## Formatos disponíveis\n\n```\n${time}\n${execution_time} // Time in ms\n${request_accept}\n${request_authorization}\n${request_cache_control}\n${request_connection}\n${request_content}\n${request_content_encoding}\n${request_content_length}\n${request_content_type}\n${request_content_version}\n${request_cookie}\n${request_cookie_fields}\n${request_derived_from}\n${request_from}\n${request_host}\n${request_internal_path_info}\n${request_internal_script_name}\n${request_method}\n${request_path_info}\n${request_path_translated}\n${request_protocol_version}\n${request_query}\n${request_query_fields}\n${request_raw_path_info}\n${request_referer}\n${request_remote_addr}\n${request_remote_clientip}\n${request_remote_host}\n${request_remote_ip}\n${request_script_name}\n${request_server_port}\n${request_title}\n${request_url}\n${request_user_agent}\n${response_allow}\n${response_content}\n${response_content_encoding}\n${response_content_length}\n${response_content_type}\n${response_content_version}\n${response_custom_headers}\n${response_date}\n${response_derived_from}\n${response_expires}\n${response_last_modified}\n${response_location}\n${response_log_message}\n${response_realm}\n${response_reason}\n${response_server}\n${response_status_code}\n${response_title}\n${response_version}\n${response_wwwauthenticate}\n```\n\n## Adicionando outros _Providers_\n\nVocê pode adicionar vários _Providers_ para registrar cada solicitação em locais diferentes.\n\nPara este exemplo, vamos mostrar as requisições em Console e vamos salvar no formato Texto, tudo isso utilizando duas _Units_ para registrar\n\n```\nDataLogger.Provider.Console, DataLogger.Provider.TextFile\n```\n\n### Múltiplos _Providers_\n\n```delphi\nuses\n  Horse, Horse.Constants,\n  Horse.DataLogger,\n  DataLogger.Provider.Console, // Provider para Console\n  DataLogger.Provider.TextFile, // Provider para TextFile\n  System.IOUtils, System.SysUtils;\n\nbegin\n  THorse\n  .Use(\n    THorseDataLogger.Logger(\n      THorseDataLoggerFormat.tfCombined, // Formato dos logs\n        TProviderConsole.Create,\n\n        TProviderTextFile.Create\n          .LogDir(TPath.GetDirectoryName(ParamStr(0)) + '\\log\\request')\n          .PrefixFileName('request_')\n          .Extension('.txt')\n      ]\n    )\n  )\n\n  .Get('/ping',\n    procedure(Req: THorseRequest; Res: THorseResponse; Next: TProc)\n    begin\n      Res.Send('pong');\n    end);\n\n   // output: 0:0:0:0:0:0:0:1 [2022-12-22 17:18:31:791] \"GET /ping HTTP/1.1\" 200 4 \"-\" \"PostmanRuntime/7.30.0\"\n\n  THorse.KeepConnectionAlive := True;\n  THorse.Listen(8080,\n    procedure(AHorse: THorse)\n    begin\n      Writeln(' ' + Format(START_RUNNING, [THorse.Host, THorse.Port]));\n      Writeln;\n    end);\nend.\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdliocode%2Fhorse-datalogger","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdliocode%2Fhorse-datalogger","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdliocode%2Fhorse-datalogger/lists"}