The app stops on the breakpoint when "All Runtime Issues" is added. If I disable the breakpoint, the app runs normally. Is there a new project setting to avoid this breakpoint from being set. It does not appear to be a valid error. I am running Xcode 16.2. I edited the "Type" field in the breakpoint box. This occurs with the "System Frameworks" option only.
OSLog
RSS for tagOSLog is a unified logging system for the reading of historical data.
Posts under OSLog tag
36 Posts
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
Hi there!
Sorry in advance, this is going to be a long post of Apple developer pains which I want to share with you, and, hopefully, find the answer and help Apple become better.
I'm at the very beginning of my new and exciting personal project which (I hope) may one day feed me and be my daily source of inspiration. I'm not a newbie in Apple development nor am I a senior-level developer — just a fellow developa'.
Here's the problem I bring to you — why Apple promotes Unified Logging System and recommends using it as the primary way to implement logging in 3rd-party apps? No doubt, OSLog is a great, secure, efficient, and centralized way to gather diagnostics information, and I, starting my new project, am itching to choose exactly this 1st-party logging infrastructure. This decision in theory has a number of benefits:
I don't have to depend on 3rd-party logging frameworks which may eventually be discontinued;
I have extensive documentation, great WWDC sessions explaining how to use the framework, and stackoverflow answers from the whole Apple dev community in case I experience any troubles;
I have this cool Console.app and upcoming Xcode 15 tools with great visualization and filtering of my logs;
It's quite a robust and stable infrastructure which I may restfully rely on.
But... the thing is there's this big elephant in the room — this API is non-customizable, inconvenient, and hard to use in terms of the app architecture. I can't write my own protocol wrapper around it to abstract my domain logic from implementation details or just simplify the usage at the call site. I can't configure my own format for log messages (this is debatable, since Console.app doesn't provide "naked strings" as Xcode 14 and earlier, but still). And what's most important — I can't conveniently retrieve the logs!
I can't implement the functionality where my user just taps the button, and the logs are sent on the background queue to my support email (eskimo's answer). They would have to go through this monstrous procedure of holding volume buttons on the iPhone, connecting their device to the Mac, gathering sysdiagnose, entering some weird Terminal commands (jeez, these nerdy developers...), etc. If it ever succeeds, of course, and something doesn't go wrong, leaving my user angry and dissatisfied with my app.
Regarding the protocol wrapper, I can't do something like this:
protocol Logging {
var logger: Logger { get }
func info(_ message: OSLogMessage)
}
extension Logging {
var logger: Logger {
return Logger(
subsystem: "com.my.bundle.id",
category: String(describing: Self.self)
)
}
func info(_ message: OSLogMessage) {
logger.info(message)
}
}
class MyClass: Logging {
func someImportantMethod() {
// ...
self.info("Some useful debug info: \(someVar, privacy: .public)")
}
}
I've been investigating this topic for 2 days, and it's the farthest I want to go in beating my head over how to do two simple things:
How to isolate logging framework implementation decision from my main code and write convenience wrappers?
How to easily transfer the log files from the user to the developer?
And I'm not the only one struggling. Here's just one example among hundreds of other questions that are being asked on dev forums: https://www.hackingwithswift.com/forums/ios/unified-logging-system-retrieve-logs-on-device/838. I've read almost all Apple docs which describe the modern Unified Logging System, I've read through eskimo's thread on Apple Developer Forum about the API, but I still haven't found the answer.
Maybe, I've misperceived this framework and it's not the tool I'm searching for? Maybe, it focuses on different aspects of logging, e.g. signposting, rather than logging the current state of the app? What am I missing?
import SwiftUI
import OsLog
let logger = Logger(subsystem: "Test", category: "Test")
struct ContentView: View {
var body: some View {
VStack {
Image(systemName: "globe")
.imageScale(.large)
.foregroundStyle(.tint)
Text("Hello, world!")
}
.padding()
.task {
logger.info("Hallo")
}
}
}
#Preview {
ContentView()
}
27 | .padding()
28 | .task {
29 | logger.info(__designTimeString("#6734_2", fallback: "Hallo"))
| `- error: argument must be a string interpolation
30 | }
31 | }
Should OsLog be compatible with __designTimeString?
Background
I have a SwiftUI app that uses OSLog and the new Logger framework. In my SwiftUI views, I would like to use something like Self._logChanges() to help debug issues.
After some trial and error, I can see the messages appear in the System console log for the app I am debugging using the com.apple.SwiftUI subsystem.
Problem
I'd like to see those same messages directly in Xcode's console window so I can filter them as needed. How do I do that?
Thanks! -Patrick
Hi,
Our team is facing an issue where the os log message is not fully printed in the Xcode console. Even when using Debug → Attach to Process by PID or Name, the logs appear truncated (Both simulator and physical device).
We noticed that the Xcode 15.0 release notes we saw that there is some truncation made for debug lines in console. We also tried checking the logs using Console.app, but the truncation remains.
If limitation is there how much maximum lines it can print ?
Could anyone please provide guidance on how we can view the complete logs? Any suggestions or workarounds would be highly appreciated.
I'd like to give control to the app developer that uses my library to select which level of logs they'd like to see from my lib (e.g. do they want to see all debug messages or just errors).
I know there are filtering controls that Xcode gives us, but I'm wondering if there is a way to pull this off with code. Ideally the user callsite would look like MyLib(logLevel: .info).
And then I would pass that info level somehow to OSLog. Today, I create my logger like this:
let myLogger = Logger(
subsystem: Bundle.main.bundleIdentifier ?? "UnknownApp",
category: "MyLibrary"
)
As far as I can tell, there is nothing I can then pass to my myLogger instance to configure the threshold level. I'm imagining an interface like:
myLogger.logLevel(.warning)
// Later...
myLogger.debug("You won't see this")
myLogger.error("But you will see this")
Does OSLog and friends give us any ability to do this out of the box, or are we building little wrappers around OSLog to accomplish this?
Thank you,
Lou
I was using os_log in my code and in header of oslog, it has been mentioned that there is physical cap of 1024 bytes per log line for dynamic content. So I was looking for a work around but before that I am not able see the truncation when I tried creating this issue.
let baseString = String(repeating: "a", count: 1020)
let criticalMarker = "LAST_5_BYTES"
let testString = baseString + criticalMarker // 1020 + 12 = 1032 bytes
os_log("LONG_STRING: %@", testString)
I used this as a sample code to check the truncation but in Xcode debugger it logs all the 1020 bytes and the last 12 bytes as well. I even checked the console and there also it was logging all the bytes.
Can anyone help me with this as to what I am missing here?
Hello,
I am a student studying accessibility.
I aim to analyze the smartphone usage patterns of visually impaired individuals.
Therefore, I would like to log the VoiceOver usage records of visually impaired iPhone users.
Is there a way to output VoiceOver logs, similar to the AccessibilityService API on Android?
Thank you in advance for your responses.
Is it just me or does running SwiftUI apps using Xcode 16 give so many warnings and errors in the console that it's impossible to debug everything? Even the simplest gestures such as a long press generate a warning. I'm starting to ignore them, which feels negligent. Any insights/tips?
When I set the option parameter to OSLogEnumeratorReverse, the iteration order of OSLogEnumerator is still from front to back in time
When I set the options parameter to 0 and the position parameter to the first 5 seconds of the current time, OSLogEnumerator can still iterate over the previous 5 seconds
#import "ViewController.h"
#import <OSLog/OSLog.h>
@interface ViewController ()
@property(strong, nonatomic)OSLogStore *logStore;
@property(strong, nonatomic)NSDateFormatter *formatter;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSError *err = nil;
self.logStore = [OSLogStore storeWithScope:OSLogStoreCurrentProcessIdentifier error:&err];
if (!self.logStore || err) {
NSLog(@"error: %@", err);
NSAssert(0, @"");
}
self.formatter = [[NSDateFormatter alloc] init];
[self.formatter setDateFormat:@"[yyyy-MM-dd HH:mm:ss:SSS]"];
}
- (IBAction)addLog:(id)sender {
static int i = 0;
NSLog(@"[test] %@ this is a log with index:%d", [self.formatter stringFromDate:[NSDate date]], i++);
}
- (IBAction)printLogWithReverse:(id)sender {
NSError *err = nil;
NSPredicate *preeicate = [NSPredicate predicateWithFormat:@"composedMessage contains %@" argumentArray:@[@"[test]"]];
OSLogEnumerator *enumer = [self.logStore entriesEnumeratorWithOptions:OSLogEnumeratorReverse position:nil predicate:preeicate error:&err];
if (err) {
NSLog(@"enumer error:%@", err);
NSAssert(0, @"");
}
OSLogEntryLog *entry = nil;
while (entry = [enumer nextObject]) {
NSString *message = [entry composedMessage];
printf("log: %s\n", message.UTF8String);
}
}
- (IBAction)printLogWithPosition:(id)sender {
NSError *err = nil;
NSPredicate *preeicate = [NSPredicate predicateWithFormat:@"composedMessage contains %@" argumentArray:@[@"[test]"]];
NSDate *posDate = [NSDate dateWithTimeIntervalSinceNow:-5];
OSLogPosition *pos = [self.logStore positionWithDate:posDate];
OSLogEnumerator *enumer = [self.logStore entriesEnumeratorWithOptions:0 position:pos predicate:preeicate error:&err];
if (err) {
NSLog(@"enumer error:%@", err);
NSAssert(0, @"");
}
const char *now = [self.formatter stringFromDate:[NSDate date]].UTF8String;
const char *posStart = [self.formatter stringFromDate:posDate].UTF8String;
OSLogEntryLog *entry = nil;
while (entry = [enumer nextObject]) {
NSString *message = [entry composedMessage];
printf("log(now:%s, pos:%s): %s\n", now, posStart, message.UTF8String);
}
}
@end
The method of - (IBAction)printLogWithReverse:(id)sender print result not reversed by time.
log: [test] [2025-02-18 17:35:50:175] this is a log with index:0
log: [test] [2025-02-18 17:35:51:040] this is a log with index:1
log: [test] [2025-02-18 17:35:51:174] this is a log with index:2
log: [test] [2025-02-18 17:35:51:323] this is a log with index:3
log: [test] [2025-02-18 17:35:51:473] this is a log with index:4
log: [test] [2025-02-18 17:35:51:640] this is a log with index:5
log: [test] [2025-02-18 17:35:51:773] this is a log with index:6
log: [test] [2025-02-18 17:35:51:923] this is a log with index:7
The method of - (IBAction)printLogWithPosition:(id) print result should not contain the log from 5 seconds ago because I set the start time position in the position argument
[test] [2025-02-18 17:43:58:741] this is a log with index:0
[test] [2025-02-18 17:43:58:940] this is a log with index:1
[test] [2025-02-18 17:43:59:458] this is a log with index:2
[test] [2025-02-18 17:43:59:923] this is a log with index:3
log(now:[2025-02-18 17:44:51:132], pos:[2025-02-18 17:44:46:032]): [test] [2025-02-18 17:43:58:741] this is a log with index:0
log(now:[2025-02-18 17:44:51:132], pos:[2025-02-18 17:44:46:032]): [test] [2025-02-18 17:43:58:940] this is a log with index:1
log(now:[2025-02-18 17:44:51:132], pos:[2025-02-18 17:44:46:032]): [test] [2025-02-18 17:43:59:458] this is a log with index:2
log(now:[2025-02-18 17:44:51:132], pos:[2025-02-18 17:44:46:032]): [test] [2025-02-18 17:43:59:923] this is a log with index:3
Hello, I'm developing a Transparent Proxy and I noticed that the Network Extension Framework logs in the Unified Logging System when my profile receives a flow, its source application, its destination endpoint, and my profile's decision regarding that flow.
I worry that this may compromise the user's privacy. So is there a way that I can turn off these logs at least in Distribution Configurations?
Hello,
I'm seeing many errors like this in the Xcode debug console when I build and run my app:
ERROR: Unrecognized attribute string flag '?' in attribute string "T@"NSString",?,R,C" for property debugDescription
The app project makes heavy use of Logger(), and I suspect it is related to that logging in some way, but I haven't been able to narrow down the issue to specific log calls.
I have Category, Subsystem and Timestamp enabled in the Xcode console, but none of those are displayed for this output.
What causes this? Or how can I better narrow down the source?
Hi: Our group would like to forward logs from our Macs in our integration/production environments to a central server. I haven't found any good documentation for this yet.
Can anyone point me to a way to forward to a Graylog or syslog-based server?
We're not against cobbling together an app or script using "log stream" to send the info ourselves, but that seems extreme for what I'd think is a very common use case.
I have os_log statements in my app. With my phone connected to the Mac, when I run the app through XCode, open Console app, those logs are shown. However, when I'm launching the app on its own, those logs don't appear in Console (phone still connected).
Am I missing something very basic? Please help.
Hi,
I'm developing a multi-platform project in Windows, Mac and Linux. I am trying to create a wrapper class in Go that will query system information and history.
I see that the Unified Logging System is a sophisticated way to get all sorts of kernel information (and even a long history including rotated logs). However, I am struggling to see how I can use the APIs in other languages aside from Swift itself (or C). I do not want to use the log or last commands to query information in separate child processes in my project. I would like to simply query the database itself, similar to using OSLog in Swift.
If this is something that is entirely proprietary or not possible, let me know :)
I'm trying to diagnose an issue with a Message Filtering Extension not working.
The associated domain for the server is not currently publicly hosted, so the associated domains specified for the app are postpended with
?mode=developer
On application installation I filtered OS logging by the swcd process and saw this logged:
debug 08:40:01.125071-0800 swcd Skipping domain vz….qa….cl….ce….com?mode=developer because developer mode is disabled
But developer mode IS enabled on the phone (Settings/Privacy & Security/Developer Mode is set to On).
Therefore why is swcd saying developer mode is disabled?
Is the developer mode mentioned in the documentation not actually the Developer Mode in the iPhone's setting but something else?
That wouldn't appear to be the case because the documentation explicitly states
"Specifies that only devices in developer mode can access the domain."
Full Documentation: https://developer.apple.com/documentation/BundleResources/Entitlements/com.apple.developer.associated-domains
If you use a private web server, which is unreachable from the public internet, while developing your app, enable the alternate mode feature to bypass the CDN and connect directly to your server. To do this, add a query string to your associated domains entitlement, as shown in the following example:
:?mode=
developer
Specifies that only devices in developer mode can access the domain.
So I've:
turned developer mode on for the device
have added ?mode=developer to the domain
am building/running using a developer certificate.
But why does swcd log that developer mode is disabled?