Skip to content
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -401,6 +401,38 @@ jobs:
if: failure()
run: ./scripts/ci-diagnostics.sh

# This will be replaced once #6945 is merged.
swiftybeaver-integration-unit-tests:
name: SentrySwiftyBeaver Unit Tests
if: needs.files-changed.outputs.run_unit_tests_for_prs == 'true'
needs: files-changed
runs-on: macos-15
steps:
- uses: actions/checkout@v6

- name: Select Xcode
run: ./scripts/ci-select-xcode.sh 16.4

- name: Setup local sentry-cocoa dependency
working-directory: 3rd-party-integrations/SentrySwiftyBeaver
run: swift package edit sentry-cocoa --path ../..

- name: Run SwiftyBeaver tests
working-directory: 3rd-party-integrations/SentrySwiftyBeaver
run: swift test

- name: Archiving Raw Logs
uses: actions/upload-artifact@v5
if: ${{ failure() || cancelled() }}
with:
name: raw-output-swiftybeaver-integration
path: |
3rd-party-integrations/SentrySwiftyBeaver/.build/**/*.log

- name: Run CI Diagnostics
if: failure()
run: ./scripts/ci-diagnostics.sh

# This check validates that either all unit tests passed or were skipped, which allows us
# to make unit tests a required check with only running the unit tests when required.
# So, we don't have to run unit tests, for example, for Changelog or ReadMe changes.
Expand Down
100 changes: 100 additions & 0 deletions 3rd-party-integrations/SentrySwiftyBeaver/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
# --- macOS ---

# General
.DS_Store
__MACOSX/
.AppleDouble
.LSOverride
Icon[]

# Thumbnails
._*

# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent

# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk

# --- Swift ---

# Xcode
#
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore

## User settings
xcuserdata/

## Obj-C/Swift specific
*.hmap

## App packaging
*.ipa
*.dSYM.zip
*.dSYM

## Playgrounds
timeline.xctimeline
playground.xcworkspace

# Swift Package Manager
#
# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
# Packages/
# Package.pins
# Package.resolved
# *.xcodeproj
#
# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata
# hence it is not needed unless you have added a package configuration file to your project
# .swiftpm

.build/

# CocoaPods
#
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
#
# Pods/
#
# Add this line if you want to avoid checking in source code from the Xcode workspace
# *.xcworkspace

# Carthage
#
# Add this line if you want to avoid checking in source code from Carthage dependencies.
# Carthage/Checkouts

Carthage/Build/

# fastlane
#
# It is recommended to not store the screenshots in the git repo.
# Instead, use fastlane to re-generate the screenshots whenever they are needed.
# For more information about the recommended setup visit:
# https://docs.fastlane.tools/best-practices/source-control/#source-control

fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots/**/*.png
fastlane/test_output

# --- Xcode ---

## User settings
xcuserdata/

# Archive
*.xcarchive
34 changes: 34 additions & 0 deletions 3rd-party-integrations/SentrySwiftyBeaver/Package.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// swift-tools-version:6.0
import PackageDescription

let package = Package(
name: "SentrySwiftyBeaver",
platforms: [.iOS(.v15), .macOS(.v10_14), .tvOS(.v15), .watchOS(.v8), .visionOS(.v1)],
products: [
.library(
name: "SentrySwiftyBeaver",
targets: ["SentrySwiftyBeaver"]
)
],
dependencies: [
.package(url: "https://github.com/getsentry/sentry-cocoa", from: "9.0.0"),
.package(url: "https://github.com/SwiftyBeaver/SwiftyBeaver.git", from: "2.0.0")
],
targets: [
.target(
name: "SentrySwiftyBeaver",
dependencies: [
.product(name: "Sentry", package: "sentry-cocoa"),
.product(name: "SwiftyBeaver", package: "SwiftyBeaver")
]
),
.testTarget(
name: "SentrySwiftyBeaverTests",
dependencies: [
"SentrySwiftyBeaver",
.product(name: "Sentry", package: "sentry-cocoa"),
.product(name: "SwiftyBeaver", package: "SwiftyBeaver")
]
)
]
)
116 changes: 116 additions & 0 deletions 3rd-party-integrations/SentrySwiftyBeaver/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
# Sentry SwiftyBeaver Integration

