MetriBeacon
Menü
Deutsch

Zentrale Logverwaltung

Verbinden Sie ausgewählte Systeme und Anwendungen, finden Sie maskierte Logs und erstellen Sie verlässliche Logalarme.

Auf dieser Seite

Eine Quelle ausdrücklich verbinden

  1. Öffnen Sie Logs → Quellen → Quelle hinzufügen und wählen Sie die Anbindung. Wählen Sie den Server, die Anwendung oder das Projekt, dessen Logs Sie erfassen möchten.
  2. Wählen Sie die gewünschten Logs und dann Verbinden. Quelle, Aktivierung und Schlüssel werden gemeinsam vorbereitet. Erweiterte Einstellungen sind optional; sieben Tage Aufbewahrung und Geheimnismaskierung sind voreingestellt.
  3. Erteilen Sie die Anbieterfreigabe oder führen Sie den vorbereiteten Befehl aus. Bei installiertem Agenten bestätigen Sie die angezeigte Auswahl einmal lokal. Warten Sie, bis neue Logs empfangen wurden und durchsuchbar sind.

Maskierung, Kontingente und fehlende Abdeckung

Bekannte Passwort-, Token-, Cookie-, Authorization- und private Schlüsselfelder werden vor der Speicherung maskiert. Ergänzen Sie Feld- oder RE2-Maskierungsregeln für eigene Geheimnisse. Senden Sie Daten nur mit der nötigen Berechtigung. Der Agent maskiert auch vor seinem verschlüsselten lokalen Puffer; vorhandene Ereignisse werden nicht automatisch kopiert.

Warteschlangenrückstände, Kontingentablehnungen und Agent-Pufferprobleme erscheinen als unvollständige Beobachtung. Sie bestätigen niemals einen erfolgreichen Ausbleibealarm oder eine Entwarnung. Kürzere Aufbewahrung benötigt eine Bestätigung und blendet betroffene Einträge sofort aus; eine Verlängerung stellt gelöschte Einträge nicht wieder her. Arbeitsbereichsrechte gelten auch für Suche, Liveansicht und Downloads.

Der Explorer beginnt mit den letzten 15 Minuten. Kombinieren Sie Phrasen, Felder, UND/ODER/NICHT, Existenzprüfungen, Präfixe und RE2-Ausdrücke. Zähler und Histogramme umfassen den vollständigen gefilterten Bestand, unabhängig von der 50er-Seite. Liveeinträge warten auf Ihren Klick, damit die betrachtete Zeile stehen bleibt. Ansichten lassen sich persönlich oder gemeinsam speichern. Finden Sie Quellen und gespeicherte Ansichten über Strg/Cmd+K nach Name oder Kennung und merken Sie häufig verwendete Ziele als Favoriten. Geteilte Ansichten sehen Arbeitsbereichsmitglieder; private Ansichten sehen nur Sie. Ein Logvorfall öffnet seine ursprünglichen Quellen- und Zeitfilter. Fehlen diese, wählen Sie sie ausdrücklich im Explorer.

text
service:api AND (level:>=error OR "payment failed") -host:staging*
attr.customer_id:* AND trace_id:0123456789abcdef0123456789abcdef
message:~"timeout|connection refused"

Erstellen Sie einen Trefferanzahl- oder Ausbleibealarm mit einem Fenster von einer Minute bis sechs Stunden. Prüfen Sie die Vorschau, wählen Sie Benachrichtigungsziele und gruppieren Sie optional nach Dienst oder Host. Alarme behalten ihren eigenen Filter, auch wenn Sie eine gespeicherte Ansicht später ändern. CSV- und NDJSON-Exporte verwenden einen festen berechtigten Datenstand und verfallen spätestens nach 15 Minuten.

