{"id":30180556,"url":"https://github.com/klauscfhq/signale","last_synced_at":"2025-08-12T08:01:52.042Z","repository":{"id":42352435,"uuid":"128658421","full_name":"klaudiosinani/signale","owner":"klaudiosinani","description":"Highly configurable logging utility","archived":false,"fork":false,"pushed_at":"2024-08-30T10:10:07.000Z","size":851,"stargazers_count":8983,"open_issues_count":39,"forks_count":231,"subscribers_count":72,"default_branch":"master","last_synced_at":"2025-08-05T06:19:30.673Z","etag":null,"topics":["cli","console","hackable","log","logger","nodejs"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","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/klaudiosinani.png","metadata":{"files":{"readme":"docs/readme.DE.md","changelog":null,"contributing":"contributing.md","funding":null,"license":"license.md","code_of_conduct":"code-of-conduct.md","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},"funding":{"github":"klaudiosinani","buy_me_a_coffee":"klaudiosinani","custom":"https://klaudiosinani.com/thanks"}},"created_at":"2018-04-08T16:04:09.000Z","updated_at":"2025-08-04T22:08:28.000Z","dependencies_parsed_at":"2024-06-18T10:53:44.441Z","dependency_job_id":"e1d07fa6-bc98-439c-965e-323e51cbcb65","html_url":"https://github.com/klaudiosinani/signale","commit_stats":{"total_commits":171,"total_committers":15,"mean_commits":11.4,"dds":"0.42690058479532167","last_synced_commit":"830cdd56b2699d0dcdcbc96264fdaa1a80e82678"},"previous_names":["klaussinani/signale","klauscfhq/signale"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/klaudiosinani/signale","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/klaudiosinani%2Fsignale","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/klaudiosinani%2Fsignale/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/klaudiosinani%2Fsignale/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/klaudiosinani%2Fsignale/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/klaudiosinani","download_url":"https://codeload.github.com/klaudiosinani/signale/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/klaudiosinani%2Fsignale/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270024697,"owners_count":24514054,"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","status":"online","status_checked_at":"2025-08-12T02:00:09.011Z","response_time":80,"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":["cli","console","hackable","log","logger","nodejs"],"created_at":"2025-08-12T08:01:14.543Z","updated_at":"2025-08-12T08:01:52.026Z","avatar_url":"https://github.com/klaudiosinani.png","language":"JavaScript","funding_links":["https://github.com/sponsors/klaudiosinani","https://buymeacoffee.com/klaudiosinani","https://klaudiosinani.com/thanks","https://opencollective.com/klaussinani"],"categories":["Repository","Packages","包","Programming Languages",":package: NodeJS","Logging","目录","awesome","Node"],"sub_categories":["Logging","日志","JavaScript","Styling","命令行"],"readme":"\u003ch1 align=\"center\"\u003e\n  Signale\n\u003c/h1\u003e\n\n\u003ch4 align=\"center\"\u003e\n  Hochgradig konfigurierbares Loggingprogramm\n\u003c/h4\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg alt=\"Header\" src=\"../media/header.png\" width=\"88%\"\u003e\n\u003c/div\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://travis-ci.com/klaussinani/signale\"\u003e\n    \u003cimg alt=\"Build Status\" src=\"https://travis-ci.com/klaussinani/signale.svg?branch=master\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://www.npmjs.com/package/signale\"\u003e\n    \u003cimg alt=\"NPM Downloads\" src=\"https://img.shields.io/npm/dt/signale.svg\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n## Beschreibung\n\nSignale ist bis ins letzte hack- und konfigurierbar. Es kann für Logging und Statusreports als auch für das Handling des Output Rendering Process von anderen Node Modulen und Anwendungen verwendet werden.\n\nDiese Dokument in [简体中文](https://github.com/klaussinani/signale/blob/master/docs/readme.zh_CN.md) lesen.\n\nDu kannst die Entwicklung dieses Projekts unterstützen und an [Open Collective](https://opencollective.com/klaussinani) spenden.\n\nLies die [contributing guidelines](https://github.com/klaussinani/signale/blob/master/contributing.md#translating-documentation) um zu lernen, wie du dieses Dokument in mehr Sprachen übersetzen kannst.\n\nBesuch doch [Gitter](https://gitter.im/klaussinani/signale) or [Twitter](https://twitter.com/klaussinani) um deine Anmerkungen zu diesem Projekt zu teilen.\n\n## Höhepunkte\n\n- 19 out-of-the-box loggers\n- durch und durch hackbar\n- sauberer, schöner Output\n- intergrierte Timer\n- benutzerdefinierte Logger\n- TypeScript Unterstützung\n- Interaktive und reguläre Modi\n- Geheimnisse \u0026 sensitives Filtern von Informationen\n- Unterstützung von Filename, Datum und timestamp \n- gezielte Logger und Timer\n- skaliert Loglevel\n- Unterstützugn von String interpolation\n- mehrere konfigurierbare beschreibbare Streams\n- einfache, minimalistische Syntax\n- Global konfigurierbar durch `package.json`\n- Konfiguration kann per File und Logger überschrieben werden\n\n## Inhalt\n\n- [Beschreibung](#beschreibung)\n- [Höhepunkte](#höhepunkte)\n- [Installation](#installation)\n- [Verwendung](#verwendung)\n- [Konfiguration](#konfiguration)\n- [API](#api)\n- [Development](#development)\n- [Related](#related)\n- [Wer verwendet es?](#wer-verwendet-es)\n- [Team](#team)\n- [License](#license)\n\n## Installation\n\n### Yarn\n\n```bash\nyarn add signale\n```\n\n### NPM\n\n```bash\nnpm install signale\n```\n\n## Verwendung\n\n### Default Loggers\n\nSignale importieren und einen der default Logger verwenden.\n\n\n\u003cdetails\u003e\n\u003csummary\u003eAll verfügbaren Logger anzeigen.\u003c/summary\u003e\n\n\u003cbr/\u003e\n\n- `await`\n- `complete`\n- `error`\n- `debug`\n- `fatal`\n- `fav`\n- `info`\n- `note`\n- `pause`\n- `pending`\n- `star`\n- `start`\n- `success`\n- `wait`\n- `warn`\n- `watch`\n- `log`\n\n\u003c/details\u003e\n\n\u003cbr/\u003e\n\n```js\nconst signale = require('signale');\n\nsignale.success('Operation successful');\nsignale.debug('Hello', 'from', 'L59');\nsignale.pending('Write release notes for %s', '1.2.0');\nsignale.fatal(new Error('Unable to acquire lock'));\nsignale.watch('Recursively watching build directory...');\nsignale.complete({prefix: '[task]', message: 'Fix issue #59', suffix: '(@klauscfhq)'});\n```\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg alt=\"Default Loggers\" src=\"../media/default-loggers.png\" width=\"65%\"\u003e\n\u003c/div\u003e\n\n### Benutzerdefinierte Logger\n\nUm einen benutzerdefinierten Logger zu erzeugen, wird ein `options` Objekt mit einem `types` field mit dem Logger definiert. Als argument wird eine neue Signale Instanz übergeben.\n\n\n```js\nconst {Signale} = require('signale');\n\nconst options = {\n  disabled: false,\n  interactive: false,\n  logLevel: 'info',\n  scope: 'custom',\n  secrets: [],\n  stream: process.stdout,\n  types: {\n    remind: {\n      badge: '**',\n      color: 'yellow',\n      label: 'reminder',\n      logLevel: 'info'\n    },\n    santa: {\n      badge: '🎅',\n      color: 'red',\n      label: 'santa',\n      logLevel: 'info'\n    }\n  }\n};\n\nconst custom = new Signale(options);\ncustom.remind('Improve documentation.');\ncustom.santa('Hoho! You have an unused variable on L45.');\n```\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg alt=\"Custom Loggers\" src=\"../media/custom-loggers.png\" width=\"70%\"\u003e\n\u003c/div\u003e\nEin Beispiel, wo die voreingestellten `error` und `success` Logger überschrieben werden.\n\n\n```js\nconst {Signale} = require('signale');\n\nconst options = {\n  types: {\n    error: {\n      badge: '!!',\n      label: 'fatal error'\n    },\n    success: {\n      badge: '++',\n      label: 'huge success'\n    }\n  }\n};\n\nconst signale = new Signale();\nsignale.error('Default Error Log');\nsignale.success('Default Success Log');\n\nconst custom = new Signale(options);\ncustom.error('Custom Error Log');\ncustom.success('Custom Success Log');\n```\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg alt=\"Default Loggers\" src=\"../media/override-defaults.png\" width=\"65%\"\u003e\n\u003c/div\u003e\n\nDas `options` Objekt kann jedes der folgenden Attribute erhalten: `disabled`, `interactive`, `logLevel`, `secrets`, `stream`, `scope` und `types`. \n\n##### `disabled`\n\n- Type: `Boolean`\n- Default: `false`\n\nVerhindert das Logging aller Logger, die zur der Instanz gehören.\n\n##### `interactive`\n\n- Type: `Boolean`\n- Default: `false`\n\nSchaltet alle Logger, die zu der Instanz gehören, in den interaktiven Modus.\n\n##### `logLevel`\n\n- Type: `String`\n- Default: `'info'`\n\nSetzte den Loglevel der erstellten Instanz. Es kann einer der folgenden Level gewählt werden:\n\n- `'info'` - Zeigt alle Benachrichtigungen von allen Loggern.\n- `'timer'` -  Zeigt Benachrichtigungen von den `time`, `timeEnd`, `debug`, `warn`, `error` \u0026 `fatal` Loggern.\n- `'debug'` - Zeigt Benachrichtigungen von den `debug`, `warn`, `error` \u0026 `fatal` Loggern.\n- `'warn'` - Zeigt Benachrichtigungen von den `warn`, `error` \u0026 `fatal` Loggern.\n- `'error'` - Zeigt Benachrichtigungen von den `error` \u0026 `fatal` Loggern.\n\n##### `secrets`\n\n- Type: `(String|Number)[]`\n- Default: `[]`\n\nEin Array, in dem geheime/sensitive Informationen angegeben werden können. Diese werden vom Body und den Metadaten der Benachtichtigungen entfernt und mit dem voreingestellten `'[secure]'` String ersetzt.\n\n##### `stream`\n\n- Type: `stream.Writable|stream.Writable[]`\n- Default: `process.stdout`\n\nDie Daten werden in dieses Ziel geschrieben. Es kann ein einzelner, gültiger [Writable stream](https://nodejs.org/api/stream.html#stream_writable_streams) oder ein Array mit mehreren Writable streams sein.\n\n##### `scope`\n\n- Type: `String|String[]`\n\nName des Bereichs für den geloggt wird.\n\n##### `types`\n\n- Type: `Object`\n\nEnthält die Konfiguration der benutzerdefinierten und voreingestellten Logger.\n\nZusätzlich kann das configuration object von jedem Logger-Type, das in der `types` Option definiert wird, folgende Attibute erhalten: `badge`, `label`, `color`, `logLevel` \u0026 `stream`. \n\n##### `badge`\n\n- Type: `String`\n\nIcon, der zum Logger gehört.\n\n\n##### `label`\n\n- Type: `String`\n\nLabel, das verwendet wird, um den Typ des Loggers zu erkennen.\n\n##### `color`\n\n- Type: `String`\n\nFarbe des Labels. Kann eine der von [chalk](https://github.com/chalk/chalk#colors) unterstützten Farben sein.\n\n\n##### `logLevel`\n\n- Type: `String`\n- Default: `'info'`\n\nDas passende Loglevel für den Logger. Nachrichten vom Logger werden angezeigt, wenn der Loglevel größer oder gleich zum oben beschriebenen generellen Loglevel `logLevel` der `Signale` Instanz ist.\n\n### Zielgerichtete Logger\n\nUm einen neuen Logger für einen bestimmten Bereich zu erstellen, wird das `scope` Feld im `options` Objekt definiert und als Argument an die neue Signale Instanz übergeben.\n\n```js\nconst {Signale} = require('signale');\n\nconst options = {\n  scope: 'global scope'\n};\n\nconst global = new Signale(options);\nglobal.success('Successful Operation');\n```\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg alt=\"Scope Vanilla\" src=\"../media/scope-vanilla.png\" width=\"65%\"\u003e\n\u003c/div\u003e\n\nUm einen Logger für einen besteimmten Bereich, basierend auf einem bereits existierenden Logger, zu erstellen wird die `scope()` Funktion verwendet. Sie retourniert eine neue signale Instanz, die alle benutzerdefinierten Logger, Timer, Geheimnisse, Streams, Konfiguation, Loglevel, Interaktiven Modi und deaktivierten Stati erbt.\n\n```js\nconst signale = require('signale');\n\nconst global = signale.scope('global scope');\nglobal.success('Hello from the global scope');\n\nfunction foo() {\n  const outer = global.scope('outer', 'scope');\n  outer.success('Hello from the outer scope');\n  \n  setTimeout(() =\u003e {\n    const inner = outer.scope('inner', 'scope'); \n    inner.success('Hello from the inner scope');\n  }, 500);\n}\n\nfoo();\n```\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg alt=\"Scope Existing\" src=\"../media/scope-existing.png\" width=\"65%\"\u003e\n\u003c/div\u003e\n\n### Interaktive Loggers\n\nUm einen intaktiven Logger zu initialisieren, wird eine neue signale Instanz mit dem Wert `true` im [`interactive`](#interactive) Attribute erzeugt. Während man sich im interaktiven Modus befindet, werden zuvor geloggte Nachrichten von einem anderen interaktiven Logger von den neuen, die von dem gleichen oder einem neuen interaktiven Logger kommen, überschrieben. Reguläre Nachrichten von regulären Loggern werden von interaktiven nicht überschrieben.\n\n```js\nconst {Signale} = require('signale');\n\nconst interactive = new Signale({interactive: true, scope: 'interactive'});\n\ninteractive.await('[%d/4] - Process A', 1);\n\nsetTimeout(() =\u003e {\n  interactive.success('[%d/4] - Process A', 2);\n  setTimeout(() =\u003e {\n    interactive.await('[%d/4] - Process B', 3);\n    setTimeout(() =\u003e {\n      interactive.error('[%d/4] - Process B', 4);\n      setTimeout(() =\u003e {}, 1000);\n    }, 1000);\n  }, 1000);\n}, 1000);\n```\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg alt=\"Interactive Mode\" src=\"../media/interactive-mode.gif\" width=\"65%\"\u003e\n\u003c/div\u003e\n\n### Writable Streams\n\nStandardmäßig loggen alle Signale Instanzen die Nachrichten in den `process.stdout` stream. Der Ziel-Stream kann durch die [`stream`](#stream) property angepasst werden. Hier kann ein einzelner oder mehrere gütlige Writable streams angegeben werden, welche dann von allen Loggertypen verwendet werden. Zusätzlich ist es möglich einen oder mehrere Wirtable Streams exklusiv für einen spezifischen Loggertypen zu definieren - also Daten unabhängig von den restlichen Loggertypen zu schreiben.\n\n```js\nconst {Signale} = require('signale');\n\nconst options = {\n  stream: process.stderr, // All loggers will now write to `process.stderr`\n  types: {\n    error: {\n      // Only `error` will write to both `process.stdout` \u0026 `process.stderr`\n      stream: [process.stdout, process.stderr]\n    }\n  }\n};\n\nconst signale = new Signale(options);\nsignale.success('Message will appear on `process.stderr`');\nsignale.error('Message will appear on both `process.stdout` \u0026 `process.stderr`');\n```\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg alt=\"Writable Streams\" src=\"../media/writable-streams.png\" width=\"73%\"\u003e\n\u003c/div\u003e\n\n### Secrets Filtering\n\nDurch das Verwenden der `secrets` Option werden geheime/sensitive Informationen, wie Scopenamen,  aus den Nachrichten (Body und Metadaten) herausgefiltert. Diese Option ist Teil des configuration-Objects, dass einer `Signale`-Instanz oder Initialisierung übergeben wird und hat den Typ `Array\u003cString|Number\u003e`. Das Array kann mehrere Geheimnisse enthalten. Alle werden, wenn sie vorkommen, entfernt und durch den standardmäßigen `'[secure]'` string ersetzt. Wenn die unäre `signale.scope(name)` Funktion verwendet wird, dann erbt die erzeugte `Signale` Instanz alle Geheimnisse des Parents. Die Geheimnisse werden **case-sensitive** überprüft. Die unäre [`signale.addSecrets()`](https://github.com/klaussinani/signale#signaleaddsecretssecrets) und die nullstellige [`signale.clearSecrets()`](https://github.com/klaussinani/signale#signaleclearsecrets) Funktion sind über die API verfügbar um die Geheimnisse hinzuzufügen/zu löschen.\n\nEs ist **entscheidende** und **stark befürwortete** Praxis, sensitive Informationen **nicht direkt im Quellcode zu speichern**. Das Beispiel ist **alleinig** zur die Demonstration gedacht:\n\n```js\nconst {Signale} = require('signale');\n\n// In reality secrets could be securely fetched/decrypted through a dedicated API \nconst [USERNAME, TOKEN] = ['klaussinani', 'token'];\n\nconst logger1 = new Signale({\n  secrets: [USERNAME, TOKEN]\n});\n\nlogger1.log('$ exporting USERNAME=%s', USERNAME);\nlogger1.log('$ exporting TOKEN=%s', TOKEN);\n\n// `logger2` inherits all secrets from its parent `logger1`\nconst logger2 = logger1.scope('parent');\n\nlogger2.log('$ exporting USERNAME=%s', USERNAME);\nlogger2.log('$ exporting TOKEN=%s', TOKEN);\n```\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg alt=\"Secrets Filtering\" src=\"../media/filter-secrets.png\" width=\"73%\"\u003e\n\u003c/div\u003e\n\n### Timers\n\nTimer werden von den `time()` und `timeEnd()`  Funktionen verwaltet. Zur Identifikation eines Timers oder einer Initialisierung kann ein einzigartiges Label vewrendet werden. Wenn keines bereitgestellt wird, dann wird eines automatisch generiert. Wenn die `timeEnd()` Funktion ohne ein Label aufgerufen wird, dann wird der als letztes initialisierte Timer terminiert, der ohne Label erstellt wurde.\n\n```js\nconst signale = require('signale');\n\nsignale.time('test');\nsignale.time();\nsignale.time();\n\nsetTimeout(() =\u003e {\n  signale.timeEnd();\n  signale.timeEnd();\n  signale.timeEnd('test');\n}, 500);\n```\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg alt=\"Timers\" src=\"../media/timers.png\" width=\"60%\"\u003e\n\u003c/div\u003e\n\n## Konfiguration\n\n### Global\n\nUm die gloabel Konfiguration zu ermöglichen, müssen die Optionen unter dem`signale` namespace im `package.json` defniert werden.\n\nDas folgende Beispiel zeigt alle verfügbaren Optionen mit den zugehörigen voreingestellten Werten.\n\n```json\n{\n  \"signale\": {\n    \"displayScope\": true,\n    \"displayBadge\": true,\n    \"displayDate\": false,\n    \"displayFilename\": false,\n    \"displayLabel\": true,\n    \"displayTimestamp\": false,\n    \"underlineLabel\": true,\n    \"underlineMessage\": false,\n    \"underlinePrefix\": false,\n    \"underlineSuffix\": false,\n    \"uppercaseLabel\": false\n  }\n}\n```\n\n\u003cdetails\u003e\n\u003csummary\u003eAlle verfügbaren Optionen im Detail ansehen.\u003c/summary\u003e\n\n##### `displayScope`\n\n- Type: `Boolean`\n- Default: `true`\n\nZeigt den Bereichsnamen des Loggers.\n\n##### `displayBadge`\n\n- Type: `Boolean`\n- Default: `true`\n\nZeigt den Badge des Loggers.\n\n##### `displayDate`\n\n- Type: `Boolean`\n- Default: `false`\n\nZeugt das aktuelle lokale Datum im `YYYY-MM-DD` Format. \n\n##### `displayFilename`\n\n- Type: `Boolean`\n- Default: `false`\n\nZeigt den Dateinamen vom File, für das der Logger loggt.\n\n##### `displayLabel`\n\n- Type: `Boolean`\n- Default: `true`\n\nZeigt das Label des Loggers.\n\n##### `displayTimestamp`\n\n- Type: `Boolean`\n- Default: `false`\n\nZeigt die lokale Zeit im `HH:MM:SS` Format.\n\n##### `underlineLabel`\n\n- Type: `Boolean`\n- Default: `true`\n\nUnterstreicht das Logger-Label.\n\n##### `underlineMessage`\n\n- Type: `Boolean`\n- Default: `false`\n\nUnterstreicht die Logger Nachricht.\n\n##### `underlinePrefix`\n\n- Type: `Boolean`\n- Default: `false`\n\nUnterstreicht die Logger Prefix.\n\n##### `underlineSuffix`\n\n- Type: `Boolean`\n- Default: `false`\n\nUnterstreicht die Logger Suffix.\n\n##### `uppercaseLabel`\n\n- Type: `Boolean`\n- Default: `false`\n\nZeigt das Label des Loggers in Großbuchstaben.\n\n\u003c/details\u003e\n\n### Local\n\nUm die lokale Konfiguration zu ermöglichen muss die `config()` Funktion der Signale Instanz aufgerufen werden. Lokale Konfigurationen überschreiben immer die geerbte Konfiguration von `package.json`.\n\nDas folgende Beispiel zeigt wie Logger in der `foo.js`-Datei unter einer eigenen Konfiguation laufen, die die `package.json`-Konfiguration überschreibt.\n\n```js\n// foo.js\nconst signale = require('signale');\n\n// Overrides any existing `package.json` config\nsignale.config({\n  displayFilename: true,\n  displayTimestamp: true,\n  displayDate: false\n}); \n\nsignale.success('Hello from the Global scope');\n```\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg alt=\"Local Config\" src=\"../media/local-config.png\" width=\"65%\"\u003e\n\u003c/div\u003e\n\nLogger für bestimmte Bereiche können eine unabhängige, eigene Konfiguration erhalten, die die vom Parent oder vom `package.json` vererbte Konfiguation überschreibt.\n\n```js\n// foo.js\nconst signale = require('signale');\n\nsignale.config({\n  displayFilename: true,\n  displayTimestamp: true,\n  displayDate: false\n});\n\nsignale.success('Hello from the Global scope');\n\nfunction foo() {\n  // `fooLogger` inherits the config of `signale`\n  const fooLogger = signale.scope('foo scope');\n\n  // Overrides both `signale` and `package.json` configs\n  fooLogger.config({\n    displayFilename: true,\n    displayTimestamp: false,\n    displayDate: true\n  });\n\n  fooLogger.success('Hello from the Local scope');\n}\n\nfoo();\n```\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg alt=\"Scope Config\" src=\"../media/scope-config.png\" width=\"65%\"\u003e\n\u003c/div\u003e\n\n## API\n\n#### signale.`\u003clogger\u003e(message[, message]|messageObj|errorObj)`\n\n##### **`logger`**\n\n- Type: `Function`\n\nKann jeder vereingestellte oder benutzerdefinierte Logger sein.\n\n##### **`message`**\n\n- Type: `String`\n\nKann ein oder mehrere durch Kommas getrennte Strings sein.\n\n```js\nconst signale = require('signale');\n\nsignale.success('Successful operation');\n//=\u003e ✔  success  Successful operation\n\nsignale.success('Successful', 'operation');\n//=\u003e ✔  success  Successful operation\n\nsignale.success('Successful %s', 'operation');\n//=\u003e ✔  success  Successful operation\n```\n\n##### **`errorObj`**\n\n- Type: `Error Object`\n\nKann jedes Error Objekt sein.\n\n```js\nconst signale = require('signale');\n\nsignale.error(new Error('Unsuccessful operation'));\n//=\u003e ✖  error  Error: Unsuccessful operation\n//        at Module._compile (module.js:660:30)\n//        at Object.Module._extensions..js (module.js:671:10)\n//        ...\n```\n\n##### **`messageObj`**\n\n- Type: `Object`\n\nKann jedes Objet sein, dass die Attribute `prefix`, `message` und `suffix` enthält, wobei `prefix` und `suffix` immer vor bzw. nach der `message` eingefügt werden.\n\n```js\nconst signale = require('signale');\n\nsignale.complete({prefix: '[task]', message: 'Fix issue #59', suffix: '(@klaussinani)'});\n//=\u003e [task] ☒  complete  Fix issue #59 (@klaussinani)\n\nsignale.complete({prefix: '[task]', message: ['Fix issue #%d', 59], suffix: '(@klaussinani)'});\n//=\u003e [task] ☒  complete  Fix issue #59 (@klaussinani)\n```\n\n#### signale.`scope(name[, name])`\n\nDefiniert den Namen des Loggers.\n\n##### **`name`**\n\n- Type: `String`\n\nKann ein oder mehrere durch Kommas getrennte Strings sein.\n\n```js\nconst signale = require('signale');\n\nconst foo = signale.scope('foo'); \nconst fooBar = signale.scope('foo', 'bar');\n\nfoo.success('foo');\n//=\u003e [foo] › ✔  success  foo\n\nfooBar.success('foo bar');\n//=\u003e [foo] [bar] › ✔  success  foo bar\n```\n\n#### signale.`unscope()`\n\nLöscht den Bereichsnamen des Loggers.\n\n```js\nconst signale = require('signale');\n\nconst foo = signale.scope('foo'); \n\nfoo.success('foo');\n//=\u003e [foo] › ✔  success  foo\n\nfoo.unscope();\n\nfoo.success('foo');\n//=\u003e ✔  success  foo\n```\n\n#### signale.`config(settingsObj)`\n\nDie Konfiguration der Instanz wird gesestzt und überschreibt die existierende lokale oder globale Konfiguration.\n\n##### **`settingsObj`**\n\n- Type: `Object`\n\nKann jede der dokumentierten [options](#global) enthalten.\n\n```js\n// foo.js\nconst signale = require('signale');\n\nsignale.config({\n  displayFilename: true,\n  displayTimestamp: true,\n  displayDate: true\n});\n\nsignale.success('Successful operations');\n//=\u003e [2018-5-15] [11:12:38] [foo.js] › ✔  success  Successful operations\n```\n\n#### signale.`time([, label])`\n\n- Return Type: `String`\n\nSetzt einen Timer und aktzeptiert ein optionales Label. Wenn kein Label übergeben wird, dann erhält der Timer automatisch eines.\n\nRetourniert einen String, der das Timerlabel repräsentiert.\n\n##### **`label`**\n\n- Type: `String`\n\nLabel, dass zum Timer gehört. Jeder Timer braucht ein einzigartiges Label.\n\n```js\nconst signale = require('signale');\n\nsignale.time();\n//=\u003e ▶  timer_0  Initialized timer...\n\nsignale.time();\n//=\u003e ▶  timer_1  Initialized timer...\n\nsignale.time('label');\n//=\u003e ▶  label    Initialized timer...\n```\n\n#### signale.`timeEnd([, label])`\n\n- Return Type: `Object`\n\nDeaktiviert den Timer, der zu dem Label gehört. Wenn kein Label angegeben wird, dann wird der letzte Timer, der ohne Label erzeugt wurde, deaktiviert.\n\nRetourniert ein Objekt `{label, span}`, welches das Label und die Laufzeit enthält.\n\n##### **`label`**\n\n- Type: `String`\n\nLabel, dass zu dem Timer gehört. Jeder Timer hat ein einzigartiges label.\n\n```js\nconst signale = require('signale');\n\nsignale.time();\n//=\u003e ▶  timer_0  Initialized timer...\n\nsignale.time();\n//=\u003e ▶  timer_1  Initialized timer...\n\nsignale.time('label');\n//=\u003e ▶  label    Initialized timer...\n\nsignale.timeEnd();\n//=\u003e ◼  timer_1  Timer run for: 2ms\n\nsignale.timeEnd();\n//=\u003e ◼  timer_0  Timer run for: 2ms\n\nsignale.timeEnd('label');\n//=\u003e ◼  label    Timer run for: 2ms\n```\n\n#### signale.`disable()`\n\nDeaktiviert das Logging für alle Logger die zu einer spezifischen Instanz gehören.\n\n```js\nconst signale = require('signale');\n\nsignale.success('foo');\n//=\u003e ✔  success  foo\n\nsignale.disable();\n\nsignale.success('foo');\n//=\u003e\n```\n\n#### signale.`enable()`\n\nAktiviert das Logging für alle Logger die zu einer spezifischen Instanz gehören.\n```js\nconst signale = require('signale');\n\nsignale.disable();\n\nsignale.success('foo');\n//=\u003e\n\nsignale.enable();\n\nsignale.success('foo');\n//=\u003e ✔  success  foo\n```\n\n#### signale.`isEnabled()`\n\nÜberprüft, ob Logging für die spezifische Instanz aktiviert ist.\n\n```js\nconst signale = require('signale');\n\nsignale.success('foo');\n//=\u003e ✔  success  foo\n\nsignale.isEnabled();\n// =\u003e true\n\nsignale.disable();\n\nsignale.success('foo');\n//=\u003e\n\nsignale.isEnabled();\n// =\u003e false\n```\n\n#### signale.`addSecrets(secrets)`\n\nFügt neue geheime/sensitive Informatioen hinzu.\n\n##### **`secrets`**\n\n- Type: `(String|Number)[]`\n\nArray, dass die geheime/sensitive Information enthält, die herausgefiltert werden soll.\n\n```js\nconst signale = require('signale');\n\nsignale.log('$ exporting USERNAME=%s', 'klaussinani');\n//=\u003e $ exporting USERNAME=klaussinani\n\nsignale.addSecrets(['klaussinani']);\n\nsignale.log('$ exporting USERNAME=%s', 'klaussinani');\n//=\u003e $ exporting USERNAME=[secure]\n```\n\n#### signale.`clearSecrets()`\n\nEntfernt alle geheimen/sensitiven Informationen der spezifischen Signale Instanz.\n\n```js\nconst signale = require('signale');\n\nsignale.addSecrets(['klaussinani']);\n\nsignale.log('$ exporting USERNAME=%s', 'klaussinani');\n//=\u003e $ exporting USERNAME=[secure]\n\nsignale.clearSecrets();\n\nsignale.log('$ exporting USERNAME=%s', 'klaussinani');\n//=\u003e $ exporting USERNAME=klaussinani\n```\n\n## Development\n\nMehr Informationen im Bezug auf Beiträge zum Projekt finden sich in den [contributing guidelines](https://github.com/klaussinani/signale/blob/master/contributing.md).\n\n- Das Repository forken und auf deine Maschine klonen\n- Zum lokalen Fork navigieren: `cd signale`\n- Die dependencies installieren: `npm install` oder `yarn install`\n- Den Code für Fehler linten: `npm test` or `yarn test`\n## Related\n\n- [qoa](https://github.com/klaussinani/qoa) - Minimal interactive command-line prompts\n- [taskbook](https://github.com/klaussinani/taskbook) - Tasks, boards \u0026 notes for the command-line habitat\n- [hyperocean](https://github.com/klaussinani/hyperocean) - Deep oceanic blue Hyper terminal theme\n\n## Who's Using It?\n\n- [Boostnote](https://github.com/BoostIO/Boostnote)\n- [Docz](https://github.com/pedronauck/docz)\n- [Remix by Ethereum](https://github.com/ethereum/remix)\n- [Semantic Release](https://github.com/semantic-release/semantic-release)\n- [Shower](https://github.com/shower/shower)\n- [Taskbook](https://github.com/klaussinani/taskbook)\n- [Vant](https://github.com/youzan/vant)\n\nRepositories, die Signale verwenden im Detail ansehen: [hier](https://github.com/klaussinani/signale/network/dependents).\n\n## Team\n\n- Klaus Sinani [(@klaussinani)](https://github.com/klaussinani)\n- Mario Sinani [(@mariosinani)](https://github.com/mariosinani)\n\n## License\n\n[MIT](https://github.com/klaussinani/signale/blob/master/license.md)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fklauscfhq%2Fsignale","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fklauscfhq%2Fsignale","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fklauscfhq%2Fsignale/lists"}