لاگگیری با SDK iOS
لاگگیری ساختیافته برای اپهای iOS با ارسال دستهای خودکار، backoff نمایی و آگاهی از چرخهی عمر اپ، با SDK بومی Swift.
لاگگیری ساختیافته برای اپهای iOS با ارسال دستهای خودکار، backoff نمایی و آگاهی از چرخهی عمر اپ. لاگها بافر میشوند و دستهدسته فرستاده میشوند تا مصرف شبکه و باتری کم بماند.
لاگها بافر میشوند و دستهدسته فرستاده میشوند (پیشفرض: ۵۰)
دستههای ناموفق با تأخیرهای رو به افزایش دوباره فرستاده میشوند (۲ ثانیه، ۴ ثانیه، ۸ ثانیه... تا ۶۰ ثانیه، حداکثر ۱۰ بار)
لاگها فقط در حافظه بافر میشوند (enableOfflineStorage برای خطاهاست، نه لاگها)؛ وقتی بافر از ۱۰۰۰ بیشتر شود، قدیمیترینها دور ریخته میشوند
تایمر فقط وقتی بافر لاگ دارد اجرا میشود — در حالت بیکار باتری مصرف نمیشود
شناسهی کاربری که با AbrovaTrace.shared.setUserId() تنظیم شده، خودکار پیوست میشود
با Swift ساخته شده و از iOS 12+، macOS 10.14+ و tvOS 12+ پشتیبانی میکند
فعال کردن لاگگیری#
پس از مقداردهی AbrovaTrace، سرویس لاگگیری را فعال کنید. (اگر بدون فعال کردن، یکی از متدهای لاگ را صدا بزنید، لاگگیری خودکار و بدون sourceId روشن میشود.) لاگها در کنسول زیر ابرووا تریس › Logs نمایش داده میشوند؛ اینها از captureMessage جدا هستند که به پیامها میرود.
UIKit
import UIKit
import AbrovaTrace
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Initialize AbrovaTrace first
let config = AbrovaTraceConfigBuilder(apiKey: "ab_live_YOUR_API_KEY")
.environment("production")
.release(Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String)
.build()
AbrovaTrace.shared.initialize(config: config)
// Enable logging with a source identifier
AbrovaTrace.shared.enableLogging(
sourceId: "my-ios-app",
sourceName: "My iOS App",
batchSize: 50,
flushInterval: 5.0
)
return true
}
}SwiftUI
import SwiftUI
import AbrovaTrace
@main
struct MyApp: App {
init() {
let config = AbrovaTraceConfigBuilder(apiKey: "ab_live_YOUR_API_KEY")
.environment("production")
.build()
AbrovaTrace.shared.initialize(config: config)
// Enable logging
AbrovaTrace.shared.enableLogging(
sourceId: "my-ios-app",
sourceName: "My iOS App"
)
}
var body: some Scene {
WindowGroup {
ContentView()
}
}
}ارسال لاگ#
متدهای میانبر
// Info log
AbrovaTrace.shared.info("User login successful", metadata: [
"user_id": "user_123"
])
// Warning log
AbrovaTrace.shared.warn("Slow API response", metadata: [
"endpoint": "/api/users",
"duration_ms": 2500
])
// Error log
AbrovaTrace.shared.logErrorMessage("Database query failed", metadata: [
"query": "SELECT * FROM users",
"error": "Connection timeout"
])
// Debug log
AbrovaTrace.shared.logDebugMessage("Cache hit for key: user_123")
// Trace log
AbrovaTrace.shared.trace("Entering function processPayment()")
// Fatal log
AbrovaTrace.shared.fatal("App crashed unexpectedly", metadata: [
"last_screen": "checkout"
])متد عمومی log
// Generic log with explicit level
AbrovaTrace.shared.log("Custom event", level: .info, metadata: ["key": "value"])سطحهای لاگ#
- trace —
AbrovaTrace.shared.trace()— دیباگ بسیار جزئی در سطح trace - debug —
AbrovaTrace.shared.logDebugMessage()— اطلاعات دیباگ در زمان توسعه - info —
AbrovaTrace.shared.info()— اطلاعات عمومی اپ - warn —
AbrovaTrace.shared.warn()— هشدار دربارهی مشکلهای احتمالی - error —
AbrovaTrace.shared.logErrorMessage()— خطاهایی که باید بررسی شوند - fatal —
AbrovaTrace.shared.fatal()— خطاهای بحرانی یا غیرقابل بازیابی
استفاده در ViewControllerها#
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
AbrovaTrace.shared.info("ViewController loaded", metadata: ["screen": "main"])
}
func handlePurchase() {
AbrovaTrace.shared.info("Purchase initiated", metadata: [
"product_id": "premium_pack",
"amount": 99.99
])
do {
try processPurchase()
AbrovaTrace.shared.info("Purchase completed", metadata: ["amount": 99.99])
} catch {
AbrovaTrace.shared.logErrorMessage("Purchase failed", metadata: [
"error": error.localizedDescription,
"product_id": "premium_pack"
])
AbrovaTrace.shared.captureError(error)
}
}
func processPurchase() throws { /* ... */ }
}ویوهای SwiftUI
struct ContentView: View {
var body: some View {
Button("Purchase") {
AbrovaTrace.shared.info("Purchase button tapped")
handlePurchase()
}
.onAppear {
AbrovaTrace.shared.info("ContentView appeared")
}
}
func handlePurchase() {
// Purchase logic with logging
}
}عملیات دستی#
// Force flush all buffered logs
AbrovaTrace.shared.flushLogs { success in
if success {
print("Logs flushed successfully")
}
}
// Check buffer status
let pendingCount = AbrovaTrace.shared.pendingLogCount
print("Pending logs: \(pendingCount)")پیکربندی#
| گزینه | نوع | اجباری | توضیح |
|---|---|---|---|
| sourceId | String? | خیر | شناسه برای ارسال دستهای (مثلاً "my-ios-app"). بدون آن، هر لاگ بافرشده با یک درخواست جدا فرستاده میشود و ارسالهای ناموفق دوباره تکرار نمیشوند |
| sourceName | String? | خیر | نام خوانا برای این منبع |
| batchSize | Int | خیر | وقتی بافر به این اندازه برسد، ارسال انجام میشود (پیشفرض: 50) |
| flushInterval | TimeInterval | خیر | حداکثر زمان پیش از ارسال، به ثانیه (پیشفرض: 5.0) |
بهترین روشها#
لاگگیری را درست بعد از مقداردهی AbrovaTrace فعال کنید تا همهی رویدادها ثبت شوند
یک sourceId معنادار بگذارید تا لاگهای این اپ در داشبورد قابل تشخیص باشند
metadata ساختیافته (شناسهی کاربر، نام صفحه و…) اضافه کنید تا دیباگ سادهتر شود
برای رویدادهای عادی info، برای مشکلهای احتمالی warn و برای شکستها error
لاگها وقتی اپ به پسزمینه میرود و هنگام terminate خودکار فرستاده میشوند؛ برای مسیرهای دیگرِ بسته شدن، AbrovaTrace.shared.flushLogs() را صدا بزنید
در حلقههای فشرده لاگ نگیرید — بافر سقف دارد و قدیمیترین لاگها را دور میریزد