Öffnen Sie einen Vorfall und wählen Sie Logs. Zugeordnete Quellen werden von 15 Minuten vor bis fünf Minuten nach Beginn durchsucht. Neue Vorfälle bewahren ursprüngliche Quellen und Logregelfilter; ältere kennzeichnen aktuelle Zuordnungen. Die Erweiterung auf den Arbeitsbereich erfolgt ausdrücklich. Im Explorer können Sie Filter ändern und überlappende Vorfallmarkierungen sehen; Links erhalten das Untersuchungsfenster. Gesuchte Logs sind Kontext, keine ursprünglichen Auslösenachweise.

HTTP und Fluent Bit

Senden Sie JSON-Objekte, Arrays oder NDJSON mit dem Schreibschlüssel im Authorization-Header. gzip wird unterstützt. Verwenden Sie bei Wiederholungen stabile Paket- und Datensatzkennungen.

http
POST /api/v1/logs/ingest HTTP/1.1
Host: metribeacon.com
Authorization: Bearer <SOURCE_KEY>
Content-Type: application/json

{"batch_id":"batch-1","records":[{"id":"entry-1","level":"info","message":"worker ready","attributes":{"zero":0,"ready":true}}]}
text
[SERVICE]
    Flush 1
    Log_Level error
    Parsers_File parsers.conf