A [SwiftyBeaver](https://github.com/SwiftyBeaver/SwiftyBeaver) destination that forwards log entries to Sentry's structured logging system, automatically capturing application logs with full context including metadata, source location, and log levels.

> [!NOTE]
> This repo is a mirror of [github.com/getsentry/sentry-cocoa](https://github.com/getsentry/sentry-cocoa). The source code lives in `3rd-party-integrations/SentrySwiftyBeaver/`. This allows users to import only what they need via SPM while keeping all integration code in the main repository.

## Installation

### Swift Package Manager

Add the following dependencies to your `Package.swift` or Xcode package dependencies:

```swift
dependencies: [
.package(url: "https://github.com/getsentry/sentry-cocoa-swiftybeaver", from: "1.0.0")
]
```

## Quick Start

```swift
import Sentry
import SwiftyBeaver

SentrySDK.start { options in
options.dsn = "YOUR_DSN"
options.logsEnabled = true
}

let log = SwiftyBeaver.self
let sentryDestination = SentryDestination()
log.addDestination(sentryDestination)

log.info("User logged in", context: ["userId": "12345", "sessionId": "abc"])
```

## Configuration

### Log Level Threshold

SwiftyBeaver automatically filters log messages based on each destination's `minLevel` property. Set `minLevel` to control which messages are sent to Sentry.

```swift
let sentryDestination = SentryDestination()
sentryDestination.minLevel = .error
log.addDestination(sentryDestination)
```

## Log Level Mapping

SwiftyBeaver levels are automatically mapped to Sentry log levels:

| SwiftyBeaver Level | Sentry Log Level |
| ------------------ | ---------------- |
| `.verbose` | `.trace` |
| `.debug` | `.debug` |
| `.info` | `.info` |
| `.warning` | `.warn` |
| `.error` | `.error` |
| `.critical` | `.fatal` |
| `.fault` | `.fatal` |

## Context Handling

The destination supports SwiftyBeaver's `context` parameter for additional metadata:

### Dictionary Context

When `context` is provided as a `[String: Any]` dictionary, each key-value pair is added as an individual Sentry log attribute with the prefix `swiftybeaver.context.{key}`.

```swift
log.info("User action", context: [
"userId": "12345",
"action": "purchase",
"isActive": true,
"errorCode": 500,
"amount": 99.99
])
```

Supported types in dictionary context:

- Strings
- Numbers (Int, Double, Float)
- Booleans
- Arrays (converted to string representation)

### Non-Dictionary Context

For non-dictionary contexts, the entire context is converted to a string attribute `swiftybeaver.context`.

```swift
log.info("Test message", context: "simple string context")
```

## Automatic Attributes

The destination automatically includes the following attributes with every log entry:

- `sentry.origin`: `"auto.logging.swiftybeaver"`
- `swiftybeaver.level`: The original SwiftyBeaver level (as raw value)
- `swiftybeaver.thread`: The thread identifier
- `swiftybeaver.file`: The source file name
- `swiftybeaver.function`: The function name
- `swiftybeaver.line`: The line number

## Documentation

- [Sentry Cocoa SDK Documentation](https://docs.sentry.io/platforms/apple/)
- [Sentry Logs Documentation](https://docs.sentry.io/platforms/apple/logs/)
- [SwiftyBeaver Repo](https://github.com/SwiftyBeaver/SwiftyBeaver)

## License

This integration follows the same license as the Sentry Cocoa SDK. See the [LICENSE](https://github.com/getsentry/sentry-cocoa/blob/main/LICENSE.md) file for details.
Loading
Loading