{"id":17188316,"url":"https://github.com/jclem/logfmt-dart","last_synced_at":"2025-03-25T04:39:57.922Z","repository":{"id":20352012,"uuid":"23626976","full_name":"jclem/logfmt-dart","owner":"jclem","description":"Dart package for working with logfmt-style log lines","archived":false,"fork":false,"pushed_at":"2014-09-04T17:14:07.000Z","size":292,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-24T10:52:52.268Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://pub.dartlang.org/packages/logfmt","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":"Unmaintained","scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jclem.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}},"created_at":"2014-09-03T15:54:34.000Z","updated_at":"2019-05-28T12:34:43.000Z","dependencies_parsed_at":"2022-08-21T17:21:14.403Z","dependency_job_id":null,"html_url":"https://github.com/jclem/logfmt-dart","commit_stats":null,"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jclem%2Flogfmt-dart","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jclem%2Flogfmt-dart/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jclem%2Flogfmt-dart/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jclem%2Flogfmt-dart/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jclem","download_url":"https://codeload.github.com/jclem/logfmt-dart/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245401374,"owners_count":20609163,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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-10-15T01:08:40.542Z","updated_at":"2025-03-25T04:39:57.897Z","avatar_url":"https://github.com/jclem.png","language":"Dart","funding_links":[],"categories":[],"sub_categories":[],"readme":"# logfmt-dart [![Build Status](https://travis-ci.org/jclem/logfmt-dart.svg?branch=master)](https://travis-ci.org/jclem/logfmt-dart)\n\n\"logfmt\" is the name of a key-value logging convention, where log lines are\nformatted as \"key=value\" pairs.\n\nThis package decodes individual log lines or streams of log lines. Individual\nlog lines are decoded as `Map\u003cString, dynamic\u003e` objects, and streams passing\nthrough the `streamDecoder` transform will emit `Map\u003cString, dynamic\u003e` objects, as well.\n\n## Usage\n\n### Logger\n\nA class which can log `Map\u003cString, dynamic\u003e`, and optionally include elapsed\ntime since the logger was created.\n\n```dart\nimport 'package:logfmt/logfmt.dart' as logfmt;\n\nvoid main() {\n  logfmt.Logger logger = new logfmt.Logger();\n  logger.log({ 'key': 'value' }); // Logs \"key=value\" to stdout.\n  logger.logWithElapsed({ 'key': 'value' }); // Logs \"key=value elapsed=1ms\" to stdout.\n}\n```\n\n### #decode\n\nGiven a logfmt-style log line, decode it into a `Map\u003cString, dynamic\u003e` using `#decode`:\n\n```dart\nimport 'package:logfmt/logfmt.dart' as logfmt;\nimport 'package:unittest/unittest.dart';\n\nvoid main() {\n  test('key=value pairs of non-null and non-boolean strings decode into [Map\u003cString, String\u003e].', () {\n    expect(logfmt.decode('key=value'), equals({ 'key': 'value' }));\n  });\n\n  test('\"flag\"s are decoded into [Map\u003cString, bool\u003e] where `bool` is `true`.', () {\n    expect(logfmt.decode('flag'), equals({ 'flag': true }));\n  });\n\n  test('Pairs with \"true\" or \"false\" as values are decoded into [Map\u003cString, bool\u003e], as appropriate.', () {\n    expect(logfmt.decode('key=false'), equals({ 'key': false }));\n  });\n\n  test('Pairs with \"null\" values are decoded into [Map\u003cString, Null\u003e].', () {\n    expect(logfmt.decode('key=null'), equals({ 'key': null }));\n  });\n\n  test('Quoted keys and values are preserved.', () {\n    expect(logfmt.decode('\"quoted key\"=\"quoted value\"'), equals({ 'quoted key': 'quoted value' }));\n  });\n}\n```\n\n### #encode\n\nGiven a `Map\u003cString, dynamic\u003e`, encode it into a logfmt-style string using `#encode`:\n\n```dart\nimport 'package:logfmt/logfmt.dart' as logfmt;\nimport 'package:unittest/unittest.dart';\n\nvoid main() {\n  test('encodes Map\u003cString, String\u003e into plain key=value.', () {\n    expect(logfmt.encode({ 'key': 'value' }), equals('key=value'));\n  });\n\n  test('encodes Map\u003cString, bool\u003e into key=${bool.toString}', () {\n    expect(logfmt.encode({ 'key': true }), equals('key=true'));\n  });\n\n  test('encodes Map\u003cString, Null\u003e into key=${null.toString}', () {\n    expect(logfmt.encode({ 'key': null }), equals('key=null'));\n  });\n\n  test('encodes long doubles as truncated', () {\n    expect(logfmt.encode({ 'longDouble': 0.44444444444444444444 }),\n      equals('longDouble=0.4444444444444444'));\n  });\n\n  test('encodes dates as UTC ISO 8601', () {\n    DateTime date = new DateTime.now();\n\n    expect(logfmt.encode({ 'date': date }),\n      equals('date=${date.toUtc().toIso8601String()}'));\n  });\n\n  test('encodes multi-word strings as quoted', () {\n    expect(logfmt.encode({ 'key': 'quoted value' }),\n      equals('key=\"quoted value\"'));\n  });\n\n  test('encodes quotes as escaped quotes', () {\n    expect(logfmt.encode({ 'key': '\"value' }), equals(r'key=\\\"value'));\n  });\n\n  test('encodes new lines with literal \\\\n characters', () {\n    expect(logfmt.encode({ 'key': '\\nvalue' }), equals(r'key=\\nvalue'));\n  });\n}\n```\n\n### #log\n\nLogs a `Map\u003cString, dynamic\u003e` to either standard out or a given `StringSink`.\n\n```dart\nimport 'package:logfmt/logfmt.dart' as logfmt;\n\nlogfmt.log({ 'key': 'value' }); // \"key=value\" is logged to standard out.\nlogfmt.log({ 'key': 'value' }, sink: sink); // The log is written to `sink`.\n```\n\n### streamDecoder\n\nA stream of lines can be sent to the `streamDecoder` transformer, which will return a stream emitting `Map\u003cString, dynamic\u003e` objects.\n\n```dart\nimport 'dart:convert';\nimport 'dart:io';\nimport 'package:logfmt/logfmt.dart' as logfmt;\n\nvoid main() {\n  new File('test/log.txt').openRead()\n    .transform(new Utf8Decoder())\n    .transform(new LineSplitter())\n    .transform(logfmt.streamDecoder())\n    .listen((Map\u003cString, dynamic\u003e map) {\n      print(map);\n    });\n}\n```\n\n### streamEncoder\n\nA stream of `Map\u003cString, dynamic\u003e` can be sent to the `streamEncoder`\ntransformer, which will return a stream emitting logfmt-style strings.\n\n```dart\nimport 'dart:async';\nimport 'package:logfmt/logfmt.dart' as logfmt;\n\nvoid main() {\n  new Stream.fromIterable(maps)\n    .transform(logfmt.streamEncoder())\n    .listen((String line) {\n      print(line);\n    });\n}\n```\n\n## Todo\n\n- Implement an example request logger.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjclem%2Flogfmt-dart","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjclem%2Flogfmt-dart","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjclem%2Flogfmt-dart/lists"}