[INPUT]
    Name tail
    Path /var/log/my-application/*.log
    Parser application_json
    DB /var/lib/fluent-bit/metribeacon-positions.db
    Read_from_Head false
    Rotate_Wait 30
    Buffer_Max_Size 64k
    Skip_Long_Lines Off
    Mem_Buf_Limit 16M
    Tag application

[OUTPUT]
    Name http
    Match application
    Host metribeacon.com
    Port 443
    URI /api/v1/logs/ingest
    Format json_lines
    Json_Date_Key time
    Json_Date_Format iso8601
    Header Authorization Bearer ${METRIBEACON_LOG_KEY}
    tls On
    tls.verify On
    compress gzip
    Workers 1
    Retry_Limit no_limits
text
[PARSER]
    Name application_json
    Format json
    Time_Key time
    Time_Format %Y-%m-%dT%H:%M:%S.%L%z
    Time_Keep On

OpenTelemetry Collector und Kubernetes

Richten Sie Ihren OTLP/HTTP-Logexporter auf diesen Endpunkt und hinterlegen Sie den Quellenschlüssel als Authorization: Bearer. Protobuf und Protobuf-JSON werden angenommen. Laden Sie die Collector-Konfiguration für Kubernetes oder einen vorhandenen Collector herunter.

yaml
receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 127.0.0.1:4317
      http:
        endpoint: 127.0.0.1:4318
processors:
  memory_limiter:
    check_interval: 1s
    limit_mib: 96
    spike_limit_mib: 16
  batch:
    timeout: 1s
    send_batch_size: 100
    send_batch_max_size: 100
exporters:
  otlphttp/metribeacon:
    endpoint: https://metribeacon.com/api/v1/otlp
    headers:
      Authorization: "Bearer ${env:METRIBEACON_LOG_KEY}"
    compression: gzip
    timeout: 5s
    retry_on_failure:
      enabled: true
      initial_interval: 1s
      max_interval: 30s
      max_elapsed_time: 300s
    sending_queue:
      enabled: true
      num_consumers: 1
      queue_size: 100
service:
  telemetry:
    logs:
      level: error
  pipelines:
    logs:
      receivers: [otlp]
      processors: [memory_limiter, batch]
      exporters: [otlphttp/metribeacon]

Syslog

Verwenden Sie TLS auf Port 6514 mit RFC 5424 oder RFC 3164 sowie Oktettzählung oder Zeilenrahmung. Verwenden Sie das heruntergeladene Clientzertifikat oder stellen Sie den Quellenschlüssel und ein Leerzeichen jeder Nachricht vor der Rahmung voran.

MetriBeacon-Agent

Wählen Sie den vorhandenen Server und ausdrücklich seine erkannten Logs. Nichts ist vorausgewählt. Verbinden bereitet einen kurzlebigen Befehl zur lokalen Administratorfreigabe der gesamten Auswahl vor. Servermesswerte und Lesepositionen bleiben erhalten. Andere Logdateien benötigen einen ausdrücklichen Pfad und lokale Freigabe. Der neueste freigegebene Agent ist erforderlich.

Erweiterte Alternative: Verwalten Sie getrennte private Quellen- und Schlüsseldateien lokal. Schützen Sie sie mit chmod 600 auf Linux/macOS oder einer eingeschränkten ACL unter Windows. Der Multiline-Ausdruck markiert den Beginn eines Eintrags.

json
{
  "id": "00000000-0000-4000-8000-000000000001",
  "kind": "file",
  "path": "/var/log/my-app/application.log",
  "multiline": "^\\d{4}-\\d{2}-\\d{2}",
  "policy": {
    "masks": []
  }
}
shell
sudo metribeacon agent logs add --source-file ./log-source.json --key-file ./private-log.key
sudo metribeacon agent logs remove --source-file ./log-source.json

Vercel

Geben Sie Vercel frei, wählen Sie ein Projekt und verbinden Sie es. MetriBeacon erstellt einen JSON-Drain mit Endpunktprüfung und geschützter Authentifizierung. Fremde Drains bleiben unverändert. Wenn die Browseranmeldung nicht verfügbar ist, können Sie einen Anbieter-API-Token verwenden. Verfügbarkeit und Kosten hängen vom Tarif ab.

Heroku

Geben Sie Heroku frei, wählen Sie die Anwendung und verbinden Sie sich. Cedar verwendet einen HTTPS-Log-Drain, Fir einen OTLP-Telemetrie-Drain. MetriBeacon wählt den unterstützten Weg und erhält andere Drains.

Render

Geben Sie einen Render-API-Token frei, wählen Sie den Dienst und verbinden Sie ihn. MetriBeacon richtet den unterstützten TLS-Logstream ein und ersetzt kein vorhandenes Ziel. Erforderlicher Render-Tarif und Berechtigungen gelten weiterhin.

Railway

Railway besitzt keine native Log-Drain-Einstellung. Exportieren Sie Anwendungslogs über OTLP/HTTP oder betreiben Sie einen ausdrücklich konfigurierten Forwarder. Für einen lokalen Test können Sie railway logs --json an die bereitgestellte forward.py mit --provider railway und einer privaten Schlüsseldatei weitergeben.

python
#!/usr/bin/env python3
"""Forward one bounded NDJSON stream; retries retain the same batch and record IDs."""
import argparse
import json
import os
from pathlib import Path
import sys
import time
from urllib.error import HTTPError, URLError
from urllib.request import Request, HTTPRedirectHandler, build_opener
import uuid

class NoRedirect(HTTPRedirectHandler):
    def redirect_request(self, request, fp, code, message, headers, target):
        return None

def batches(stream):
    for line in stream:
        if len(line)>65536:raise ValueError('log_record_limit')
        record=json.loads(line)
        if not isinstance(record,dict):raise ValueError('invalid_log_record')
        record.setdefault('id',str(uuid.uuid4()))
        yield {'batch_id':str(uuid.uuid4()),'records':[record]}

def send(batch, token, provider, opener=None):
    raw=json.dumps(batch,separators=(',',':')).encode()
    if len(raw)>1048576:raise ValueError('log_body_limit')
    endpoint='https://metribeacon.com/api/v1/logs/integrations/'+provider
    opener=opener or build_opener(NoRedirect())
    for attempt in range(8):
        request=Request(endpoint,data=raw,headers={'Authorization':'Bearer '+token,'Content-Type':'application/json'},method='POST')
        delay=min(30,2**attempt)
        try:
            with opener.open(request,timeout=10) as response:
                if response.status in (200,202):return
                raise ValueError('log_ingest_rejected')
        except HTTPError as error:
            if error.code not in (429,502,503,504):raise ValueError('log_ingest_rejected') from None
            retry=error.headers.get('Retry-After','')
            if retry.isdecimal():delay=min(300,int(retry))
            error.close()
        except (URLError,TimeoutError):pass
        time.sleep(delay)
    raise ValueError('log_ingest_unconfirmed')

def main():
    parser=argparse.ArgumentParser(description=__doc__)
    parser.add_argument('--provider',choices=['http','railway','fly','render','supabase','netlify','cloudflare','cloudwatch'],default='http')
    parser.add_argument('--key-file',required=True)
    args=parser.parse_args()
    path=Path(args.key_file)
    if path.is_symlink() or path.stat().st_mode & 0o077:raise ValueError('private_key_file_required')
    token=path.read_text().strip()
    if not token.startswith('mbg_'):raise ValueError('invalid_log_key')
    for batch in batches(iter(lambda:sys.stdin.buffer.readline(65538),b'')):
        send(batch,token,args.provider)

if __name__=='__main__':
    try:main()
    except (ValueError,OSError):
        print('log_forwarding_stopped',file=sys.stderr)
        raise SystemExit(1)

Fly

Wählen Sie die Anwendung und führen Sie den vorbereiteten Befehl mit Python 3 und angemeldeter Fly CLI aus. Er stellt einen eigenen begrenzten Shipper in der Organisation bereit, hinterlegt Geheimnisse und prüft die Bereitstellung. Fly.io-Kosten gelten. Der Vector-Ausschnitt unten ist eine erweiterte Alternative.

text
[sinks.metri]
type = "http"
inputs = ["log_json"]
uri = "https://metribeacon.com/api/v1/logs/integrations/fly"
method = "post"
encoding.codec = "json"
framing.method = "newline_delimited"
compression = "gzip"
auth.strategy = "bearer"
auth.token = "${METRIBEACON_LOG_KEY}"
batch.max_bytes = 900000
batch.max_events = 1000
batch.timeout_secs = 1
buffer.type = "memory"
buffer.max_events = 1000
buffer.when_full = "block"
request.concurrency = 1
request.timeout_secs = 10

Cloudflare

Erstellen Sie den eingeschränkten Token über die vorbereitete Berechtigungsvorlage, wählen Sie die Zone und verbinden Sie sich. MetriBeacon erstellt Worker-Relay und Logpush-Auftrag für HTTP-Anfragelogs. Begrenzen Sie Konto und Zonen bei Cloudflare; Logpush und Worker können Kosten verursachen. Die folgenden Beispiele sind erweiterte Alternativen.

javascript
const MAX_INPUT=5_000_000;
async function bounded(stream,max){const reader=stream.getReader();const chunks=[];let length=0;for(;;){const {done,value}=await reader.read();if(done)break;length+=value.length;if(length>max){await reader.cancel();throw new Error("log_body_limit")};chunks.push(value)};const all=new Uint8Array(length);let offset=0;for(const chunk of chunks){all.set(chunk,offset);offset+=chunk.length};return all}
export async function forward(request,env,fetcher=fetch){
 if(request.method!=="POST")return new Response(null,{status:405});
 if(!env.METRIBEACON_LOG_KEY||request.headers.get("Authorization")!=="Bearer "+env.METRIBEACON_LOG_KEY)return new Response(null,{status:401});
 try{
  let bytes=await bounded(request.body,MAX_INPUT);
  if(request.headers.get("Content-Encoding")==="gzip")bytes=await bounded(new Blob([bytes]).stream().pipeThrough(new DecompressionStream("gzip")),MAX_INPUT);
  const text=new TextDecoder("utf-8",{fatal:true}).decode(bytes);
  if(text.trim()==='{"content":"tests"}')return new Response(null,{status:200});
  const records=text.trim().split("\n").filter(Boolean).map(line=>JSON.parse(line));
  if(records.length>1000)return new Response(null,{status:413});
  const batches=[];let batch=[],size=2;
  for(const record of records){const encoded=JSON.stringify(record),length=new TextEncoder().encode(encoded).length;if(length>65536)return new Response(null,{status:413});if(batch.length&&size+length+1>900000){batches.push(batch);batch=[];size=2};batch.push(record);size+=length+1};if(batch.length)batches.push(batch);
  for(const batch of batches){const response=await fetcher("https://metribeacon.com/api/v1/logs/integrations/cloudflare",{method:"POST",redirect:"error",headers:{Authorization:"Bearer "+env.METRIBEACON_LOG_KEY,"Content-Type":"application/json"},body:JSON.stringify(batch)});await response.body?.cancel();if(!response.ok)return new Response(null,{status:response.status===429?429:response.status>=500?503:response.status,headers:{"Retry-After":response.headers.get("Retry-After")??"5"}})}
  return new Response(null,{status:200});
 }catch(error){return new Response(null,{status:error instanceof Error&&error.message==="log_body_limit"?413:422})}
}
export default {fetch:forward};
json
{
  "name": "metribeacon-log-forwarder",
  "main": "cloudflare-worker.mjs",
  "compatibility_date": "2026-10-18",
  "observability": {
    "enabled": false
  }
}

Cloudwatch

Wählen Sie Region und Loggruppe und führen Sie den vorbereiteten Befehl mit angemeldeter AWS CloudShell oder AWS CLI aus. Prüfen Sie Auswahl und IAM-Freigabe. Der Befehl erstellt geschütztes Secret, Weiterleitungsfunktion und Abonnement. AWS-Kosten gelten. Die Vorlage unten ist eine erweiterte Alternative.

json
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Parameters": {
    "SourceLogGroup": {
      "Type": "String"
    },
    "LogKeySecretArn": {
      "Type": "String",
      "AllowedPattern": "arn:aws[a-z-]*:secretsmanager:[a-z0-9-]+:[0-9]{12}:secret:.+"
    }
  },
  "Resources": {
    "ForwarderRole": {
      "Type": "AWS::IAM::Role",
      "Properties": {
        "AssumeRolePolicyDocument": {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Effect": "Allow",
              "Principal": {
                "Service": "lambda.amazonaws.com"
              },
              "Action": "sts:AssumeRole"
            }
          ]
        },
        "Policies": [
          {
            "PolicyName": "ReadLogWriteKey",
            "PolicyDocument": {
              "Version": "2012-10-17",
              "Statement": [
                {
                  "Effect": "Allow",
                  "Action": "secretsmanager:GetSecretValue",
                  "Resource": {
                    "Ref": "LogKeySecretArn"
                  }
                }
              ]
            }
          }
        ]
      }
    },
    "Forwarder": {
      "Type": "AWS::Lambda::Function",
      "Properties": {
        "Runtime": "python3.13",
        "Handler": "index.handler",
        "MemorySize": 128,
        "Timeout": 60,
        "ReservedConcurrentExecutions": 2,
        "Role": {
          "Fn::GetAtt": [
            "ForwarderRole",
            "Arn"
          ]
        },
        "Environment": {
          "Variables": {
            "METRIBEACON_LOG_SECRET_ARN": {
              "Ref": "LogKeySecretArn"
            }
          }
        },
        "Code": {
          "ZipFile": "import base64\nimport gzip\nimport io\nimport json\nimport os\nfrom urllib.request import Request, HTTPRedirectHandler, build_opener\nimport boto3\n\nclass NoRedirect(HTTPRedirectHandler):\n    def redirect_request(self, request, fp, code, message, headers, target):\n        return None\n\ndef split_event(event):\n    encoded=base64.b64decode(event['awslogs']['data'],validate=True)\n    with gzip.GzipFile(fileobj=io.BytesIO(encoded)) as compressed:\n        raw=compressed.read(16*1024*1024+1)\n    if len(raw)>16*1024*1024:raise ValueError('cloudwatch_batch_limit')\n    data=json.loads(raw)\n    if data.get('messageType')=='CONTROL_MESSAGE':return []\n    if data.get('logGroup')=='/aws/lambda/'+os.environ.get('AWS_LAMBDA_FUNCTION_NAME',''):\n        raise ValueError('recursive_log_subscription')\n    batches=[];records=[];size=0\n    for item in data.get('logEvents',[]):\n        record={'id':item['id'],'timestamp':item['timestamp'],'message':item['message'],'service':data.get('logGroup',''),'host':data.get('logStream','')}\n        length=len(json.dumps(record,separators=(',',':')).encode())\n        if length>65536:raise ValueError('cloudwatch_record_limit')\n        if records and (len(records)>=1000 or size+length>900000):batches.append(records);records=[];size=0\n        records.append(record);size+=length\n    if records:batches.append(records)\n    return batches\n\ndef handler(event, context):\n    batches=split_event(event)\n    if not batches:return {'accepted':0}\n    token=boto3.client('secretsmanager').get_secret_value(SecretId=os.environ['METRIBEACON_LOG_SECRET_ARN'])['SecretString'].strip()\n    if not token.startswith('mbg_'):raise ValueError('invalid_log_key')\n    accepted=0\n    for records in batches:\n        raw=json.dumps(records,separators=(',',':')).encode()\n        request=Request('https://metribeacon.com/api/v1/logs/integrations/cloudwatch',data=raw,headers={'Authorization':'Bearer '+token,'Content-Type':'application/json'},method='POST')\n        try:\n            with build_opener(NoRedirect()).open(request,timeout=10) as response:\n                if response.status not in (200,202):raise ValueError('log_ingest_unconfirmed')\n        except Exception:\n            raise ValueError('log_ingest_unconfirmed') from None\n        accepted+=len(records)\n    return {'accepted':accepted}\n"
        }
      }
    },
    "InvokeFromLogs": {
      "Type": "AWS::Lambda::Permission",
      "Properties": {
        "Action": "lambda:InvokeFunction",
        "FunctionName": {
          "Ref": "Forwarder"
        },
        "Principal": {
          "Fn::Sub": "logs.${AWS::Region}.amazonaws.com"
        },
        "SourceAccount": {
          "Ref": "AWS::AccountId"
        },
        "SourceArn": {
          "Fn::Sub": "arn:${AWS::Partition}:logs:${AWS::Region}:${AWS::AccountId}:log-group:${SourceLogGroup}:*"
        }
      }
    },
    "Subscription": {
      "Type": "AWS::Logs::SubscriptionFilter",
      "DependsOn": "InvokeFromLogs",
      "Properties": {
        "DestinationArn": {
          "Fn::GetAtt": [
            "Forwarder",
            "Arn"
          ]
        },
        "FilterPattern": "",
        "LogGroupName": {
          "Ref": "SourceLogGroup"
        }
      }
    }
  },
  "Outputs": {
    "ForwarderArn": {
      "Value": {
        "Fn::GetAtt": [
          "Forwarder",
          "Arn"
        ]
      }
    }
  }
}

Supabase

Geben Sie Supabase frei, wählen Sie das Projekt und verbinden Sie es. MetriBeacon erstellt den HTTP-Log-Drain mit geschützter Authentifizierung. Fremde Drains bleiben erhalten; Supabase-Tarifanforderungen und Zusatzkosten gelten weiterhin.

Netlify

Wählen Sie bei Netlify einen General-HTTP-Log-Drain. Verwenden Sie JSON oder NDJSON und hinterlegen Sie Authorization: Bearer mit dem Quellenschlüssel. Prüfen Sie einen Funktions- oder Request-Logeintrag in MetriBeacon. Netlifys Grenzen und Enterprise-Zugangsbedingungen gelten bereits vor der Lieferung.