Ingesting Logs from GitHub CI

Forward build status and step output from GitHub Actions to your BunnyLogs stream using plain curl — no extra dependencies required.

How it works

Each workflow step can POST messages directly to your logspace's HTTP endpoint. Store your logspace UUID as a GitHub Actions secret so it is never exposed in your repository.

Setup
  1. Copy your logspace UUID from the stream URL (https://bunnylogs.com/live/<uuid>).
  2. In your GitHub repository go to Settings → Secrets and variables → Actions and create a secret named BL_UUID.
  3. Add curl steps to your workflow (see examples below).
Example — pass/fail notification

A single step at the end of the job reports the final outcome:

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Run tests
        run: npm test

      - name: Notify BunnyLogs
        if: always()
        run: |
          curl -s \
            -d "message=Build ${{ job.status }}: ${{ github.workflow }} (${{ github.ref_name }})" \
            -d "level=${{ job.status == 'success' && 'INFO' || 'ERROR' }}" \
            -d "program=github/${{ github.repository }}" \
            https://bunnylogs.com/live/${{ secrets.BL_UUID }}
Example — stream step output line by line

Capture a step's output with tee and forward each line as a separate log entry:

      - name: Run tests
        run: npm test 2>&1 | tee /tmp/test.log

      - name: Ship test output to BunnyLogs
        if: always()
        run: |
          while IFS= read -r line; do
            curl -s \
              -d "message=$line" \
              -d "level=INFO" \
              -d "program=github/tests" \
              https://bunnylogs.com/live/${{ secrets.BL_UUID }}
          done < /tmp/test.log
Example — start + finish bookends

Post at the beginning and end of the job to make it easy to spot where each run begins in the log stream:

      - name: Notify start
        run: |
          curl -s \
            -d "message=Started: ${{ github.workflow }} @ ${{ github.sha }}" \
            -d "level=INFO" \
            -d "program=github/${{ github.repository }}" \
            https://bunnylogs.com/live/${{ secrets.BL_UUID }}

      # ... your build steps ...

      - name: Notify result
        if: always()
        run: |
          curl -s \
            -d "message=Finished (${{ job.status }}): ${{ github.workflow }}" \
            -d "level=${{ job.status == 'success' && 'INFO' || 'ERROR' }}" \
            -d "program=github/${{ github.repository }}" \
            https://bunnylogs.com/live/${{ secrets.BL_UUID }}
Field mapping
BunnyLogs fieldRecommended value
messageBuild status or captured log line
programgithub/<owner>/<repo>
levelINFO on success, ERROR on failure
timestampOmit — defaults to server receipt time
Notes
  • Always use if: always() on notification steps so they run even when earlier steps fail.
  • The -s flag on curl suppresses progress output so it does not clutter the Actions log.
  • Streaming line-by-line output with while read makes each line individually searchable in BunnyLogs.
  • You can use the same UUID across multiple repositories or workflows — use the program field to distinguish sources.
  • Set up an Alert in BunnyLogs matching level=ERROR and program contains github/ to get notified on build failures via Slack, Telegram, or Discord.