27 Commits
Author SHA1 Message Date
acheronfail fae1ec38c9 version: 1.6.1 2021-10-20 19:46:10 +11:00
acheronfail fae121b59b chore: misc Xcode updates 2021-10-20 19:00:05 +11:00
acheronfail fae137a76c fix: get project building with new Xcode 2021-10-20 18:49:55 +11:00
acheronfail fae133c65c chore: carthage update 2021-10-20 19:58:17 +11:00
acheronfail fae18352f5 version: 1.6.0 2021-03-10 03:37:52 +11:00
acheronfail fae16445c4 fix: remove check for NSCarbonMenuWindow
Seems that it still works without it (at least on macOS 11.2.1)
2021-03-10 03:35:10 +11:00
acheronfail fae13868f1 feat: allow changing magnification with keyboard 2021-03-10 02:52:45 +11:00
acheronfail 711ebbef25 Merge pull request #35 from kawarimidoll/patch-1
docs: Fix installation instructions in README.md
2021-02-21 00:51:45 +00:00
カワリミ人形 10af3f23a2 docs: fix brew command
Calling brew cask install is disabled
2021-01-08 11:21:41 +09:00
acheronfail fae16ab44a version: 1.5.0 2020-12-31 20:58:19 +10:30
acheronfail fae10d9e77 chore: update carthage with new logger 2020-12-31 21:23:30 +10:30
acheronfail 5e2e12f68b Merge pull request #33 from adrianniebla/master 2020-12-31 10:43:58 +00:00
Adrian Niebla b1ff753bdd Uncommented log line 2020-12-28 23:24:03 -06:00
Adrian Niebla 102ffdc684 Replaced CleanroomLogger with CocoaLumberJack 2020-12-28 22:59:52 -06:00
acheronfail 86a2f2f84c tmp: remove CleanroomLogger use to publish a version compatible with arm64 2020-12-25 11:11:55 +10:30
acheronfail f24d24574a version: 1.4.1 2020-12-25 10:46:10 +10:30
acheronfail 79607cb9f8 chore: carthage update 2020-12-25 10:37:45 +10:30
acheronfail 76492143c9 Merge pull request #32 from adrianniebla/master 2020-12-25 00:05:36 +00:00
Adrian Niebla ee3890a10c Fixed focusMode position change [https://github.com/acheronfail/pixel-picker/issues/31] 2020-12-24 17:53:02 -06:00
Adrian Niebla ebeaf45d3a Fixed HSL color issue [https://github.com/acheronfail/pixel-picker/issues/27] 2020-12-24 17:40:42 -06:00
acheronfail 71f49f4b44 Merge pull request #28 from fabianlindfors/master
Add WCAG contrast level checker
2020-12-17 15:41:19 +11:00
fabianlindfors b6883556fa Update README with WCAG contrast level feature 2020-12-16 14:48:15 +01:00
fabianlindfors 37bb2ecb3b Comment contrast view setup 2020-06-06 15:10:26 +02:00
fabianlindfors 376db25ff5 Add contrast level indicator to picker
When enabled, a new label will show up in the picker detail view. The label will show the WCAG contrast level between the currently color and the previously picked one. The background color of the label is also the previously picked color to provide a visualization of the contrast.
2020-06-06 15:01:03 +02:00
fabianlindfors 5daf000339 Add helper method for calculating contrast ratio
Based on code from https://gist.github.com/ngquerol/23d6d5ebd051e18682badafa37e48442. The calculated contrast ratio can be passed to the WCAGLevel constructor to get the final contrast level.
2020-06-06 14:53:41 +02:00
fabianlindfors 6fbaa1a5d8 Add enum for WCAG levels 2020-06-06 14:53:28 +02:00
fabianlindfors 1ed7fb8cb6 Add setting to show WCAG level indicator 2020-06-06 14:38:15 +02:00
599 changed files with 136591 additions and 188 deletions
+1 -1
View File
@@ -9,4 +9,4 @@ github "SwiftyJSON/SwiftyJSON"
github "sindresorhus/LaunchAtLogin"
# Used for advanced logging features.
github "emaloney/CleanroomLogger" ~> 6.0.0
github "CocoaLumberjack/CocoaLumberjack"
+3 -3
View File
@@ -1,4 +1,4 @@
github "SwiftyJSON/SwiftyJSON" "5.0.0"
github "CocoaLumberjack/CocoaLumberjack" "3.7.2"
github "SwiftyJSON/SwiftyJSON" "5.0.1"
github "acheronfail/MASShortcut" "2.3.6-custom"
github "emaloney/CleanroomLogger" "6.0.2"
github "sindresorhus/LaunchAtLogin" "v2.5.0"
github "sindresorhus/LaunchAtLogin" "v4.2.0"
@@ -0,0 +1 @@
*.mdj binary
@@ -0,0 +1,42 @@
# Contributing to CocoaLumberjack
We want to make contributing to this project as easy and transparent as possible. Here are a few guidelines for making all our lives easier.
## Asking questions
We don't use GitHub as a support forum. For any usage questions that are not specific to the project itself, please ask on [Stack Overflow](https://stackoverflow.com/) instead. By doing so, you'll be more likely to quickly solve your problem, and you'll allow anyone else with the same question to find the answer. This also allows maintainers to focus on improving the project for others.
## Reporting Issues
A great way to contribute to the project is to send a detailed issue when you encounter an problem.
It is very important to check for the same problem or suggestion in the project's issue list first. If you find a match, just add a small comment there.
Doing this helps prioritize the most common problems and requests.
When reporting issues, please include the following:
- The platform name and version (e.g. iOS 8.1)
- The library version
- The integration method (e.g. CocoaPods/Carthage/manually)
- The version of Xcode you're using
- The full output of any stack trace or compiler error
- A small demo project that replicates the issue (especially if the way to reproduce the issue is not straight-forward)
- Any other details that would be useful in understanding the problem
This information will help us review and fix your issue faster.
Please do not be offended if we close your issue and reference this document.
If you believe the issue is truely a fault in the project’s codebase, re-open it.
## Pull Requests
We gladly accept any PR's assuming they are well written, documented ( if necessary ) and preferably have test code.
If you're unsure if we'll accept a new feature please open an issue requesting it and we can have a discussion before you code and submit a PR.
Checklist:
- Fork the repo and create your branch from the latest master (to minimize the conflicts)
- If you've added code that should be tested, add tests.
- If you've changed APIs, update the documentation.
- Ensure the test suite passes.
- Make sure your code lints (pod lib lint)
@@ -0,0 +1,23 @@
### New Issue Checklist
* [ ] I have read and understood the [CONTRIBUTING guide](https://github.com/CocoaLumberjack/CocoaLumberjack/blob/master/.github/CONTRIBUTING.md)
* [ ] I have read the [Documentation](https://github.com/CocoaLumberjack/CocoaLumberjack#documentation) or [CocoaDocs](cocoadocs.org/docsets/CocoaLumberjack)
* [ ] I have searched for a similar issue in the [project](https://github.com/CocoaLumberjack/CocoaLumberjack/issues) and found none
### Issue Info
Info | Value |
-------------------------|-------------------------------------|
Platform Name | e.g. ios / osx / tvos / watchos
Platform Version | e.g. 8.0
CocoaLumberjack Version | e.g. 2.3.0
Integration Method | e.g. carthage / cocoapods / manually
Xcode Version | e.g. Xcode 7.3
Repro rate | e.g. all the time (100%) / sometimes x% / only once
Demo project link | e.g. link to a demo project that highlights the issue
### Issue Description and Steps
Please fill in the detailed description of the issue (full textual output of any stack trace, compiler error, ...) and the steps to reproduce the issue.
Are you reporting a queue deadlock? If so, you must include a complete backtrace of all threads, which you can generate by typing `bt all` in the debugger after you hit the deadlock. Failure to do so will prevent us from helping you.
@@ -0,0 +1,18 @@
### New Pull Request Checklist
* [ ] I have read and understood the [CONTRIBUTING guide](https://github.com/CocoaLumberjack/CocoaLumberjack/blob/master/.github/CONTRIBUTING.md)
* [ ] I have read the [Documentation](http://cocoadocs.org/docsets/CocoaLumberjack/)
* [ ] I have searched for a similar pull request in the [project](https://github.com/CocoaLumberjack/CocoaLumberjack/pulls) and found none
* [ ] I have updated this branch with the latest master to avoid conflicts (via merge from master or rebase)
* [ ] I have added the required tests to prove the fix/feature I am adding
* [ ] I have updated the documentation (if necessary)
* [ ] I have run the tests and they pass
* [ ] I have run the lint and it passes (`pod lib lint`)
This merge request fixes / refers to the following issues: ...
### Pull Request Description
...
+21
View File
@@ -0,0 +1,21 @@
# Number of days of inactivity before an issue becomes stale
daysUntilStale: 60
# Number of days of inactivity before a stale issue is closed
daysUntilClose: 7
# Issues with these labels will never be considered stale
exemptLabels:
- Important
- Blocker
- Feature Request
- Good First Issue
# Label to use when marking an issue as stale
staleLabel: Stale
# Comment to post when marking an issue as stale. Set to `false` to disable
markComment: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs.
If this is still an issue, please make sure it is up to date and if so,
add a comment that this is still an issue to keep it open.
Thank you for your contributions.
# Comment to post when closing a stale issue. Set to `false` to disable
closeComment: false
@@ -0,0 +1,50 @@
name: Demo Builds
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
env:
LC_CTYPE: en_US.UTF-8
LANG: en_US.UTF-8
jobs:
build-demos:
runs-on: macos-latest
strategy:
matrix:
scheme:
- BenchmarkIPhone
- BenchmarkMac
- CLI
- CaptureASL
- ContextFilter
- CoreDataLogger
- CustomFormatters
- CustomLogLevels
- DispatchQueueLogger
- FineGrainedLogging
- GlobalLogLevel
- LogFileCompressor
- NonArcTest
- OverflowTestMac
- PerUserLogLevels
- RegisteredLoggingTest (Desktop)
- RegisteredLoggingTest (Mobile)
- RollingTestMac
- SQLiteLogger
- TestXcodeColors (Desktop)
- TextXcodeColors (Mobile)
- UniversalApp
- WebServerIPhone
steps:
- uses: actions/checkout@v2
- run: ./Scripts/ci-select-xcode.sh
- uses: sersoft-gmbh/xcodebuild-action@v1
with:
workspace: Demos/Demos.xcworkspace
scheme: ${{matrix.scheme}}
configuration: Release
action: build
@@ -0,0 +1,49 @@
name: Integration Tests
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
env:
LC_CTYPE: en_US.UTF-8
LANG: en_US.UTF-8
jobs:
static-lib:
runs-on: macos-latest
steps:
- uses: actions/checkout@v2
- run: ./Scripts/ci-select-xcode.sh
- uses: sersoft-gmbh/xcodebuild-action@v1
with:
project: Integration/Integration.xcodeproj
scheme: iOSStaticLibraryIntegration
configuration: Release
action: build
dynamic-lib:
runs-on: macos-latest
strategy:
matrix:
scheme:
- macOSSwiftIntegration
- iOSFrameworkIntegration
- tvOSSwiftIntegration
destination: ['']
include:
- scheme: watchOSSwiftIntegration
destination: 'platform=iOS Simulator,name=iPhone 11 Pro'
steps:
- uses: actions/checkout@v2
- run: ./Scripts/ci-select-xcode.sh
- uses: sersoft-gmbh/xcodebuild-action@v1
with:
project: Integration/Integration.xcodeproj
scheme: ${{matrix.scheme}}
configuration: Release
destination: ${{matrix.destination}}
action: build
# watchOS builds seems to fail as of Xcode 11.4...
continue-on-error: ${{matrix.scheme == 'watchOSSwiftIntegration'}}
@@ -0,0 +1,45 @@
name: Library Builds
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
env:
LC_CTYPE: en_US.UTF-8
LANG: en_US.UTF-8
jobs:
static-lib:
runs-on: macos-latest
strategy:
matrix:
sdk: [iphonesimulator, macosx]
steps:
- uses: actions/checkout@v2
- run: ./Scripts/ci-select-xcode.sh
- uses: sersoft-gmbh/xcodebuild-action@v1
with:
workspace: Xcode/Lumberjack.xcworkspace
scheme: CocoaLumberjack-Static
configuration: Release
sdk: ${{matrix.sdk}}
action: build
dynamic-lib:
runs-on: macos-latest
strategy:
matrix:
scheme: [CocoaLumberjack, CocoaLumberjackSwift]
sdk: [iphonesimulator, macosx, watchsimulator, appletvsimulator]
steps:
- uses: actions/checkout@v2
- run: ./Scripts/ci-select-xcode.sh
- uses: sersoft-gmbh/xcodebuild-action@v1
with:
workspace: Xcode/Lumberjack.xcworkspace
scheme: ${{matrix.scheme}}
configuration: Release
sdk: ${{matrix.sdk}}
action: build
@@ -0,0 +1,57 @@
name: Unit Tests
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
env:
LC_CTYPE: en_US.UTF-8
LANG: en_US.UTF-8
jobs:
swiftpm:
runs-on: macos-latest
steps:
- uses: actions/checkout@v2
- run: ./Scripts/ci-select-xcode.sh
- name: Run SwiftPM Tests
run: swift test --enable-code-coverage --parallel
- name: Generate Coverage Files
run: xcrun llvm-cov export -format="lcov" .build/debug/*PackageTests.xctest/Contents/MacOS/*PackageTests -instr-profile .build/debug/codecov/default.profdata > coverage.lcov
- uses: codecov/codecov-action@v1
with:
file: coverage.lcov
token: ${{secrets.CODECOV_TOKEN}}
xcode:
runs-on: macos-latest
strategy:
matrix:
scheme: [Swift Tests]
destination:
- platform=macOS
- platform=iOS Simulator,OS=latest,name=iPhone 11 Pro
skip-testing: ['']
include:
- scheme: iOS Tests
destination: 'platform=iOS Simulator,name=iPhone 11 Pro,OS=latest'
skip-testing: 'iOS Tests/DDFileLoggerPerformanceTests'
- scheme: OS X Tests
destination: 'platform=macosx'
skip-testing: 'OS X Tests/DDFileLoggerPerformanceTests'
steps:
- uses: actions/checkout@v2
- run: ./Scripts/ci-select-xcode.sh
- uses: sersoft-gmbh/xcodebuild-action@v1
with:
project: Tests/Tests.xcodeproj
scheme: ${{matrix.scheme}}
destination: ${{matrix.destination}}
skip-testing: ${{matrix.skip-testing}}
build-settings: GCC_GENERATE_TEST_COVERAGE_FILES=YES
action: test
- uses: codecov/codecov-action@v1
with:
token: ${{secrets.CODECOV_TOKEN}}
@@ -0,0 +1,68 @@
name: Validations
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
issue_comment:
types: [ created ]
env:
LC_CTYPE: en_US.UTF-8
LANG: en_US.UTF-8
jobs:
validate-cocoapods:
runs-on: macos-latest
if: github.event_name != 'issue_comment'
steps:
- uses: actions/checkout@v2
- run: ./Scripts/ci-select-xcode.sh
- run: pod lib lint
run-danger-for-internal-pr:
runs-on: ubuntu-latest
if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: danger/swift
uses: docker://frmeloni/danger-swift-with-swiftlint:1.3.1
env:
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
run-danger-for-external-pr:
runs-on: ubuntu-latest
if: |
github.event_name == 'issue_comment' && github.event.action == 'created'
&& github.event.issue.pull_request != null
&& startsWith(github.event.comment.body, '/run_checks')
steps:
- uses: sushichop/action-repository-permission@v1
with:
required-permission: write
reaction-permitted: '+1'
comment-not-permitted: "Sorry, you don't have enough permission to execute /run_checks..."
- uses: actions/github-script@v2
id: pr-details
with:
script: |
const { data: pullRequest } = await github.pulls.get({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: context.issue.number
});
return pullRequest;
- uses: actions/checkout@v2
with:
repository: ${{fromJSON(steps.pr-details.outputs.result).head.repo.full_name}}
ref: ${{fromJSON(steps.pr-details.outputs.result).head.ref}}
fetch-depth: 0
- name: danger/swift
uses: docker://frmeloni/danger-swift-with-swiftlint:1.3.1
with:
args: "--pr ${{github.event.issue.pull_request.url}}"
env:
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
@@ -0,0 +1,16 @@
# Xcode
#
.DS_Store
/.build
/.swiftpm
/Packages
/*.xcodeproj
xcuserdata/
!Lumberjack.xcodeproj
# Carthage
Carthage/Build
# Lumberjack generated files
LumberjackUser*.h
+13
View File
@@ -0,0 +1,13 @@
disabled_rules:
- line_length
- function_parameter_count
opt_in_rules:
- empty_count
- force_unwrapping
nesting:
type_level: 4
identifier_name:
allowed_symbols: "_"
@@ -0,0 +1,18 @@
//
// BaseNSLogging.h
// Benchmarking
//
// CocoaLumberjack Demos
//
#import <Foundation/Foundation.h>
@interface BaseNSLogging : NSObject
+ (void)speedTest0;
+ (void)speedTest1;
+ (void)speedTest2;
+ (void)speedTest3;
+ (void)speedTest4;
@end
@@ -0,0 +1,98 @@
//
// BaseNSLogging.m
// Benchmarking
//
// CocoaLumberjack Demos
//
#import "BaseNSLogging.h"
#import "PerformanceTesting.h"
#define DDLogVerbose NSLog
#define DDLogInfo NSLog
#define DDLogWarn NSLog
#define DDLogError NSLog
#define FILENAME @"BaseNSLogging " // Trailing space to match exactly the others in length
@implementation BaseNSLogging
+ (void)speedTest0
{
// Log statements that will not be executed due to log level
for (NSUInteger i = 0; i < SPEED_TEST_0_COUNT; i++)
{
DDLogVerbose(@"%@: SpeedTest0 - %lu", FILENAME, (unsigned long)i);
}
}
+ (void)speedTest1
{
// Log statements that will be executed asynchronously
for (NSUInteger i = 0; i < SPEED_TEST_1_COUNT; i++)
{
DDLogWarn(@"%@: SpeedTest1 - %lu", FILENAME, (unsigned long)i);
}
}
+ (void)speedTest2
{
// Log statements that will be executed synchronously
for (NSUInteger i = 0; i < SPEED_TEST_2_COUNT; i++)
{
DDLogError(@"%@: SpeedTest2 - %lu", FILENAME, (unsigned long)i);
}
}
+ (void)speedTest3
{
// Even Spread:
//
// 25% - Not executed due to log level
// 50% - Executed asynchronously
// 25% - Executed synchronously
for (NSUInteger i = 0; i < SPEED_TEST_3_COUNT; i++)
{
DDLogError(@"%@: SpeedTest3A - %lu", FILENAME, (unsigned long)i);
}
for (NSUInteger i = 0; i < SPEED_TEST_3_COUNT; i++)
{
DDLogWarn(@"%@: SpeedTest3B - %lu", FILENAME, (unsigned long)i);
}
for (NSUInteger i = 0; i < SPEED_TEST_3_COUNT; i++)
{
DDLogInfo(@"%@: SpeedTest3C - %lu", FILENAME, (unsigned long)i);
}
for (NSUInteger i = 0; i < SPEED_TEST_3_COUNT; i++)
{
DDLogVerbose(@"%@: SpeedTest3D - %lu", FILENAME, (unsigned long)i);
}
}
+ (void)speedTest4
{
// Custom Spread
for (NSUInteger i = 0; i < SPEED_TEST_4_ERROR_COUNT; i++)
{
DDLogError(@"%@: SpeedTest4A - %lu", FILENAME, (unsigned long)i);
}
for (NSUInteger i = 0; i < SPEED_TEST_4_WARN_COUNT; i++)
{
DDLogWarn(@"%@: SpeedTest4B - %lu", FILENAME, (unsigned long)i);
}
for (NSUInteger i = 0; i < SPEED_TEST_4_INFO_COUNT; i++)
{
DDLogInfo(@"%@: SpeedTest4C - %lu", FILENAME, (unsigned long)i);
}
for (NSUInteger i = 0; i < SPEED_TEST_4_VERBOSE_COUNT; i++)
{
DDLogVerbose(@"%@: SpeedTest4D - %lu", FILENAME, (unsigned long)i);
}
}
@end
@@ -0,0 +1,377 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 50;
objects = {
/* Begin PBXBuildFile section */
6ECBFD9521E99CD900CBB679 /* BaseNSLogging.m in Sources */ = {isa = PBXBuildFile; fileRef = 6ECBFD8D21E99CD800CBB679 /* BaseNSLogging.m */; };
6ECBFD9621E99CD900CBB679 /* StaticLogging.m in Sources */ = {isa = PBXBuildFile; fileRef = 6ECBFD8F21E99CD800CBB679 /* StaticLogging.m */; };
6ECBFD9721E99CD900CBB679 /* DynamicLogging.m in Sources */ = {isa = PBXBuildFile; fileRef = 6ECBFD9021E99CD900CBB679 /* DynamicLogging.m */; };
6ECBFD9821E99CD900CBB679 /* PerformanceTesting.m in Sources */ = {isa = PBXBuildFile; fileRef = 6ECBFD9221E99CD900CBB679 /* PerformanceTesting.m */; };
6ECBFD9A21E99CE400CBB679 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 6ECBFD9921E99CE400CBB679 /* main.m */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
6ECBFDA121E99D2A00CBB679 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 6ECBFD9B21E99D2A00CBB679 /* Lumberjack.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 18F3BFD71A81E06E00692297;
remoteInfo = "CocoaLumberjack-Static";
};
6ECBFDA321E99D2A00CBB679 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 6ECBFD9B21E99D2A00CBB679 /* Lumberjack.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 19FF46021B8B4CF400B43179;
remoteInfo = CocoaLumberjack;
};
6ECBFDA521E99D2A00CBB679 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 6ECBFD9B21E99D2A00CBB679 /* Lumberjack.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 19FF460F1B8B4D1400B43179;
remoteInfo = CocoaLumberjackSwift;
};
6ECBFDA721E99D3700CBB679 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 6ECBFD9B21E99D2A00CBB679 /* Lumberjack.xcodeproj */;
proxyType = 1;
remoteGlobalIDString = 19FF46011B8B4CF400B43179;
remoteInfo = CocoaLumberjack;
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
6ECBFD8121E99CA500CBB679 /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = /usr/share/man/man1/;
dstSubfolderSpec = 0;
files = (
);
runOnlyForDeploymentPostprocessing = 1;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
6ECBFD8321E99CA500CBB679 /* Benchmarking */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Benchmarking; sourceTree = BUILT_PRODUCTS_DIR; };
6ECBFD8D21E99CD800CBB679 /* BaseNSLogging.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BaseNSLogging.m; sourceTree = "<group>"; };
6ECBFD8E21E99CD800CBB679 /* StaticLogging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StaticLogging.h; sourceTree = "<group>"; };
6ECBFD8F21E99CD800CBB679 /* StaticLogging.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StaticLogging.m; sourceTree = "<group>"; };
6ECBFD9021E99CD900CBB679 /* DynamicLogging.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DynamicLogging.m; sourceTree = "<group>"; };
6ECBFD9121E99CD900CBB679 /* DynamicLogging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DynamicLogging.h; sourceTree = "<group>"; };
6ECBFD9221E99CD900CBB679 /* PerformanceTesting.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PerformanceTesting.m; sourceTree = "<group>"; };
6ECBFD9321E99CD900CBB679 /* PerformanceTesting.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PerformanceTesting.h; sourceTree = "<group>"; };
6ECBFD9421E99CD900CBB679 /* BaseNSLogging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BaseNSLogging.h; sourceTree = "<group>"; };
6ECBFD9921E99CE400CBB679 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
6ECBFD9B21E99D2A00CBB679 /* Lumberjack.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Lumberjack.xcodeproj; path = ../Lumberjack.xcodeproj; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
6ECBFD8021E99CA500CBB679 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
6ECBFD7A21E99CA500CBB679 = {
isa = PBXGroup;
children = (
6ECBFD9B21E99D2A00CBB679 /* Lumberjack.xcodeproj */,
6ECBFD9921E99CE400CBB679 /* main.m */,
6ECBFD9421E99CD900CBB679 /* BaseNSLogging.h */,
6ECBFD8D21E99CD800CBB679 /* BaseNSLogging.m */,
6ECBFD9121E99CD900CBB679 /* DynamicLogging.h */,
6ECBFD9021E99CD900CBB679 /* DynamicLogging.m */,
6ECBFD9321E99CD900CBB679 /* PerformanceTesting.h */,
6ECBFD9221E99CD900CBB679 /* PerformanceTesting.m */,
6ECBFD8E21E99CD800CBB679 /* StaticLogging.h */,
6ECBFD8F21E99CD800CBB679 /* StaticLogging.m */,
6ECBFD8421E99CA500CBB679 /* Products */,
);
sourceTree = "<group>";
};
6ECBFD8421E99CA500CBB679 /* Products */ = {
isa = PBXGroup;
children = (
6ECBFD8321E99CA500CBB679 /* Benchmarking */,
);
name = Products;
sourceTree = "<group>";
};
6ECBFD9C21E99D2A00CBB679 /* Products */ = {
isa = PBXGroup;
children = (
6ECBFDA221E99D2A00CBB679 /* libCocoaLumberjack.a */,
6ECBFDA421E99D2A00CBB679 /* CocoaLumberjack.framework */,
6ECBFDA621E99D2A00CBB679 /* CocoaLumberjackSwift.framework */,
);
name = Products;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
6ECBFD8221E99CA500CBB679 /* Benchmarking */ = {
isa = PBXNativeTarget;
buildConfigurationList = 6ECBFD8A21E99CA500CBB679 /* Build configuration list for PBXNativeTarget "Benchmarking" */;
buildPhases = (
6ECBFD7F21E99CA500CBB679 /* Sources */,
6ECBFD8021E99CA500CBB679 /* Frameworks */,
6ECBFD8121E99CA500CBB679 /* CopyFiles */,
);
buildRules = (
);
dependencies = (
6ECBFDA821E99D3700CBB679 /* PBXTargetDependency */,
);
name = Benchmarking;
productName = Benchmarking;
productReference = 6ECBFD8321E99CA500CBB679 /* Benchmarking */;
productType = "com.apple.product-type.tool";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
6ECBFD7B21E99CA500CBB679 /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 1010;
ORGANIZATIONNAME = CocoaLumberjack;
TargetAttributes = {
6ECBFD8221E99CA500CBB679 = {
CreatedOnToolsVersion = 10.1;
};
};
};
buildConfigurationList = 6ECBFD7E21E99CA500CBB679 /* Build configuration list for PBXProject "Benchmarking" */;
compatibilityVersion = "Xcode 9.3";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
);
mainGroup = 6ECBFD7A21E99CA500CBB679;
productRefGroup = 6ECBFD8421E99CA500CBB679 /* Products */;
projectDirPath = "";
projectReferences = (
{
ProductGroup = 6ECBFD9C21E99D2A00CBB679 /* Products */;
ProjectRef = 6ECBFD9B21E99D2A00CBB679 /* Lumberjack.xcodeproj */;
},
);
projectRoot = "";
targets = (
6ECBFD8221E99CA500CBB679 /* Benchmarking */,
);
};
/* End PBXProject section */
/* Begin PBXReferenceProxy section */
6ECBFDA221E99D2A00CBB679 /* libCocoaLumberjack.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libCocoaLumberjack.a;
remoteRef = 6ECBFDA121E99D2A00CBB679 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
6ECBFDA421E99D2A00CBB679 /* CocoaLumberjack.framework */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
path = CocoaLumberjack.framework;
remoteRef = 6ECBFDA321E99D2A00CBB679 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
6ECBFDA621E99D2A00CBB679 /* CocoaLumberjackSwift.framework */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
path = CocoaLumberjackSwift.framework;
remoteRef = 6ECBFDA521E99D2A00CBB679 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
/* End PBXReferenceProxy section */
/* Begin PBXSourcesBuildPhase section */
6ECBFD7F21E99CA500CBB679 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
6ECBFD9A21E99CE400CBB679 /* main.m in Sources */,
6ECBFD9521E99CD900CBB679 /* BaseNSLogging.m in Sources */,
6ECBFD9621E99CD900CBB679 /* StaticLogging.m in Sources */,
6ECBFD9721E99CD900CBB679 /* DynamicLogging.m in Sources */,
6ECBFD9821E99CD900CBB679 /* PerformanceTesting.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
6ECBFDA821E99D3700CBB679 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
name = CocoaLumberjack;
targetProxy = 6ECBFDA721E99D3700CBB679 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin XCBuildConfiguration section */
6ECBFD8821E99CA500CBB679 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "-";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.14;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = macosx;
};
name = Debug;
};
6ECBFD8921E99CA500CBB679 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "-";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.14;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = macosx;
};
name = Release;
};
6ECBFD8B21E99CA500CBB679 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Debug;
};
6ECBFD8C21E99CA500CBB679 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
6ECBFD7E21E99CA500CBB679 /* Build configuration list for PBXProject "Benchmarking" */ = {
isa = XCConfigurationList;
buildConfigurations = (
6ECBFD8821E99CA500CBB679 /* Debug */,
6ECBFD8921E99CA500CBB679 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
6ECBFD8A21E99CA500CBB679 /* Build configuration list for PBXNativeTarget "Benchmarking" */ = {
isa = XCConfigurationList;
buildConfigurations = (
6ECBFD8B21E99CA500CBB679 /* Debug */,
6ECBFD8C21E99CA500CBB679 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 6ECBFD7B21E99CA500CBB679 /* Project object */;
}
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>FILEHEADER</key>
<string>
// ___FILENAME___
// ___TARGETNAME___
//
// CocoaLumberjack Benchmarking
//</string>
</dict>
</plist>
@@ -0,0 +1,93 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1010"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "6ECBFD8221E99CA500CBB679"
BuildableName = "Benchmarking"
BlueprintName = "Benchmarking"
ReferencedContainer = "container:Benchmarking.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "6ECBFD8221E99CA500CBB679"
BuildableName = "Benchmarking"
BlueprintName = "Benchmarking"
ReferencedContainer = "container:Benchmarking.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
enableThreadSanitizer = "YES"
enableUBSanitizer = "YES"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "6ECBFD8221E99CA500CBB679"
BuildableName = "Benchmarking"
BlueprintName = "Benchmarking"
ReferencedContainer = "container:Benchmarking.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "6ECBFD8221E99CA500CBB679"
BuildableName = "Benchmarking"
BlueprintName = "Benchmarking"
ReferencedContainer = "container:Benchmarking.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
@@ -0,0 +1,18 @@
//
// DynamicLogging.h
// Benchmarking
//
// CocoaLumberjack Demos
//
#import <Foundation/Foundation.h>
@interface DynamicLogging : NSObject
+ (void)speedTest0;
+ (void)speedTest1;
+ (void)speedTest2;
+ (void)speedTest3;
+ (void)speedTest4;
@end
@@ -0,0 +1,107 @@
//
// DynamicLogging.m
// Benchmarking
//
// CocoaLumberjack Demos
//
#import "DynamicLogging.h"
#import "PerformanceTesting.h"
#import <CocoaLumberjack/CocoaLumberjack.h>
#define FILENAME @"DynamicLogging"
// Debug levels: off, error, warn, info, verbose
static DDLogLevel ddLogLevel = DDLogLevelWarning; // NOT CONST
@implementation DynamicLogging
+ (DDLogLevel)ddLogLevel
{
return ddLogLevel;
}
+ (void)ddSetLogLevel:(DDLogLevel)logLevel
{
ddLogLevel = logLevel;
}
+ (void)speedTest0
{
// Log statements that will not be executed due to log level
for (NSUInteger i = 0; i < SPEED_TEST_0_COUNT; i++)
{
DDLogVerbose(@"%@: SpeedTest0 - %lu", FILENAME, (unsigned long)i);
}
}
+ (void)speedTest1
{
// Log statements that will be executed asynchronously
for (NSUInteger i = 0; i < SPEED_TEST_1_COUNT; i++)
{
DDLogWarn(@"%@: SpeedTest1 - %lu", FILENAME, (unsigned long)i);
}
}
+ (void)speedTest2
{
// Log statements that will be executed synchronously
for (NSUInteger i = 0; i < SPEED_TEST_2_COUNT; i++)
{
DDLogError(@"%@: SpeedTest2 - %lu", FILENAME, (unsigned long)i);
}
}
+ (void)speedTest3
{
// Even Spread:
//
// 25% - Not executed due to log level
// 50% - Executed asynchronously
// 25% - Executed synchronously
for (NSUInteger i = 0; i < SPEED_TEST_3_COUNT; i++)
{
DDLogError(@"%@: SpeedTest3A - %lu", FILENAME, (unsigned long)i);
}
for (NSUInteger i = 0; i < SPEED_TEST_3_COUNT; i++)
{
DDLogWarn(@"%@: SpeedTest3B - %lu", FILENAME, (unsigned long)i);
}
for (NSUInteger i = 0; i < SPEED_TEST_3_COUNT; i++)
{
DDLogInfo(@"%@: SpeedTest3C - %lu", FILENAME, (unsigned long)i);
}
for (NSUInteger i = 0; i < SPEED_TEST_3_COUNT; i++)
{
DDLogVerbose(@"%@: SpeedTest3D - %lu", FILENAME, (unsigned long)i);
}
}
+ (void)speedTest4
{
// Custom Spread
for (NSUInteger i = 0; i < SPEED_TEST_4_ERROR_COUNT; i++)
{
DDLogError(@"%@: SpeedTest4A - %lu", FILENAME, (unsigned long)i);
}
for (NSUInteger i = 0; i < SPEED_TEST_4_WARN_COUNT; i++)
{
DDLogWarn(@"%@: SpeedTest4B - %lu", FILENAME, (unsigned long)i);
}
for (NSUInteger i = 0; i < SPEED_TEST_4_INFO_COUNT; i++)
{
DDLogInfo(@"%@: SpeedTest4C - %lu", FILENAME, (unsigned long)i);
}
for (NSUInteger i = 0; i < SPEED_TEST_4_VERBOSE_COUNT; i++)
{
DDLogVerbose(@"%@: SpeedTest4D - %lu", FILENAME, (unsigned long)i);
}
}
@end
@@ -0,0 +1,26 @@
//
// PerformanceTesting.h
// Benchmarking
//
// CocoaLumberjack Demos
//
#import <Foundation/Foundation.h>
#define SPEED_TEST_0_COUNT 1000 // Total log statements
#define SPEED_TEST_1_COUNT 1000 // Total log statements
#define SPEED_TEST_2_COUNT 1000 // Total log statements
#define SPEED_TEST_3_COUNT 250 // Per log level (multiply by 4 to get total)
#define SPEED_TEST_4_VERBOSE_COUNT 900
#define SPEED_TEST_4_INFO_COUNT 000
#define SPEED_TEST_4_WARN_COUNT 000
#define SPEED_TEST_4_ERROR_COUNT 100
// Further documentation on these tests may be found in the implementation file.
@interface PerformanceTesting : NSObject
+ (void)startPerformanceTests;
@end
@@ -0,0 +1,419 @@
//
// PerformanceTesting.m
// Benchmarking
//
// CocoaLumberjack Demos
//
#import "PerformanceTesting.h"
#import <CocoaLumberjack/CocoaLumberjack.h>
#import "BaseNSLogging.h"
#import "StaticLogging.h"
#import "DynamicLogging.h"
// Define the number of times each test is performed.
// Due to various factors, the execution time of each test run may vary quite a bit.
// Each test should be executed several times in order to arrive at a stable average.
#define NUMBER_OF_RUNS 20
/**
* The idea behind the benchmark tests is simple:
* How does the logging framework compare to basic NSLog statements?
*
* However, due to the complexity of the logging framework and its various configuration options,
* it is more complicated than a single test. Thus the testing is broken up as follows:
*
* - 3 Suites, each representing a different configuration of the logging framework
* - 5 Tests, run within each suite.
*
* The suites are described below in the configureLoggingForSuiteX methods.
* The tests are described in the various logging files, such as StaticLogging or DynamicLogging.
* Notice that these file are almost exactly the same.
*
* BaseNSLogging defines the log methods to use NSLog (the base we are comparing against).
* StaticLogging uses a 'const' log level, meaning the compiler will prune log statements (in release mode).
* DynamicLogging use a non-const log level, meaning each log statement will incur an integer comparison penalty.
**/
@implementation PerformanceTesting
static NSTimeInterval base[5][3]; // [test][min,avg,max]
static NSTimeInterval fmwk[3][2][5][3]; // [suite][file][test][min,avg,max]
static DDFileLogger *fileLogger = nil;
+ (void)initialize
{
bzero(&base, sizeof(base));
bzero(&fmwk, sizeof(fmwk));
}
+ (DDFileLogger *)fileLogger
{
if (fileLogger == nil)
{
fileLogger = [[DDFileLogger alloc] init];
fileLogger.maximumFileSize = (1024 * 1024 * 1); // 1 MB
fileLogger.rollingFrequency = (60 * 60 * 24); // 24 Hours
fileLogger.logFileManager.maximumNumberOfLogFiles = 4;
}
return fileLogger;
}
/**
* Suite 1 - Logging to Console only.
**/
+ (void)configureLoggingForSuite1
{
[DDLog removeAllLoggers];
[DDLog addLogger:[DDASLLogger sharedInstance]];
[DDLog addLogger:[DDTTYLogger sharedInstance]];
}
/**
* Suite 2 - Logging to File only.
*
* We attempt to configure the logging so it will be forced to roll the log files during the test.
* Rolling the log files requires creating and opening a new file.
* This could be a performance hit, so we want our benchmark to take this into account.
**/
+ (void)configureLoggingForSuite2
{
[DDLog removeAllLoggers];
[DDLog addLogger:[self fileLogger]];
}
/**
* Suite 3 - Logging to Console & File.
**/
+ (void)configureLoggingForSuite3
{
[DDLog removeAllLoggers];
[DDLog addLogger:[DDASLLogger sharedInstance]];
[DDLog addLogger:[DDTTYLogger sharedInstance]];
[DDLog addLogger:[self fileLogger]];
}
+ (void)executeTestsWithBase:(BOOL)exeBase framework:(BOOL)exeFramework frameworkSuite:(int)suiteNum
{
if (!exeBase && !exeFramework) return;
int sn = suiteNum - 1; // Zero-indexed for array
int i, j, k;
int start = exeBase ? 0 : 1;
int finish = exeFramework ? 3 : 1;
for (i = start; i < finish; i++)
{
Class class;
switch (i)
{
case 0 : class = [BaseNSLogging class]; break;
case 1 : class = [StaticLogging class]; break;
default : class = [DynamicLogging class]; break;
}
for (j = 0; j < 5; j++)
{
NSTimeInterval min = DBL_MAX;
NSTimeInterval max = DBL_MIN;
NSTimeInterval total = 0.0;
for (k = 0; k < NUMBER_OF_RUNS; k++)
{
@autoreleasepool {
NSDate *start = [NSDate date];
switch (j)
{
case 0 : [class performSelector:@selector(speedTest0)]; break;
case 1 : [class performSelector:@selector(speedTest1)]; break;
case 2 : [class performSelector:@selector(speedTest2)]; break;
case 3 : [class performSelector:@selector(speedTest3)]; break;
default : [class performSelector:@selector(speedTest4)]; break;
}
NSTimeInterval result = [start timeIntervalSinceNow] * -1.0;
min = MIN(min, result);
max = MAX(max, result);
total += result;
}
[DDLog flushLog];
}
if (i == 0)
{
// Base
base[j][0] = min;
base[j][1] = total / (double)NUMBER_OF_RUNS;
base[j][2] = max;
}
else
{
// Framework
fmwk[sn][i-1][j][0] = min;
fmwk[sn][i-1][j][1] = total / (double)NUMBER_OF_RUNS;
fmwk[sn][i-1][j][2] = max;
}
}
}
}
+ (NSString *)printableResultsForSuite:(int)suiteNum
{
int sn = suiteNum - 1; // Zero-indexed for array
NSMutableString *str = [NSMutableString stringWithCapacity:2000];
[str appendFormat:@"Results are given as [min][avg][max] calculated over the course of %i runs.", NUMBER_OF_RUNS];
[str appendString:@"\n\n"];
[str appendString:@"Test 0:\n"];
[str appendFormat:@"Execute %i log statements.\n", SPEED_TEST_0_COUNT];
[str appendString:@"The log statement is above the log level threshold, and will not execute.\n"];
[str appendString:@"The StaticLogging class will compile it out (in release mode).\n"];
[str appendString:@"The DynamicLogging class will require a single integer comparison.\n"];
[str appendString:@"\n"];
[str appendFormat:@"BaseNSLogging :[%.4f][%.4f][%.4f]\n", base[0][0], base[0][1], base[0][2]];
[str appendFormat:@"StaticLogging :[%.4f][%.4f][%.4f]\n", fmwk[sn][0][0][0], fmwk[sn][0][0][1], fmwk[sn][0][0][2]];
[str appendFormat:@"DynamicLogging:[%.4f][%.4f][%.4f]\n", fmwk[sn][1][0][0], fmwk[sn][1][0][1], fmwk[sn][1][0][2]];
[str appendString:@"\n\n\n"];
[str appendString:@"Test 1:\n"];
[str appendFormat:@"Execute %i log statements.\n", SPEED_TEST_1_COUNT];
[str appendString:@"The log statement is at or below the log level threshold, and will execute.\n"];
[str appendString:@"The logging framework will execute the statements Asynchronously.\n"];
[str appendString:@"\n"];
[str appendFormat:@"BaseNSLogging :[%.4f][%.4f][%.4f]\n", base[1][0], base[1][1], base[1][2]];
[str appendFormat:@"StaticLogging :[%.4f][%.4f][%.4f]\n", fmwk[sn][0][1][0], fmwk[sn][0][1][1], fmwk[sn][0][1][2]];
[str appendFormat:@"DynamicLogging:[%.4f][%.4f][%.4f]\n", fmwk[sn][1][1][0], fmwk[sn][1][1][1], fmwk[sn][1][1][2]];
[str appendString:@"\n\n\n"];
[str appendString:@"Test 2:\n"];
[str appendFormat:@"Execute %i log statements.\n", SPEED_TEST_2_COUNT];
[str appendString:@"The log statement is at or below the log level threshold, and will execute.\n"];
[str appendString:@"The logging framework will execute the statements Synchronously.\n"];
[str appendString:@"\n"];
[str appendFormat:@"BaseNSLogging :[%.4f][%.4f][%.4f]\n", base[2][0], base[2][1], base[2][2]];
[str appendFormat:@"StaticLogging :[%.4f][%.4f][%.4f]\n", fmwk[sn][0][2][0], fmwk[sn][0][2][1], fmwk[sn][0][2][2]];
[str appendFormat:@"DynamicLogging:[%.4f][%.4f][%.4f]\n", fmwk[sn][1][2][0], fmwk[sn][1][2][1], fmwk[sn][1][2][2]];
[str appendString:@"\n\n\n"];
[str appendString:@"Test 3:"];
[str appendFormat:@"Execute %i log statements per level.\n", SPEED_TEST_3_COUNT];
[str appendString:@"This is designed to mimic what might happen in a regular application.\n"];
[str appendString:@"25% will be above log level threshold and will be filtered out.\n"];
[str appendString:@"50% will execute Asynchronously.\n"];
[str appendString:@"25% will execute Synchronously.\n"];
[str appendString:@"\n"];
[str appendFormat:@"BaseNSLogging :[%.4f][%.4f][%.4f]\n", base[3][0], base[3][1], base[3][2]];
[str appendFormat:@"StaticLogging :[%.4f][%.4f][%.4f]\n", fmwk[sn][0][3][0], fmwk[sn][0][3][1], fmwk[sn][0][3][2]];
[str appendFormat:@"DynamicLogging:[%.4f][%.4f][%.4f]\n", fmwk[sn][1][3][0], fmwk[sn][1][3][1], fmwk[sn][1][3][2]];
[str appendString:@"\n\n\n"];
float total = 0.0F;
total += SPEED_TEST_4_VERBOSE_COUNT;
total += SPEED_TEST_4_INFO_COUNT;
total += SPEED_TEST_4_WARN_COUNT;
total += SPEED_TEST_4_ERROR_COUNT;
float verbose = (float)SPEED_TEST_4_VERBOSE_COUNT / total * 100.0F;
float info = (float)SPEED_TEST_4_INFO_COUNT / total * 100.0F;
float warn = (float)SPEED_TEST_4_WARN_COUNT / total * 100.0F;
float error = (float)SPEED_TEST_4_ERROR_COUNT / total * 100.0F;
[str appendString:@"Test 4:\n"];
[str appendString:@"Similar to test 3, designed to mimic a real application\n"];
[str appendFormat:@"Execute %i log statements in total.\n", (int)total];
[str appendFormat:@"%04.1f%% will be above log level threshold and will be filtered out.\n", verbose];
[str appendFormat:@"%04.1f%% will execute Asynchronously.\n", (info + warn)];
[str appendFormat:@"%04.1f%% will execute Synchronously.\n", error];
[str appendString:@"\n"];
[str appendFormat:@"BaseNSLogging :[%.4f][%.4f][%.4f]\n", base[4][0], base[4][1], base[4][2]];
[str appendFormat:@"StaticLogging :[%.4f][%.4f][%.4f]\n", fmwk[sn][0][4][0], fmwk[sn][0][4][1], fmwk[sn][0][4][2]];
[str appendFormat:@"DynamicLogging:[%.4f][%.4f][%.4f]\n", fmwk[sn][1][4][0], fmwk[sn][1][4][1], fmwk[sn][1][4][2]];
[str appendString:@"\n\n\n"];
return str;
}
+ (NSString *)csvResults
{
NSMutableString *str = [NSMutableString stringWithCapacity:1000];
// What are we trying to do here?
//
// What we ultimately want is to compare the performance of the framework against the baseline.
// This means we want to see the performance of the baseline for test 1,
// and then right next to it we want to see the performance of the framework with each various configuration.
//
// So we want it to kinda look like this for Test 1:
//
// Base, [min], [avg], [max]
// Suite 1 - Static, [min], [avg], [max]
// Suite 1 - Dynamic, [min], [avg], [max]
// Suite 2 - Static, [min], [avg], [max]
// Suite 2 - Dynamic, [min], [avg], [max]
// Suite 3 - Static, [min], [avg], [max]
// Suite 3 - Dynamic, [min], [avg], [max]
//
// This will import into Excel just fine.
// However, I couldn't get Excel to make a decent looking graph with the data.
// Perhaps I'm just not familiar enough with Excel.
// But I was able to download OmniGraphSketcher,
// and figure out how to create an awesome looking graph in less than 15 minutes.
// And thus OmniGraphSketcher wins for me.
// The only catch is that it wants to import the data with numbers instead of names.
// So I need to convert the output to look like this:
//
// 0, [min], [avg], [max]
// 1, [min], [avg], [max]
// 2, [min], [avg], [max]
// 3, [min], [avg], [max]
// 4, [min], [avg], [max]
// 5, [min], [avg], [max]
// 6, [min], [avg], [max]
//
// I can then import the data into OmniGraphSketcher, and rename the X-axis points.
// static NSTimeInterval base[5][3]; // [test][min,avg,max]
//
// static NSTimeInterval fmwk[3][2][5][3]; // [suite][file][test][min,avg,max]
int row = 0;
int suite, file, test;
for (test = 0; test < 5; test++)
{
[str appendFormat:@"%i, %.4f, %.4f, %.4f\n", row++, base[test][0], base[test][1], base[test][2]];
for (suite = 0; suite < 3; suite++)
{
for (file = 0; file < 2; file++)
{
[str appendFormat:@"%i, %.4f, %.4f, %.4f\n", row++,
fmwk[suite][file][test][0], fmwk[suite][file][test][1], fmwk[suite][file][test][2]];
}
}
row += 3;
}
return str;
}
+ (void)startPerformanceTests
{
BOOL runBase = YES;
BOOL runSuite1 = YES;
BOOL runSuite2 = YES;
BOOL runSuite3 = YES;
if (!runBase && !runSuite1 && !runSuite2 && !runSuite3)
{
// Nothing to do, all suites disabled
return;
}
NSLog(@"Preparing to start performance tests...");
NSLog(@"The results will be printed nicely when all logging has completed.\n\n");
[NSThread sleepForTimeInterval:3.0];
if (runBase)
{
[self executeTestsWithBase:YES framework:NO frameworkSuite:0];
}
NSString *printableResults1 = nil;
NSString *printableResults2 = nil;
NSString *printableResults3 = nil;
if (runSuite1)
{
[self configureLoggingForSuite1];
[self executeTestsWithBase:NO framework:YES frameworkSuite:1];
printableResults1 = [self printableResultsForSuite:1];
NSLog(@"\n\n\n\n");
}
if (runSuite2)
{
[self configureLoggingForSuite2];
[self executeTestsWithBase:NO framework:YES frameworkSuite:2];
printableResults2 = [self printableResultsForSuite:2];
NSLog(@"\n\n\n\n");
}
if (runSuite3)
{
[self configureLoggingForSuite3];
[self executeTestsWithBase:NO framework:YES frameworkSuite:3];
printableResults3 = [self printableResultsForSuite:3];
NSLog(@"\n\n\n\n");
}
if (runSuite1)
{
NSLog(@"======================================================================");
NSLog(@"Benchmark Suite 1:");
NSLog(@"Logging framework configured to log to console only.");
NSLog(@"\n\n%@", printableResults1);
NSLog(@"======================================================================");
}
if (runSuite2)
{
NSLog(@"======================================================================");
NSLog(@"Benchmark Suite 2:");
NSLog(@"Logging framework configured to log to file only.");
NSLog(@"\n\n%@", printableResults2);
NSLog(@"======================================================================");
}
if (runSuite3)
{
NSLog(@"======================================================================");
NSLog(@"Benchmark Suite 3:");
NSLog(@"Logging framework configured to log to console & file.");
NSLog(@"\n\n%@", printableResults3);
NSLog(@"======================================================================");
}
#if TARGET_OS_IPHONE
NSString *csvResultsPath = [@"~/Documents/LumberjackBenchmark.csv" stringByExpandingTildeInPath];
#else
NSString *csvResultsPath = [@"~/Desktop/LumberjackBenchmark.csv" stringByExpandingTildeInPath];
#endif
if (![[NSFileManager defaultManager] fileExistsAtPath:csvResultsPath])
{
[[NSFileManager defaultManager] createFileAtPath:csvResultsPath contents:nil attributes:nil];
}
NSFileHandle *csvResultsFile = [NSFileHandle fileHandleForWritingAtPath:csvResultsPath];
NSString *csvResults = [self csvResults];
[csvResultsFile writeData:[csvResults dataUsingEncoding:NSUTF8StringEncoding]];
NSLog(@"CSV results file written to:\n%@", csvResultsPath);
}
@end
@@ -0,0 +1,35 @@
0, 0.2724, 0.2816, 0.3198
1, 0.0000, 0.0000, 0.0000
2, 0.0000, 0.0000, 0.0000
3, 0.0000, 0.0000, 0.0000
4, 0.0000, 0.0000, 0.0000
5, 0.0000, 0.0000, 0.0000
6, 0.0000, 0.0000, 0.0000
10, 0.2710, 0.2757, 0.2826
11, 0.0032, 0.0035, 0.0043
12, 0.0032, 0.0036, 0.0066
13, 0.0032, 0.0032, 0.0033
14, 0.0032, 0.0032, 0.0033
15, 0.0032, 0.0035, 0.0054
16, 0.0032, 0.0037, 0.0065
20, 0.2715, 0.2804, 0.3601
21, 0.0996, 0.1037, 0.1090
22, 0.0984, 0.1042, 0.1265
23, 0.0296, 0.0311, 0.0370
24, 0.0294, 0.0301, 0.0314
25, 0.1118, 0.1523, 0.8192
26, 0.1089, 0.1138, 0.1204
30, 0.2720, 0.2760, 0.2842
31, 0.0251, 0.0269, 0.0287
32, 0.0260, 0.0273, 0.0298
33, 0.0080, 0.0084, 0.0089
34, 0.0079, 0.0084, 0.0091
35, 0.0278, 0.0298, 0.0322
36, 0.0277, 0.0299, 0.0319
40, 0.2707, 0.2797, 0.3354
41, 0.0095, 0.0103, 0.0112
42, 0.0096, 0.0104, 0.0113
43, 0.0028, 0.0030, 0.0034
44, 0.0028, 0.0029, 0.0031
45, 0.0098, 0.0112, 0.0120
46, 0.0104, 0.0114, 0.0122
1 0 0.2724 0.2816 0.3198
2 1 0.0000 0.0000 0.0000
3 2 0.0000 0.0000 0.0000
4 3 0.0000 0.0000 0.0000
5 4 0.0000 0.0000 0.0000
6 5 0.0000 0.0000 0.0000
7 6 0.0000 0.0000 0.0000
8 10 0.2710 0.2757 0.2826
9 11 0.0032 0.0035 0.0043
10 12 0.0032 0.0036 0.0066
11 13 0.0032 0.0032 0.0033
12 14 0.0032 0.0032 0.0033
13 15 0.0032 0.0035 0.0054
14 16 0.0032 0.0037 0.0065
15 20 0.2715 0.2804 0.3601
16 21 0.0996 0.1037 0.1090
17 22 0.0984 0.1042 0.1265
18 23 0.0296 0.0311 0.0370
19 24 0.0294 0.0301 0.0314
20 25 0.1118 0.1523 0.8192
21 26 0.1089 0.1138 0.1204
22 30 0.2720 0.2760 0.2842
23 31 0.0251 0.0269 0.0287
24 32 0.0260 0.0273 0.0298
25 33 0.0080 0.0084 0.0089
26 34 0.0079 0.0084 0.0091
27 35 0.0278 0.0298 0.0322
28 36 0.0277 0.0299 0.0319
29 40 0.2707 0.2797 0.3354
30 41 0.0095 0.0103 0.0112
31 42 0.0096 0.0104 0.0113
32 43 0.0028 0.0030 0.0034
33 44 0.0028 0.0029 0.0031
34 45 0.0098 0.0112 0.0120
35 46 0.0104 0.0114 0.0122
@@ -0,0 +1,35 @@
0, 0.6169, 0.6700, 0.7403
1, 0.0000, 0.0000, 0.0000
2, 0.0000, 0.0000, 0.0000
3, 0.0000, 0.0000, 0.0000
4, 0.0000, 0.0000, 0.0000
5, 0.0000, 0.0000, 0.0000
6, 0.0000, 0.0000, 0.0000
10, 0.6106, 0.6640, 0.7329
11, 0.0184, 0.0268, 0.0466
12, 0.0185, 0.0243, 0.0477
13, 0.0183, 0.0213, 0.0234
14, 0.0213, 0.0223, 0.0246
15, 0.0182, 0.0231, 0.0426
16, 0.0182, 0.0207, 0.0286
20, 0.6167, 0.6651, 0.7365
21, 0.2614, 0.3090, 0.3966
22, 0.2672, 0.3121, 0.3805
23, 0.0541, 0.0675, 0.0834
24, 0.0541, 0.0576, 0.0824
25, 0.2795, 0.3334, 0.4408
26, 0.2847, 0.3438, 0.4951
30, 0.6077, 0.6560, 0.7029
31, 0.0676, 0.0997, 0.2275
32, 0.0723, 0.0945, 0.1568
33, 0.0188, 0.0191, 0.0203
34, 0.0187, 0.0192, 0.0233
35, 0.0723, 0.0886, 0.1579
36, 0.0774, 0.0934, 0.1095
40, 0.6101, 0.6597, 0.7372
41, 0.0189, 0.0308, 0.0484
42, 0.0237, 0.0322, 0.0468
43, 0.0053, 0.0054, 0.0056
44, 0.0053, 0.0055, 0.0057
45, 0.0233, 0.0347, 0.0780
46, 0.0223, 0.0316, 0.0559
1 0 0.6169 0.6700 0.7403
2 1 0.0000 0.0000 0.0000
3 2 0.0000 0.0000 0.0000
4 3 0.0000 0.0000 0.0000
5 4 0.0000 0.0000 0.0000
6 5 0.0000 0.0000 0.0000
7 6 0.0000 0.0000 0.0000
8 10 0.6106 0.6640 0.7329
9 11 0.0184 0.0268 0.0466
10 12 0.0185 0.0243 0.0477
11 13 0.0183 0.0213 0.0234
12 14 0.0213 0.0223 0.0246
13 15 0.0182 0.0231 0.0426
14 16 0.0182 0.0207 0.0286
15 20 0.6167 0.6651 0.7365
16 21 0.2614 0.3090 0.3966
17 22 0.2672 0.3121 0.3805
18 23 0.0541 0.0675 0.0834
19 24 0.0541 0.0576 0.0824
20 25 0.2795 0.3334 0.4408
21 26 0.2847 0.3438 0.4951
22 30 0.6077 0.6560 0.7029
23 31 0.0676 0.0997 0.2275
24 32 0.0723 0.0945 0.1568
25 33 0.0188 0.0191 0.0203
26 34 0.0187 0.0192 0.0233
27 35 0.0723 0.0886 0.1579
28 36 0.0774 0.0934 0.1095
29 40 0.6101 0.6597 0.7372
30 41 0.0189 0.0308 0.0484
31 42 0.0237 0.0322 0.0468
32 43 0.0053 0.0054 0.0056
33 44 0.0053 0.0055 0.0057
34 45 0.0233 0.0347 0.0780
35 46 0.0223 0.0316 0.0559
@@ -0,0 +1,35 @@
0, 2.4968, 2.5606, 2.7525
1, 0.0001, 0.0001, 0.0001
2, 0.0000, 0.0000, 0.0000
3, 0.0000, 0.0000, 0.0000
4, 0.0000, 0.0014, 0.0285
5, 0.0000, 0.0000, 0.0001
6, 0.0000, 0.0000, 0.0000
10, 2.5016, 2.5982, 2.7952
11, 0.2299, 0.5288, 1.2570
12, 0.2845, 0.5943, 0.8713
13, 0.3455, 0.3955, 0.5355
14, 0.2955, 0.3814, 0.4431
15, 0.2304, 0.5469, 0.9735
16, 0.2761, 0.4723, 0.7460
20, 2.5067, 2.5589, 2.6211
21, 1.5797, 1.8261, 2.1204
22, 1.8572, 1.9808, 2.1686
23, 0.4198, 0.4877, 0.5202
24, 0.4220, 0.4873, 0.5729
25, 2.0504, 2.2492, 2.4038
26, 2.1307, 2.3070, 2.4938
30, 2.5003, 2.5565, 2.6215
31, 0.5118, 0.6478, 0.8476
32, 0.5157, 0.6690, 0.8628
33, 0.1525, 0.2119, 0.2614
34, 0.1407, 0.2039, 0.2715
35, 0.5535, 0.6758, 0.8734
36, 0.5397, 0.6877, 0.8979
40, 2.4872, 2.5404, 2.5948
41, 0.1454, 0.2044, 0.3307
42, 0.1604, 0.2122, 0.2885
43, 0.0287, 0.0484, 0.0962
44, 0.0286, 0.0480, 0.1025
45, 0.1542, 0.2173, 0.3335
46, 0.1521, 0.2266, 0.3015
1 0 2.4968 2.5606 2.7525
2 1 0.0001 0.0001 0.0001
3 2 0.0000 0.0000 0.0000
4 3 0.0000 0.0000 0.0000
5 4 0.0000 0.0014 0.0285
6 5 0.0000 0.0000 0.0001
7 6 0.0000 0.0000 0.0000
8 10 2.5016 2.5982 2.7952
9 11 0.2299 0.5288 1.2570
10 12 0.2845 0.5943 0.8713
11 13 0.3455 0.3955 0.5355
12 14 0.2955 0.3814 0.4431
13 15 0.2304 0.5469 0.9735
14 16 0.2761 0.4723 0.7460
15 20 2.5067 2.5589 2.6211
16 21 1.5797 1.8261 2.1204
17 22 1.8572 1.9808 2.1686
18 23 0.4198 0.4877 0.5202
19 24 0.4220 0.4873 0.5729
20 25 2.0504 2.2492 2.4038
21 26 2.1307 2.3070 2.4938
22 30 2.5003 2.5565 2.6215
23 31 0.5118 0.6478 0.8476
24 32 0.5157 0.6690 0.8628
25 33 0.1525 0.2119 0.2614
26 34 0.1407 0.2039 0.2715
27 35 0.5535 0.6758 0.8734
28 36 0.5397 0.6877 0.8979
29 40 2.4872 2.5404 2.5948
30 41 0.1454 0.2044 0.3307
31 42 0.1604 0.2122 0.2885
32 43 0.0287 0.0484 0.0962
33 44 0.0286 0.0480 0.1025
34 45 0.1542 0.2173 0.3335
35 46 0.1521 0.2266 0.3015
@@ -0,0 +1,35 @@
0, 4.2598, 4.3660, 4.6588
1, 0.0000, 0.0000, 0.0000
2, 0.0000, 0.0000, 0.0000
3, 0.0000, 0.0000, 0.0000
4, 0.0000, 0.0000, 0.0000
5, 0.0000, 0.0000, 0.0000
6, 0.0000, 0.0000, 0.0000
10, 4.1986, 4.3513, 4.5088
11, 0.5951, 1.5768, 2.3934
12, 1.0329, 1.5809, 2.1354
13, 0.2904, 0.3407, 0.4357
14, 0.2413, 0.3309, 0.3610
15, 0.6748, 1.2716, 1.6643
16, 0.7571, 1.3473, 2.3276
20, 4.2224, 4.3516, 4.5251
21, 3.1635, 3.2748, 3.5510
22, 3.2119, 3.2817, 3.4837
23, 0.4739, 0.4894, 0.6311
24, 0.4719, 0.4800, 0.5312
25, 3.4027, 3.5172, 3.7449
26, 3.3843, 3.4736, 3.7347
30, 4.1721, 4.3516, 4.5596
31, 0.9029, 1.2367, 1.5529
32, 0.9005, 1.2779, 1.5703
33, 0.1541, 0.1928, 0.2365
34, 0.1533, 0.1986, 0.2383
35, 0.8691, 1.1347, 1.5500
36, 0.8477, 1.1970, 1.6069
40, 4.1914, 4.3369, 4.6224
41, 0.3008, 0.3281, 0.4669
42, 0.2909, 0.3252, 0.4046
43, 0.0470, 0.0478, 0.0488
44, 0.0471, 0.0481, 0.0527
45, 0.3151, 0.3484, 0.4229
46, 0.3111, 0.3480, 0.4136
1 0 4.2598 4.3660 4.6588
2 1 0.0000 0.0000 0.0000
3 2 0.0000 0.0000 0.0000
4 3 0.0000 0.0000 0.0000
5 4 0.0000 0.0000 0.0000
6 5 0.0000 0.0000 0.0000
7 6 0.0000 0.0000 0.0000
8 10 4.1986 4.3513 4.5088
9 11 0.5951 1.5768 2.3934
10 12 1.0329 1.5809 2.1354
11 13 0.2904 0.3407 0.4357
12 14 0.2413 0.3309 0.3610
13 15 0.6748 1.2716 1.6643
14 16 0.7571 1.3473 2.3276
15 20 4.2224 4.3516 4.5251
16 21 3.1635 3.2748 3.5510
17 22 3.2119 3.2817 3.4837
18 23 0.4739 0.4894 0.6311
19 24 0.4719 0.4800 0.5312
20 25 3.4027 3.5172 3.7449
21 26 3.3843 3.4736 3.7347
22 30 4.1721 4.3516 4.5596
23 31 0.9029 1.2367 1.5529
24 32 0.9005 1.2779 1.5703
25 33 0.1541 0.1928 0.2365
26 34 0.1533 0.1986 0.2383
27 35 0.8691 1.1347 1.5500
28 36 0.8477 1.1970 1.6069
29 40 4.1914 4.3369 4.6224
30 41 0.3008 0.3281 0.4669
31 42 0.2909 0.3252 0.4046
32 43 0.0470 0.0478 0.0488
33 44 0.0471 0.0481 0.0527
34 45 0.3151 0.3484 0.4229
35 46 0.3111 0.3480 0.4136
@@ -0,0 +1,35 @@
0, 4.7533, 4.8965, 5.1468
1, 0.0000, 0.0000, 0.0000
2, 0.0000, 0.0000, 0.0000
3, 0.0000, 0.0000, 0.0000
4, 0.0000, 0.0000, 0.0000
5, 0.0000, 0.0000, 0.0000
6, 0.0000, 0.0000, 0.0000
10, 4.7739, 4.8658, 5.0876
11, 0.1744, 0.7295, 1.3352
12, 0.2169, 0.7354, 1.4760
13, 0.1846, 0.2992, 0.4073
14, 0.1816, 0.2980, 0.3568
15, 0.1840, 0.8697, 1.5107
16, 0.0834, 0.7477, 1.1599
20, 4.7807, 4.9025, 5.1423
21, 3.1918, 3.3175, 3.5093
22, 3.1522, 3.2813, 3.5148
23, 0.3052, 0.3182, 0.3852
24, 0.3061, 0.3171, 0.3410
25, 3.5837, 3.7104, 3.9758
26, 3.5487, 3.6969, 3.9776
30, 4.7613, 4.8927, 5.1026
31, 0.8053, 1.0718, 1.3799
32, 0.8069, 1.0888, 1.3447
33, 0.1194, 0.1577, 0.1813
34, 0.1249, 0.1523, 0.1777
35, 0.9295, 1.2310, 1.4301
36, 0.9240, 1.2278, 1.5636
40, 4.8084, 4.8773, 5.0500
41, 0.2822, 0.3202, 0.3642
42, 0.3091, 0.3291, 0.3686
43, 0.0302, 0.0313, 0.0341
44, 0.0295, 0.0308, 0.0328
45, 0.3281, 0.3669, 0.4102
46, 0.3359, 0.3710, 0.3960
1 0 4.7533 4.8965 5.1468
2 1 0.0000 0.0000 0.0000
3 2 0.0000 0.0000 0.0000
4 3 0.0000 0.0000 0.0000
5 4 0.0000 0.0000 0.0000
6 5 0.0000 0.0000 0.0000
7 6 0.0000 0.0000 0.0000
8 10 4.7739 4.8658 5.0876
9 11 0.1744 0.7295 1.3352
10 12 0.2169 0.7354 1.4760
11 13 0.1846 0.2992 0.4073
12 14 0.1816 0.2980 0.3568
13 15 0.1840 0.8697 1.5107
14 16 0.0834 0.7477 1.1599
15 20 4.7807 4.9025 5.1423
16 21 3.1918 3.3175 3.5093
17 22 3.1522 3.2813 3.5148
18 23 0.3052 0.3182 0.3852
19 24 0.3061 0.3171 0.3410
20 25 3.5837 3.7104 3.9758
21 26 3.5487 3.6969 3.9776
22 30 4.7613 4.8927 5.1026
23 31 0.8053 1.0718 1.3799
24 32 0.8069 1.0888 1.3447
25 33 0.1194 0.1577 0.1813
26 34 0.1249 0.1523 0.1777
27 35 0.9295 1.2310 1.4301
28 36 0.9240 1.2278 1.5636
29 40 4.8084 4.8773 5.0500
30 41 0.2822 0.3202 0.3642
31 42 0.3091 0.3291 0.3686
32 43 0.0302 0.0313 0.0341
33 44 0.0295 0.0308 0.0328
34 45 0.3281 0.3669 0.4102
35 46 0.3359 0.3710 0.3960
@@ -0,0 +1,18 @@
//
// StaticLogging.h
// Benchmarking
//
// CocoaLumberjack Demos
//
#import <Foundation/Foundation.h>
@interface StaticLogging : NSObject
+ (void)speedTest0;
+ (void)speedTest1;
+ (void)speedTest2;
+ (void)speedTest3;
+ (void)speedTest4;
@end
@@ -0,0 +1,97 @@
//
// StaticLogging.m
// Benchmarking
//
// CocoaLumberjack Demos
//
#import "StaticLogging.h"
#import "PerformanceTesting.h"
#import <CocoaLumberjack/CocoaLumberjack.h>
#define FILENAME @"StaticLogging " // Trailing space to match exactly the others in length
// Debug levels: off, error, warn, info, verbose
static const DDLogLevel ddLogLevel = DDLogLevelWarning; // CONST
@implementation StaticLogging
+ (void)speedTest0
{
// Log statements that will not be executed due to log level
for (NSUInteger i = 0; i < SPEED_TEST_0_COUNT; i++)
{
DDLogVerbose(@"%@: SpeedTest0 - %lu", FILENAME, (unsigned long)i);
}
}
+ (void)speedTest1
{
// Log statements that will be executed asynchronously
for (NSUInteger i = 0; i < SPEED_TEST_1_COUNT; i++)
{
DDLogWarn(@"%@: SpeedTest1 - %lu", FILENAME, (unsigned long)i);
}
}
+ (void)speedTest2
{
// Log statements that will be executed synchronously
for (NSUInteger i = 0; i < SPEED_TEST_2_COUNT; i++)
{
DDLogError(@"%@: SpeedTest2 - %lu", FILENAME, (unsigned long)i);
}
}
+ (void)speedTest3
{
// Even Spread:
//
// 25% - Not executed due to log level
// 50% - Executed asynchronously
// 25% - Executed synchronously
for (NSUInteger i = 0; i < SPEED_TEST_3_COUNT; i++)
{
DDLogError(@"%@: SpeedTest3A - %lu", FILENAME, (unsigned long)i);
}
for (NSUInteger i = 0; i < SPEED_TEST_3_COUNT; i++)
{
DDLogWarn(@"%@: SpeedTest3B - %lu", FILENAME, (unsigned long)i);
}
for (NSUInteger i = 0; i < SPEED_TEST_3_COUNT; i++)
{
DDLogInfo(@"%@: SpeedTest3C - %lu", FILENAME, (unsigned long)i);
}
for (NSUInteger i = 0; i < SPEED_TEST_3_COUNT; i++)
{
DDLogVerbose(@"%@: SpeedTest3D - %lu", FILENAME, (unsigned long)i);
}
}
+ (void)speedTest4
{
// Custom Spread
for (NSUInteger i = 0; i < SPEED_TEST_4_ERROR_COUNT; i++)
{
DDLogError(@"%@: SpeedTest4A - %lu", FILENAME, (unsigned long)i);
}
for (NSUInteger i = 0; i < SPEED_TEST_4_WARN_COUNT; i++)
{
DDLogWarn(@"%@: SpeedTest4B - %lu", FILENAME, (unsigned long)i);
}
for (NSUInteger i = 0; i < SPEED_TEST_4_INFO_COUNT; i++)
{
DDLogInfo(@"%@: SpeedTest4C - %lu", FILENAME, (unsigned long)i);
}
for (NSUInteger i = 0; i < SPEED_TEST_4_VERBOSE_COUNT; i++)
{
DDLogVerbose(@"%@: SpeedTest4D - %lu", FILENAME, (unsigned long)i);
}
}
@end
+17
View File
@@ -0,0 +1,17 @@
//
// main.m
// Benchmarking
//
// CocoaLumberjack Benchmarking
//
#import <Foundation/Foundation.h>
#import "PerformanceTesting.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
[PerformanceTesting startPerformanceTests];
}
return 0;
}
+551
View File
@@ -0,0 +1,551 @@
## [3.7.3 - Xcode 12.? on ??, 2021](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.7.3)
### Public
- _REPLACE ME_
### Internal
- _REPLACE ME_
## [3.7.2 - Xcode 12.4 on Apr 9th, 2021](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.7.2)
### Public
- Re-introduce (and deprecate) `_tag` field to fix breakage in 3.7.1 (#1224)
## [3.7.1 - Xcode 12.4 on Apr 7th, 2021](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.7.1)
### Public
- Deprecate `tag` property of `DDLogMessage`, use `representedObject` instead. (#1177, #532)
- Add per-message synchronous logging control for messages logged via SwiftLog using `DDLogHandler` (#1209)
- Add TargetConditionals import for Xcode 12.5 (#1210)
- Prevent logging an error when archiving an already deleted file (#1212)
- Use inclusive words - denylist / allowlist (#1218)
- Add `DDAssertionFailure` macro for Objective-C (#1220)
### Internal
- Use setter to replace kvo for `NSFileLogger` (#1180)
- Use new API for `NSFileHandle` on supported platforms (#1181)
- Remove unnecessary checks in `DDFileLogger` (#1182)
- Add an assertion to avoid potential deadlock issues for `flushLog` (#1183)
## [3.7.0 - Xcode 12 on Oct 2nd, 2020](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.7.0)
### Public
- **Breaking change**: Dropped support for iOS 8 (#1153)
- Update SPM tools-version to 5.3 to enable Swift 5.3 support (#1148)
- Add backend for swift-log (#1164)
- Specify CocoaPods version to ensure `swift_version` attribute works (#1167)
- Simplify `DDLogFileManager` callbacks for archived log files (#1166)
## [3.6.2 - Xcode 11.6 on July 31st, 2020](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.6.2)
### Public
- Fix warnings when building with SPM bundled with Swift 5.2 / Xcode 11.4 (#1132)
- Added Swift name for DDQualityOfServiceName constants.
- Don't localize timestamps in `DDefaultFileLogFormatter` (#1151)
- Allow logging arbitrary objects via Swift log functions (#1146)
### Repository
- Switch from Travis to GitHub Actions (#1135, #1140, #1150, #1152)
## [3.6.1 - Xcode 11.3.1 on Jan 25th, 2020](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.6.1)
### Public
- Improve error handling during log file creation in DDFileLogger & DDLogFileManager (#1103 / #1111)
- Improve nullability annotations in public headers (#1111 / #1112 / #1119)
- Added support for thread QOS in DDLogMessage class (#1124)
### Internal
- Fix rolling timer being rescheduled rapidly due to leeway (#1106 / #1107)
- Fix -didArchiveLogFile: returning the file name instead of the file path (#1078)
- Fix setxattr() function usage (#1118)
- Fix NSDateFormatter thread safety (#1121)
- Fix -lt_dataForMessage: duplicated code (#1122)
## [3.6.0 - Xcode 11 on October 2nd, 2019](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.6.0)
### Public
- Swift Package Manager Support (#1083)
- New `willLogMessage:` and `didLogMessage:` methods on `DDFileLogger` which provide access to the current log file info.
### Internal
- Fix issue with log archiving in the simulator (#1098)
- Limit assertion to non-simulator build (#1100)
## [3.5.3 - Xcode 10.2 on Apr 24th, 2019](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.5.3)
### Public
- Additional compatibility with Swift 5 (backwards compatible with Swift 4) (#1043)
- Fix warning building with Xcode 10.2 (#1059)
- Set Xcode 10.2 and Swift 5.0 as a default (#1064)
- Fix format string crash (#1066)
### Internal
- Fix warning about syntax (#1054) (#1065)
- Remove banned APIs (#1056) (#1057)
- Add CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER & fix warnings (#1059)
- Use LLONG_MAX instead of LONG_LONG_MAX (#1062)
## [3.5.2 - Xcode 10.1 on Mar 15th, 2019](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.5.2)
### Public
- Fix reusing of log files after rolling (#1042)
- Fix creation of too many log files (#1049)
- Preliminary compatibility with Swift 5 (backwards compatible with Swift 4) (#1044)
- core: loggers os logger variations have been added (#1039)
### Internal
- Sync internal queues to prevent cleaning up log files too soon in tests (#1053)
- DDLog checks for NULL values and for global queue dispatching has been added (#1045)
## [3.5.1 - Xcode 10 on Feb 4th, 2019](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.5.1)
### Public
- Fix high CPU usage because of empty fileAttributes and / or too high rollingFrequceny (#1028)
## [3.5.0 - Xcode 10 on Jan 25th, 2019](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.5.0)
### Public
- Added `logFileHeader` property to `DDLogFileManagerDefault`. Override to set header for each created file. #998
- `DDFileLogger` now accepts a `dispatch_queue_t` which it uses to run callbacks. If not provided, the default global queue is used. #1003
- Added opt-in buffering to `DDFileLogger`. Call `wrapWithBuffer` to create a file logger which buffers. #1001, #1012
- Add `DDAssert` and `DDAssertionFailure` functions for Swift #934
- Add `DD_LOG_LEVEL` define (which can be set in `GCC_PREPROCESSOR_DEFINITIONS`) for Swift to set default log level (enables stripping for strings that are not logged). #952
- Add `asyncLoggingEnabled` global variable to control asynchronous logging. #1019
### Internal
- Prevent memory access errors caused by a failed fetch #944
- Fix common warnings emitted by `-Wall`, `-Wconversion`, `-Wextra`, etc #943, #931
- Fixes issue that could cause log messages to become interleaved when there are multiple `DDFileLogger`s #985
- `DispatchQueueFormatter` knows about `com.apple.root.default-qos.overcommit` now #932
- Fix thread safety issues in `DDFileLogger`. Makes it a little harder to deadlock in some cases. #986, #1003, #946
- Fix availability checks and memory leak #996
### Repository
- Reduce podspec to two subspecs and remove customized modulemap #976
- Add danger support for PR checks #962 - fixes #956
- Merged framework targets + using `xcconfig` + deployment target `iOS 8` and `Mac OS 10.10` #959 e97da34
- Documentation update #955 e7414ae 0239196 #933
- Full links to Docs and other resources so they are resolved on external pages (i.e. https://cocoapods.org/pods/CocoaLumberjack) e9d6971
- Replace `OSAtomic` with `stdatomic` in `DDDispatchQueueLogFormatter` #957 #958
- Add Stale Bot + configuration #953
- Update to Xcode 10 and Swift 4.2 compiler #950
- Xcode 10 scheme changes #949
- Update incomplete BSD 3-Clause License #942
- Updated to CocoaPods 1.5.3 2d0590f
- Use Xcode 9.4 image for tests #939
- Xcode (schemes) version bumps #938
- Update demo and documentation about CustomLogLevels #1023
## [3.4.2 - Xcode 9.3 on Apr 17th, 2018](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.4.2)
- Update README.md #912
- Fixed typo in pull request template #913
- Fix `-Wimplicit-retain-self` warnings #915
- Update memory management in dynamic logging #916
- Xcode 9.3 support #921 #923 #926 #927
- Add extern "C" for Objective-C++ #922
- Add `flush` method to the `DDFileLogger` #928
## [3.4.1 - Xcode 9.1 on Jan 26th, 2018](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.4.1)
- Fix `DDLogFileManagerDefault` `-isLogFile` #909
- Fix locking the main thread #911
## [3.4.0 - Xcode 9.1 on Jan 3rd, 2018](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.4.0)
- Fix Travis CI #895
- Fix typos #896
- Fix schemes and link errors #897 #899 #903 #907
## [3.3.0 - Xcode 9 on Oct 3rd, 2017](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.3.0)
- Xcode 9 support and Swift 4 support #890 #893
- Replace `OSSpinLock` with `pthread_mutex` #889
## [3.2.1 - Xcode 9 beta on Aug 21st, 2017](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.2.1)
- Xcode 9 beta support #874 #873 #884 #883 #882
- Fixed some issues around deleting log files #868 #879
- update 'Use Log Level per Logger' doc #888
- Remove empty asset catalogs so that they don't show up in Open Quickly #877
- Fixed typo in pull request template #880
## [3.2.0 - Swift 3.0.0, Xcode 8.3 on May 3rd, 2017](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.2.0)
- Xcode 8.3 support #860 #853
- added a very basic `os_log` (unified logging) logger #850 #856
- Use `NSFileProtectionType` instead of `NSString` #866
- Optimized timestamp calculation in `DDTTYLogger` #851
- Updated docs #864
- Fix Travis #863
- Fixed nullability of `DDLogMessage.function` #849 `DDExtractFileNameWithoutExtension` #845
- Ignore `Carthage/Build` directory #862
- Updated schemes #859 #857
## [3.1.0 - Swift 3.0.1, Xcode 8.1 on Feb 22nd, 2017](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.1.0)
- Swift 3.0.1 and Xcode 8.1 support via #816
- Fix Carthage build and updated the podspec structure #819 #818 #784 #790 #782 #778 #815
- Fix CLIColor.h not included in umbrella header #781 #796 #813 #783
- Fix crash in `[DDLog log:level:flag:context:file:function:line:tag:format:]` #831 #830
- Code improvements:
- using class properties #779
- nullability #803 #809 #776
- fix static analyzer issues #822 #828
- optimized `USE_DISPATCH_CURRENT_QUEUE_LABEL` and `USE_DISPATCH_GET_CURRENT_QUEUE` macros #829
- fixed dispatch_source_set_timer() usage #834
- fixed misuse of non null parameter in `DDFileLogger fileAttributes` #835
- store calendar in logger queue specifics for multi-thread safety #837
- reenable default `init` method for `DDLogMessage` class #838
- Added option to not copy messages #832
- Added new hooks when adding loggers and formatters #836
- Ability to create new log files every day #736
- Skip messages in ASL logger which are filtered out by the formatter #786 #742
- Fixed #823 by adding a `hash` implementation for `DDFileLogger` - same as `isEqual`, it only considers the `filePath` 7ceed08
- Fix Travis CI build #807
- Updated docs #798 #808 #811 #810 #820
## [3.0.0 - Swift 3.0, Xcode 8 on Sep 21st, 2016](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/3.0.0)
- Swift 3.0 and Xcode 8 support via #769, fixes #771 and #772. Many thanks to @ffried @max-potapov @chrisdoc @BarakRL @devxoul and the others who contributed
## [2.4.0 - Swift 2.3 on Sep 19th, 2016](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/2.4.0)
- Swift 2.3 explicit so that the project compiles on Xcode 8 - #747 #773 fix #762 #763 #766
- CocoaPods 1.0.0 fully adopted - 0f5a793 637dfc1 70439fe #729
- Fix CLIColor.h not found for non-AppKit binaries w/o clang modules #745
- Retrieve the `DDLogLevel` of each logger associated to `DDLog` #753
- updated doc: #727 a9f54c9 #741, diagrams in 8bd128d
- Added CONTRIBUTING, ISSUE and PULL_REQUEST TEMPLATE and added a small Communication section to the Readme
- Fixed an issue with one demo #760
## [2.3.0 - Swift 2.2, Xcode7.3 on May 2nd, 2016](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/2.3.0)
- Updated to Swift 2.2 - #704
- replaced deprecated `__FUNCTION__`, `__FILE__`, `__LINE__` with newly added to Swift 2.2: `#function`, `#file`, `#line`
- Xcode 7.3 update - #692 #662
- simplify usage and integration of the static library target - #657
- DDLog usable via instances - #679
- Swift cleanup - #649
- Enable Application extension API only for tvOS - #701
- Added `appletvos` and `appletvsimulator` to `SUPPORTED_PLATFORMS` and set `TVOS_DEPLOYMENT_TARGET` - #707
- fixed `OSSpinLock` init issue - #653
- Added check to prevent duplicate loggers - #682
- fixed typo in import - #693
- updated the docs - #646 #650 #656 #655 #661 #664 #667 #684 #724
## [2.2.0 - TVOS, Xcode7.1 on Oct 28th, 2015](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/2.2.0)
- added `tvOS` support (thanks [@sinoru](https://github.com/sinoru)) - [#634](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/634) [#640](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/640) [#630](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/630) [#628](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/628) [#618](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/618) [#611](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/611)
- Remove `(escaping)` from the Swift `@autoclosure` parameters - [#642](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/642)
## [2.1.0 - Swift 2.0, WatchOS, Xcode7 on Oct 23rd, 2015](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/2.1.0)
- Fixed the version for the Carthage builds - see [#633](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/633)
- Improved documentation
## [2.1.0 RC - Swift 2.0, WatchOS, Xcode7 on Oct 22nd, 2015](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/2.1.0-rc)
- Refactored the `NSDateFormatter` related code to fix a bunch of issues: [#621](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/621)
- Fix Issue [#488](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/488): Support `DDLog` without `AppKit Dependency` (`#define DD_CLI`): [#627](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/627)
- Re-add `NS_DESIGNATED_INITIALIZER` [#619](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/619)
## [2.1.0 Beta - Swift 2.0, WatchOS, Xcode7 on Oct 12th, 2015](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/2.1.0-beta)
- Updated the library to use Swift 2.0 and Xcode 7 [#617](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/617) [#545](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/545) [#534](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/534)
- WatchOS support (2.0) [#583](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/583) [#581](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/581) [#579](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/579)
## [2.0.3 Patch for 2.0.0 on Oct 13th, 2015](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/2.0.3)
- Compatibility with Xcode 6 that was broken by the 2.0.2 patch - [f042fd3](https://github.com/CocoaLumberjack/CocoaLumberjack/commit/f042fd3)
## [2.0.2 Patch for 2.0.0 on Oct 12th, 2015](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/2.0.2)
- Swift 1.2 fixes [#546](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/546) [#578](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/578) plus and update to Swift 2.0 [5627dff](https://github.com/CocoaLumberjack/CocoaLumberjack/commit/5627dff) imported from our swift_2.0 branch
- Make build work on `tvOS` [#597](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/597)
- Make `CocoaLumberjackSwift-iOS` target depends on `CocoaLumberjack-iOS` [#575](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/575)
- `APPLICATION_EXTENSION_API_ONLY` to `YES` for Extensions [#576](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/576)
- Remove unnecessary `NS_DESIGNATED_INITIALIZER`s [#593](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/593) fixes [#592](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/592)
- Add ignore warning mark for `DDMakeColor` [#553](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/553)
- Kill unused function warnings from `DDTTYLogger.h` [#613](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/613)
- Flag unused parameters as being unused to silence strict warnings [#566](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/566)
- Extend ignore unused warning pragma to cover all platforms [#559](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/559)
- Removed images.xcassets from Mobile project [#580](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/580)
- Silence the Xcode 7 upgrade check - [#595](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/595)
- Fix import for when CL framework files are manually imported into project [#560](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/560)
- Don't override defines in case they're already set at project level [#551](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/551)
- log full filepath when failing to set attribute [#550](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/550)
- Fix issue in standalone build with `DDLegacyMacros.h` [#552](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/552)
- Update `CustomFormatters.md` with proper thread-safe blurb [#555](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/555)
- typo in parameter's variable name fixed [#568](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/568)
- Typo: minor fix [#571](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/571)
- Surely we should be adding 1, not 0 for `OSAtomicAdd32` ? [#587](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/587)
- `rollLogFileWithCompletionBlock` calls back on background queue instead of main queue [#589](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/589)
- Removing extraneous `\` on line 55 [#600](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/600)
- Updated `GettingStarted.md` to include `ddLogLevel` [#602](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/602)
- Remove redundant check for `processorCount` availability [#604](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/604)
## [2.0.1 Patch for 2.0.0 on Jun 25th, 2015](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/2.0.1)
- **Carthage support** [#521](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/521) [#526](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/526)
- fixed crash on `DDASLLogCapture` when `TIME` or `TIME_NSEC` is `NULL` [#484](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/484)
- **Swift** fixes and improvements: [#483](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/483) [#509](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/509) [#518](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/518) [#522](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/522) [5eafceb](https://github.com/CocoaLumberjack/CocoaLumberjack/commit/5eafceb)
- Unit tests: [#500](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/500) [#498](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/498) [#499](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/499)
- Fix [#478](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/478) by reverting [#473](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/473)
- Add `armv7s` to static library [#538](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/538)
- Fix `NSLog` `threadid` mismatch with iOS 8+/OSX 10.10+ [#514](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/514)
- Fixed the `LogV` macros so that avalist is no longer undefined [#511](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/511)
- Using type safe `DDColor` alias instead of #define directive [#506](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/506)
- Several fixes/tweaks to `DDASLLogCapture` [#512](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/512)
- Prevent duplicate log entries when both `DDASLLogCapture` and `DDASLLogger` are used [#515](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/515)
- Fix memory leaks in `DDTTYLogger`, add self annotations to blocks [#536](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/536)
- Update older syntax to modern subscripting for array access [#482](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/482)
- Remove execute permission on non-executable files [#517](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/517)
- Change code samples to use `DDLogFlagWarning` [#520](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/520)
- Fix seemingly obvious typo in the `toLogLevel` function [#508](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/508)
## [CocoaLumberjack 2.0.0 on Mar 13th, 2015](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/2.0.0)
The library was strongly refactored, with a few goals in mind:
- Swift support - that we will release in a separate milestone, since CocoaPods 0.36.0 just got out
- Unit tests support
- reorganised things (on disk)
- better coding style
See [Migration from 1.x to 2.x](https://github.com/CocoaLumberjack/CocoaLumberjack#migrating-to-2x)
## [2.0.0-rc2 on Feb 20th, 2015](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/2.0.0-rc2)
- Bucket of Swift improvements - [#434](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/434) [#437](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/437) [#449](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/449) [#440](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/440)
- Fixed [#433](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/433) (build issue due to dispatch_queue properties) - [#455](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/455)
- Enable codesign for iOS device framework builds - [#444](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/444)
- Declare `automaticallyAppendNewlineForCustomFormatters` properties as `nonatomic` - [#443](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/443)
- Warning fixes & type standardization - [#419](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/419)
- Legacy checks updated - [#424](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/424)
- Documentation updates
## [2.0.0-rc on Dec 11th, 2014](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/2.0.0-rc)
- Fix `dispatch_queue_t` properties.
- Fix `registeredClasses` crashes at launch.
## [2.0.0-beta4 on Nov 7th, 2014](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/2.0.0-beta4)
- Major refactoring and clean up.
- Remove superfluous `log` from property names and use underscore for direct variable access.
- Preliminary Swift support through `CocoaLumberjack.swift`.
- Automatic 1.9.x legacy support when `DDLog.h` is imported instead of the new `CocoaLumberjack.h`.
## [2.0.0-beta3 on Oct 21st, 2014](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/2.0.0-beta3)
- Modernize flag variables to be `NS_OPTIONS`/`NS_ENUM`.
- Change the log flags and levels to `NSUInteger`.
- Fix warning when compiled with assertions blocked.
- Crash fixes.
## [2.0.0-beta2 on Sep 30th, 2014](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/2.0.0-beta2)
- Cleanup code.
- Match `NSLog` read UID functionality in `DDASLLogger`.
- Update framework and static libraries.
## [2.0.0 Beta on Aug 12th, 2014](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/2.0.0-beta)
See [Migrate from 1.x to 2.x](https://github.com/CocoaLumberjack/CocoaLumberjack#migrating-to-2x)
## [1.9.2 Updated patch release for 1.9.0 on Aug 11th, 2014](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.9.2)
- Fixed `NSCalendar components:fromDate:` crash - [#140](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/140) [#307](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/307) [#216](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/216)
- New `DDAssert` macros - [#306](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/306)
- Limit log growth by disk space only, not the number of files - [#195](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/195) [#303](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/303)
- Change the mechanism for adding new line character (i.e. '\n\) to log messages in some logger - [#308](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/308) [#310](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/310)
- Fixed deprecations - [#320](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/320) [#312](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/312) [#317](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/317)
- `aslmsg` not freed and causing memory leak - [#314](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/314)
- Fixed `CompressingLogFileManager` compression bug - [#315](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/315)
- Remove unnecessary `NULL` check before `free()` - [#316](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/316)
## [1.9.1 Patch release for 1.9.0 on Jun 30th, 2014](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.9.1)
- Fixed issues in rolling frequency - [#243](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/243) [#295](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/295) [@georgekola](https://github.com/georgekola)
- Fixed critical issue, `addLogger` method should use a full bit mask instead of `LOG_LEVEL_VERBOSE`, otherwise extended logs or extra flags are ignored [fe6824c](https://github.com/CocoaLumberjack/CocoaLumberjack/commit/fe6824c) [@robbiehanson](https://github.com/robbiehanson)
- Performance optimisation: use compiler macros to skip iOS version checks - [4656d3b](https://github.com/CocoaLumberjack/CocoaLumberjack/commit/4656d3b) [#298](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/298) [#291](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/291) [@robbiehanson](https://github.com/robbiehanson) [@liviur](https://github.com/liviur)
- Changed the `Build Active Architecture Only` to `NO` [#294](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/294) [#293](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/293)
- Optimisation by reusing `NSDateFormatter` instances [#296](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/296) [#301](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/301)
## [1.9.0 New ASL capture module, several File logger fixes on May 23rd, 2014](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.9.0)
- New ASL capture module [#242](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/242) [#263](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/263)
- Override default `NSFileProtection` handling [#285](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/285)
- Replaced warnings when ARC was not enabled with errors [#284](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/284)
- Fix for issue [#278](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/278) where really large log files can keep growing [#280](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/280)
- Fixed Xcode warnings [#279](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/279)
- Update `calendarUnitFlags` with new iOS SDK values [#277](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/277)
- Fix possible crash in `[NSCalendar components:fromDate:]` [#277](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/277)
- Fix [#262](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/262) inverted ifs when renaming log [#264](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/264)
- Proper way of doing singletons (via `dispatch_once`) [#259](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/259)
- Explicitly declare `DDFileLogger` and `DDDispatchQueueLogFormatter ` properties as atomic to avoid Xcode warnings [#258](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/258)
- Set `NSFileProtectionKey` on the temporary file created during compression [#256](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/256)
- Fix a rare crash in `CompressingLogFileManager` caused by an unchecked result from read [#255](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/255)
- Add explicit casts for integer conversion [#253](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/253)
- Replace use of `NSThread.detachNewThreadSelector` [#251](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/251)
- Add a constructor override for `initWithLogsDirectory:` [#252](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/252)
- Check and log the streamError whenever we fail to write during compression and log any failures when removing the original file or cleaning up the temporary file after compression failed [#250](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/250)
- Following Apple's guidelines for iOS Static Libraries [#249](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/249)
- Some extra warnings for the mobile framework xcode project [a2e5666](https://github.com/CocoaLumberjack/CocoaLumberjack/commit/a2e5666)
- Update `FineGrainedLoggingAppDelegate.m` [#244](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/244)
- New `[DDLog log:message:]` primitive [7f8af2e](https://github.com/CocoaLumberjack/CocoaLumberjack/commit/7f8af2e)
- Fixed issue [#181](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/181) when logging messages in iOS7 devices aren't properly retrieved by `asl_search` [#240](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/240)
- Allow prevention of log file reuse [#238](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/238)
- `DDTTYLogger`: Favour XcodeColors environment variable [#237](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/237)
- `DDLog`: calling `atexit_b` in CLI applications, that use Foundation framework [#234](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/234)
## [1.8.1 AllLoggers and bugfixes on Feb 14th, 2014](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.8.1)
- read access to all loggers - [#217](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/217) [#219](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/219)
- fixed bug with archived logs not being handled correctly on iOS simulator - [#218](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/218)
- log the `strerror(errno)` value when `setxattr()` fails - [#211](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/211)
- Add a check for an archived log before overwriting - [#214](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/214)
- improved safety by using assertions instead of comments (`DDLog` in the core) - [#221](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/221)
- added Lumberjack logo :)
## [1.8.0 Better CL support, custom logfile name format, bugfixes on Jan 21st, 2014](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.8.0)
- `DDFileLogger` custom logfile (name) format - [#208](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/208)
- Security static analysis fix - [#202](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/202)
- `DDFileLogger`: using `CFBundleIdentifier` as a log filename prefix on OSX and iOS - [#206](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/206)
- Allow disabling of specific levels per-logger - [#204](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/204)
- Improve support for OS X command line tools - [#194](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/194)
- `DDFileLogger`: fixed crash that occurred in case if application name == nil - [#198](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/198)
- `DDFileLogger`: fixed comment - [#199](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/199)
- Fix Travis - [#205](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/205)
## [1.7.0 New log file naming convention and CocoaLumberjack organisation on Dec 10th, 2013](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.7.0)
- new log file naming convention - [#191](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/191)
- completed transition to **CocoaLumberjack** organisation - [#188](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/188)
## [1.6.5.1 Patch release for Xcode 4.4+ compatibility on Dec 4th, 2013](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.6.5.1)
- fixed compatibility with Xcode 4.4+ [#187](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/187)
## [1.6.5 File Logger refactoring, Multi Formatter, preffixed extension classes on Dec 3rd, 2013](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.6.5)
`DDFileLogger` refactoring and fixes (thanks [@dvor](https://github.com/dvor) and [@an0](https://github.com/an0)):
- Fixed [#63](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/63) Loggers don't flush in Command Line Tool [#184](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/184)
- Fixed [#52](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/52) Force log rotation [#183](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/183)
- Fixed [#55](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/55) After deleting log file or log dir they aren't created again without relaunching the app [#183](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/183)
- Fixed [#129](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/129) [iOS] `DDFileLogger` causes crash when logging from background app [#183](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/183)
- Fixed [#153](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/153) Log file on iPhone only contains a single line [#177](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/177)
- Fixed [#155](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/155) How do I combine all my log levels into one file? [#177](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/177)
- Fixed [#175](https://github.com/CocoaLumberjack/CocoaLumberjack/issues/175) `DFileLogger` `creationDate` bug on 64-bit iOS system [#177](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/177)
- Allow customizing the naming convention for log files to use timestamps [#174](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/174)
Other:
- Implemented multiple formatter (`DDMultiFormatter` - alows chaining of formatters) [#178](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/178)
- Added DD prefix to extension classes (`ContextFilterLogFormatter` and `DispatchQueueLogFormatter`) [#178](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/178)
- Updated code indentation: Tabs changed to spaces [#180](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/180)
- Included `DDLog+LOGV.h` in Cocoapods sources [d253bd7](https://github.com/CocoaLumberjack/CocoaLumberjack/commit/d253bd7)
- other fixes/improvements
## [1.6.4 Fix compatibility with 3rd party frameworks on Nov 21st, 2013](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.6.4)
* "Fix" conflicts with 3rd party libraries using `CocoaLumberjack` [#172](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/172)
* Ignore deprecated warning for `dispatch_get_current_queue` [#167](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/167)
* Add new `DEBUG` log level support to included loggers [#166](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/166)
* Method declarations that make it easier to extend/modify `DispatchQueueLogFormatter` [#164](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/164)
## [1.6.3 New macros, updated podspec and bug fixes on Apr 2nd, 2013](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.6.3)
* Add `LOGV`-style macros [#161](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/161)
* Fix getting queue's label [#159](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/159)
* New log level `DEBUG` [#145](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/145)
* Use `DISPATCH_CURRENT_QUEUE_LABEL` if available [#159](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/159)
* Different `logLevel` per each logger [#151](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/151)
* Created 2 subspecs, `Core` and `Extensions` [#152](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/152)
* Updated observer for keypath using `NSStringFromSelector` + `@selector` [38e5da3](https://github.com/CocoaLumberjack/CocoaLumberjack/commit/38e5da3)
* Replaced `id` return type with `instancetype` [ebee454](https://github.com/CocoaLumberjack/CocoaLumberjack/commit/ebee454)
* Remove implicit conversion warnings [#149](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/149)
* `DDTTYLogger`: Allow to set default color profiles for all contexts at once [#146](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/146) [#158](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/158)
* `DDTTYLogger`: By default apply `setForegroundColor:backgroundColor:forFlag:` to `LOG_CONTEXT_ALL` [#154](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/154)
* `DispatchQueueLogFormatter`: Use modern Objective-C [#142](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/142)
* `DispatchQueueLogFormatter`: Make sure to always use a `NSGregorianCalendar` for date formatter [#142](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/142)
* Replaced explicit reference to class name in `logFileWithPath` factory method [#131](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/131)
* Catch exceptions in `logMessage:` [#130](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/130)
* Fix enum type conversion warnings [#124](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/124)
* Add deployment target condition for workaround [#121](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/121)
* Fix static analyzer warnings about `nil` values in dictionary [#122](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/122)
* Fix `dispatch_get_current_queue` crash [#121](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/121)
* Fixing colors in greyscale color-space not working [d019cfd](https://github.com/CocoaLumberjack/CocoaLumberjack/commit/d019cfd)
* Guard around `dispatch_resume()` being called with null pointer [#107](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/107)
* `NULL` safety checks [#107](https://github.com/CocoaLumberjack/CocoaLumberjack/pull/107)
## [1.6.2 on Apr 2nd, 2013](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.6.2)
## [1.6.1 on Apr 2nd, 2013](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.6.1)
## [1.6 on Jul 3rd, 2012](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.6)
## [1.5.1 on Jul 3rd, 2012](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.5.1)
## [1.5 on Jul 3rd, 2012](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.5)
## [1.4.1 on Jul 3rd, 2012](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.4.1)
## [1.4 on Jul 3rd, 2012](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.4)
## [1.3.3 on Mar 30th, 2012](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.3.3)
## [1.3.2 on Dec 23rd, 2011](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.3.2)
## [1.3.1 on Dec 9th, 2011](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.3.1)
## [1.3 on Dec 9th, 2011](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.3)
## [1.2.3 on Dec 9th, 2011](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.2.3)
## [1.2.2 on Dec 9th, 2011](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.2.2)
## [1.2.1 on Oct 13th, 2011](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.2.1)
## [1.2 on Oct 13th, 2011](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.2)
## [1.1 on Oct 13th, 2011](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.1)
## [1.0 on Oct 13th, 2011](https://github.com/CocoaLumberjack/CocoaLumberjack/releases/tag/1.0)
@@ -0,0 +1,39 @@
Pod::Spec.new do |s|
s.name = 'CocoaLumberjack'
s.version = '3.7.2'
s.license = 'BSD'
s.summary = 'A fast & simple, yet powerful & flexible logging framework for macOS, iOS, tvOS and watchOS.'
s.homepage = 'https://github.com/CocoaLumberjack/CocoaLumberjack'
s.author = { 'Robbie Hanson' => 'robbiehanson@deusty.com' }
s.source = { :git => 'https://github.com/CocoaLumberjack/CocoaLumberjack.git',
:tag => "#{s.version}" }
s.description = 'It is similar in concept to other popular logging frameworks such as log4j, ' \
'yet is designed specifically for objective-c, and takes advantage of features ' \
'such as multi-threading, grand central dispatch (if available), lockless ' \
'atomic operations, and the dynamic nature of the objective-c runtime.'
s.preserve_paths = 'README.md'
s.ios.deployment_target = '9.0'
s.osx.deployment_target = '10.10'
s.watchos.deployment_target = '3.0'
s.tvos.deployment_target = '9.0'
s.cocoapods_version = '>= 1.4.0'
s.requires_arc = true
s.swift_version = '5.0'
s.default_subspecs = 'Core'
s.subspec 'Core' do |ss|
ss.source_files = 'Sources/CocoaLumberjack/**/*.{h,m}'
ss.private_header_files = 'Sources/CocoaLumberjack/DD*Internal.{h}'
end
s.subspec 'Swift' do |ss|
ss.dependency 'CocoaLumberjack/Core'
ss.source_files = 'Sources/CocoaLumberjackSwift/**/*.swift', 'Sources/CocoaLumberjackSwiftSupport/include/**/*.{h}'
end
end
@@ -0,0 +1,11 @@
// Configuration settings file format documentation can be found at:
// https://help.apple.com/xcode/#/dev745c5c974
#include "Module-Debug.xcconfig"
#include "App-Shared.xcconfig"
// Space-separated list of preprocessor macros of the form `foo` or `foo=bar`
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) DEBUG=1 DD_LOG_LEVEL=DDLogLevelAll
// A list of compilation conditions to enable for conditional compilation expressions.
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG
@@ -0,0 +1,8 @@
// Configuration settings file format documentation can be found at:
// https://help.apple.com/xcode/#/dev745c5c974
#include "Module-Release.xcconfig"
#include "App-Shared.xcconfig"
// Space-separated list of preprocessor macros of the form `foo` or `foo=bar`
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) DD_LOG_LEVEL=DDLogLevelWarning
@@ -0,0 +1,5 @@
// Configuration settings file format documentation can be found at:
// https://help.apple.com/xcode/#/dev745c5c974
// Code will load on this and later versions of watchOS. Framework APIs that are unavailable in earlier versions will be weak-linked; your code should check for null function pointers or specific system versions before calling newer APIs.
WATCHOS_DEPLOYMENT_TARGET = 5.0
@@ -0,0 +1,37 @@
// Configuration settings file format documentation can be found at:
// https://help.apple.com/xcode/#/dev745c5c974
#include "Module-Shared.xcconfig"
// Specifies whether binary files that are copied during the build, such as in a Copy Bundle Resources or Copy Files build phase, should be stripped of debugging symbols.
COPY_PHASE_STRIP = NO
// The type of debug information to produce.
DEBUG_INFORMATION_FORMAT = dwarf
// Controls whether assertion logic provided by `NSAssert` is included in the preprocessed source code or is elided during preprocessing.
ENABLE_NS_ASSERTIONS = YES
// When this setting is activated, the product will be built with options appropriate for running automated tests, such as making private interfaces accessible to the tests.
ENABLE_TESTABILITY = YES
// Specifies the degree to which the generated code is optimized for speed and binary size.
GCC_OPTIMIZATION_LEVEL = 0
// Space-separated list of preprocessor macros of the form `foo` or `foo=bar`
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) DEBUG=1
// Metal debug info - not sure why we need it
MTL_ENABLE_DEBUG_INFO = YES
// If enabled, only the active architecture is built.
ONLY_ACTIVE_ARCH = YES
// This setting controls the way the Swift files in a module are rebuilt.
SWIFT_COMPILATION_MODE = singlefile
// Swift optimization (none, speed, size, wholemodule)
SWIFT_OPTIMIZATION_LEVEL = -Onone
// If enabled, perform validation checks on the product as part of the build process.
VALIDATE_PRODUCT = NO
@@ -0,0 +1,34 @@
// Configuration settings file format documentation can be found at:
// https://help.apple.com/xcode/#/dev745c5c974
#include "Module-Shared.xcconfig"
// Specifies whether binary files that are copied during the build, such as in a Copy Bundle Resources or Copy Files build phase, should be stripped of debugging symbols.
COPY_PHASE_STRIP = YES
// The type of debug information to produce.
DEBUG_INFORMATION_FORMAT = dwarf-with-dsym
// Controls whether assertion logic provided by `NSAssert` is included in the preprocessed source code or is elided during preprocessing.
ENABLE_NS_ASSERTIONS = NO
// When this setting is activated, the product will be built with options appropriate for running automated tests, such as making private interfaces accessible to the tests.
ENABLE_TESTABILITY = NO
// Specifies the degree to which the generated code is optimized for speed and binary size.
GCC_OPTIMIZATION_LEVEL = s
// Metal debug info
MTL_ENABLE_DEBUG_INFO = NO
// If enabled, only the active architecture is built.
ONLY_ACTIVE_ARCH = NO
// This setting controls the way the Swift files in a module are rebuilt.
SWIFT_COMPILATION_MODE = wholemodule
// Swift optimization (none, speed, size, wholemodule)
SWIFT_OPTIMIZATION_LEVEL = -O
// If enabled, perform validation checks on the product as part of the build process.
VALIDATE_PRODUCT = YES
@@ -0,0 +1,248 @@
// Configuration settings file format documentation can be found at:
// https://help.apple.com/xcode/#/dev745c5c974
// This setting is deprecated as of Xcode 8.3 and may not be supported in future versions. It is recommended that you disable the setting. If enabled, both `#include <header.h>`-style and `#include "header.h"`-style directives search the paths in `USER_HEADER_SEARCH_PATHS` before `HEADER_SEARCH_PATHS`
ALWAYS_SEARCH_USER_PATHS = NO
// Warn whn using non-localized strings.
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
// Warn for missing nullability attributes
CLANG_ANALYZER_NONNULL = YES
// Warn when a number object, such as an instance of `NSNumber`, `CFNumberRef`, `OSNumber`, or `OSBoolean` is compared or converted to a primitive value instead of another object.
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE
// Choose a standard or non-standard C++ language dialect.
CLANG_CXX_LANGUAGE_STANDARD = gnu++0x
// Choose a version of the C++ standard library to use.
CLANG_CXX_LIBRARY = libc++
// Enables the use of modules for system APIs. System headers are imported as semantic modules instead of raw headers.
CLANG_ENABLE_MODULES = YES
// Compiles reference-counted Objective-C code (when garbage collection is not enabled) to use Automatic Reference Counting.
CLANG_ENABLE_OBJC_ARC = YES
// Warn about block captures of implicitly autoreleasing parameters.
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES
// Warn about implicit conversions to boolean values that are suspicious. For example, writing `if (foo)` where `foo` is the name a function will trigger a warning.
CLANG_WARN_BOOL_CONVERSION = YES
// Warn about suspicious uses of the comma operator.
CLANG_WARN_COMMA = YES
// Warn about implicit conversions of constant values that cause the constant value to change, either through a loss of precision, or entirely in its meaning.
CLANG_WARN_CONSTANT_CONVERSION = YES
// Warn if an Objective-C class either subclasses a deprecated class or overrides a method that has been marked deprecated or unavailable.
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES
// Warn about direct accesses to the Objective-C `isa` pointer instead of using a runtime API.
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR
// Warns about issues in documentation comments (`doxygen`-style) such as missing or incorrect documentation tags.
CLANG_WARN_DOCUMENTATION_COMMENTS = YES
// Warn about declaring the same method more than once within the same `@interface`.
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES
// Warn about loop bodies that are suspiciously empty.
CLANG_WARN_EMPTY_BODY = YES
// Warn about implicit conversions between different kinds of enum values. For example, this can catch issues when using the wrong enum flag as an argument to a function or method.
CLANG_WARN_ENUM_CONVERSION = YES
// Warn if all paths through a function call itself.
CLANG_WARN_INFINITE_RECURSION = YES
// Warn about implicit conversions between pointers and integers. For example, this can catch issues when one incorrectly intermixes using `NSNumber*`'s and raw integers.
CLANG_WARN_INT_CONVERSION = YES
// Warn about non-literal expressions that evaluate to zero being treated as a null pointer.
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES
// Warn about `@property` declarations that are implicitly atomic.
CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = NO
// Warn about implicit retains of `self` within blocks, which can create a retain-cycle.
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES
// Warn about implicit conversions from Objective-C literals to values of incompatible type.
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES
// Warn about classes that unintentionally do not subclass a root class, such as `NSObject`.
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR
// Warns when a quoted include is used instead of a framework style include in a framework header.
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES
// Warn about ranged-based for loops.
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES
// Warn about non-prototype declarations.
CLANG_WARN_STRICT_PROTOTYPES = YES
// Warn about suspicious uses of `std::move`.
CLANG_WARN_SUSPICIOUS_MOVE = YES
// Warn if an API that is newer than the deployment target is used without "if (@available(...))" guards.
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE
// Warns about potentially unreachable code.
CLANG_WARN_UNREACHABLE_CODE = YES
// The path to a file specifying code-signing entitlements.
CODE_SIGN_ENTITLEMENTS =
// The name, also known as the *common name*, of a valid code-signing certificate in a keychain within your keychain path. A missing or invalid certificate will cause a build error.
CODE_SIGN_IDENTITY =
// This setting defines the current version of the project. The value must be a integer or floating point number, such as `57` or `365.8`.
CURRENT_PROJECT_VERSION = 1
// If enabled, the product will be treated as defining its own module. This enables automatic production of LLVM module map files when appropriate, and allows the product to be imported as a module.
DEFINES_MODULE = YES
// macOS Catalyst support
DERIVE_MACCATALYST_PRODUCT_BUNDLE_IDENTIFIER = NO
// Determines the compatibility version of the resulting library, bundle, or framework binary.
DYLIB_COMPATIBILITY_VERSION = 1
// This setting defines the current version of any framework built by the project. As with `CURRENT_PROJECT_VERSION`, the value must be an integer or floating point number, such as `57` or `365.8`.
DYLIB_CURRENT_VERSION = 1
// Sets the base value for the internal `install path` (`LC_ID_DYLIB`) in a dynamic library. This will be combined with the `EXECUTABLE_PATH` to form the full install path.
DYLIB_INSTALL_NAME_BASE = @rpath
// Activating this setting indicates that the target or project should generate bitcode during compilation for platforms and architectures that support it. For Archive builds, bitcode will be generated in the linked binary for submission to the App Store. For other builds, the compiler and linker will check whether the code complies with the requirements for bitcode generation, but will not generate actual bitcode.
ENABLE_BITCODE = YES
ENABLE_BITCODE[sdk=macosx*] = NO
// Controls whether `objc_msgSend` calls must be cast to the appropriate function pointer type before being called.
ENABLE_STRICT_OBJC_MSGSEND = YES
// This is a list of paths to folders containing frameworks to be searched by the compiler for both included or imported header files when compiling C, Objective-C, C++, or Objective-C++, and by the linker for frameworks used by the product. Paths are delimited by whitespace, so any paths with spaces in them must be properly quoted.
FRAMEWORK_SEARCH_PATHS = $(inherited)
// Choose a standard or non-standard C language dialect.
GCC_C_LANGUAGE_STANDARD = gnu99
// Faster function calls for applications. Not appropriate for shared libraries, which need to be position-independent.
GCC_DYNAMIC_NO_PIC = NO
// In C, allocate even uninitialized global variables in the data section of the object file, rather than generating them as common blocks.
GCC_NO_COMMON_BLOCKS = YES
// When enabled, all symbols are declared `private extern` unless explicitly marked to be exported using `\_\_attribute\_\_((visibility("default")))` in code. If not enabled, all symbols are exported unless explicitly marked as `private extern`.
GCC_SYMBOLS_PRIVATE_EXTERN = NO
// Enabling this option causes all warnings to be treated as errors.
GCC_TREAT_WARNINGS_AS_ERRORS = NO
// Warn if a value is implicitly converted from a 64-bit type to a 32-bit type. This is a subset of the warnings provided by -Wconversion.
GCC_WARN_64_TO_32_BIT_CONVERSION = YES
// Warn if a structure's initializer has some fields missing.
GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES
// Warn when a source file does not end with a newline.
GCC_WARN_ABOUT_MISSING_NEWLINE = YES
// Causes warnings to be emitted about missing prototypes.
GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES
// Causes warnings to be emitted when a function with a defined return type (not `void`) contains a return statement without a return-value. Also emits a warning when a function is defined without specifying a return type.
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR
// Warn if an aggregate or union initializer is not fully bracketed.
GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES
// Warn whenever a local variable shadows another local variable, parameter or global variable or whenever a builtin function is shadowed.
GCC_WARN_SHADOW = YES
// Warn when a comparison between signed and unsigned values could produce an incorrect result when the signed value is converted to unsigned.
GCC_WARN_SIGN_COMPARE = YES
// Warn if a `@selector(...)` expression referring to an undeclared selector is found. A selector is considered undeclared if no method with that name has been declared before the `@selector(...)` expression, either explicitly in an `@interface` or `@protocol` declaration, or implicitly in an `@implementation` section.
GCC_WARN_UNDECLARED_SELECTOR = YES
// Warn if a variable might be clobbered by a `setjmp` call or if an automatic variable is used without prior initialization. The compiler may not detect all cases where an automatic variable is initialized or all usage patterns that may lead to use prior to initialization.
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE
// Warn whenever a static function is declared but not defined or a noninline static function is unused.
GCC_WARN_UNUSED_FUNCTION = YES
// Warn whenever a label is declared but not used.
GCC_WARN_UNUSED_LABEL = YES
// Warn whenever a function parameter is unused aside from its declaration.
GCC_WARN_UNUSED_PARAMETER = NO
// Warn whenever a local variable or nonconstant static variable is unused aside from its declaration.
GCC_WARN_UNUSED_VARIABLE = YES
// This is a list of paths to folders to be searched by the compiler for included or imported header files when compiling C, Objective-C, C++, or Objective-C++. Paths are delimited by whitespace, so any paths with spaces in them need to be properly quoted.
HEADER_SEARCH_PATHS = $(inherited)
// Code will load on this and later versions of iOS. Framework APIs that are unavailable in earlier versions will be weak-linked; your code should check for null function pointers or specific system versions before calling newer APIs.
IPHONEOS_DEPLOYMENT_TARGET = 9.0
// This is a list of paths to be added to the `runpath` search path list for the image being created. At runtime, `dyld` uses the `runpath` when searching for dylibs whose load path begins with `@rpath/`.
LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/Frameworks @loader_path/Frameworks
// This is a list of paths to folders to be searched by the linker for libraries used by the product. Paths are delimited by whitespace, so any paths with spaces in them need to be properly quoted.
LIBRARY_SEARCH_PATHS = $(inherited)
// Code will load on this and later versions of macOS. Framework APIs that are unavailable in earlier versions will be weak-linked; your code should check for null function pointers or specific system versions before calling newer APIs.
MACOSX_DEPLOYMENT_TARGET = 10.10
MARKETING_VERSION = 3.7.2
OTHER_C_FLAGS = -Wextra
// Options defined in this setting are passed to invocations of the linker.
OTHER_LDFLAGS = -ObjC
// A string that uniquely identifies the bundle. The string should be in reverse DNS format using only alphanumeric characters (`A-Z`, `a-z`, `0-9`), the dot (`.`), and the hyphen (`-`). This value is used as the `CFBundleIdentifier` in the `Info.plist` of the built bundle.
PRODUCT_BUNDLE_IDENTIFIER_PREFIX = com.deusty
PRODUCT_BUNDLE_IDENTIFIER = $(PRODUCT_BUNDLE_IDENTIFIER_PREFIX).${PRODUCT_NAME:rfc1034identifier}
// This is the basename of the product generated by the target.
PRODUCT_NAME = $(TARGET_NAME)
// Must contain a profile name (or UUID). A missing or invalid profile will cause a build error. Use in conjunction with [DEVELOPMENT_TEAM] to fully specify provisioning profile.
PROVISIONING_PROFILE_SPECIFIER =
// Activating this setting will cause Xcode to run the `Clang` static analysis tool on qualifying source files during every build.
RUN_CLANG_STATIC_ANALYZER = YES
// The name or path of the base SDK being used during the build. The product will be built against the headers and libraries located inside the indicated SDK. This path will be prepended to all search paths, and will be passed through the environment to the compiler and linker. Additional SDKs can be specified in the `ADDITIONAL_SDKS` setting.
SDKROOT = macosx
// If enabled, don't install built products even if deployment locations are active.
SKIP_INSTALL = YES
// The list of supported platforms from which a base SDK can be used. This setting is used if the product can be built for multiple platforms using different SDKs.
SUPPORTED_PLATFORMS = macosx iphoneos iphonesimulator watchsimulator watchos appletvsimulator appletvos
// macOS Catalyst support
SUPPORTS_MACCATALYST = YES
// Swift language version
SWIFT_VERSION = 5.0
// The build system uses the selected device to set the correct value for the `UIDeviceFamily` key it adds to the target's `Info.plist` file. This also drives the --target-device flag to actool, which determines the idioms selected during catalog compilation for iOS platforms.
TARGETED_DEVICE_FAMILY = 1,2,3,4
// Code will load on this and later versions of tvOS. Framework APIs that are unavailable in earlier versions will be weak-linked; your code should check for null function pointers or specific system versions before calling newer APIs.
TVOS_DEPLOYMENT_TARGET = 9.0
// Selects the process used for version-stamping generated files. * *None:* Use no versioning system. * *Apple Generic:* Use the current project version setting. [apple-generic]
VERSIONING_SYSTEM = apple-generic
// Code will load on this and later versions of watchOS. Framework APIs that are unavailable in earlier versions will be weak-linked; your code should check for null function pointers or specific system versions before calling newer APIs.
WATCHOS_DEPLOYMENT_TARGET = 3.0
+207
View File
@@ -0,0 +1,207 @@
import Foundation
import Danger
fileprivate extension Danger.File {
var isInSources: Bool { hasPrefix("Sources/") }
var isInTests: Bool { hasPrefix("Tests/") }
var isInDemos: Bool { hasPrefix("Demos/") }
var isInBenchmarking: Bool { hasPrefix("Benchmarking/") }
var isInVendor: Bool { contains("/Vendor/") }
var isInFMDB: Bool { contains("/FMDB/") }
var isSourceFile: Bool {
hasSuffix(".swift") || hasSuffix(".h") || hasSuffix(".m")
}
private static let spmOnlyTargetNames: Set<String> = [
"CocoaLumberjackSwiftLogBackend",
]
var isSPMOnlySourceFile: Bool {
guard isSourceFile else { return false }
if isInSources {
return Self.spmOnlyTargetNames.contains(where: { contains("/\($0)/") })
} else if isInTests {
return Self.spmOnlyTargetNames.contains(where: { contains("/\($0)Tests/") })
}
return false
}
var isSwiftPackageDefintion: Bool {
hasPrefix("Package") && hasSuffix(".swift")
}
var isDangerfile: Bool {
self == "Dangerfile.swift"
}
}
let danger = Danger()
let git = danger.git
// Sometimes it's a README fix, or something like that - which isn't relevant for
// including in a project's CHANGELOG for example
let isDeclaredTrivial = danger.github?.pullRequest.title.contains("#trivial") ?? false
let hasSourceChanges = (git.modifiedFiles + git.createdFiles).contains { $0.isInSources }
// Make it more obvious that a PR is a work in progress and shouldn't be merged yet
if danger.github?.pullRequest.title.contains("WIP") == true {
warn("PR is marked as Work in Progress")
}
// Warn when there is a big PR
if let additions = danger.github?.pullRequest.additions, let deletions = danger.github?.pullRequest.deletions,
case let sum = additions + deletions, sum > 1000 {
warn("Pull request is relatively big (\(sum) lines changed). If this PR contains multiple changes, consider splitting it into separate PRs for easier reviews.")
}
// Changelog entries are required for changes to library files.
if hasSourceChanges && !isDeclaredTrivial && !git.modifiedFiles.contains("CHANGELOG.md") {
warn("Any changes to library code should be reflected in the CHANGELOG. Please consider adding a note there about your change.")
}
// Warn when library files has been updated but not tests.
if hasSourceChanges && !git.modifiedFiles.contains(where: { $0.isInTests }) {
warn("The library files were changed, but the tests remained unmodified. Consider updating or adding to the tests to match the library changes.")
}
// Run SwiftLint
SwiftLint.lint(.modifiedAndCreatedFiles(directory: "Sources"))
// Added (or removed) library files need to be added (or removed) from the
// Carthage Xcode project to avoid breaking things for our Carthage users.
let xcodeProjectFile: Danger.File = "Lumberjack.xcodeproj/project.pbxproj"
let xcodeProjectWasModified = git.modifiedFiles.contains(xcodeProjectFile)
if (git.createdFiles + git.deletedFiles).contains(where: { $0.isInSources && $0.isSourceFile && !$0.isSPMOnlySourceFile })
&& !xcodeProjectWasModified {
fail("Added or removed library files require the Carthage Xcode project to be updated.")
}
// Check if Carthage modified and CocoaPods didn't or vice-versa
let podspecWasModified = git.modifiedFiles.contains("CocoaLumberjack.podspec")
if xcodeProjectWasModified && !podspecWasModified {
warn("The Carthage project was modified but CocoaPods podspec wasn't. Did you forget to update the podspec?")
}
if !xcodeProjectWasModified && podspecWasModified {
warn("The CocoaPods podspec was modified but the Carthage project wasn't. Did you forget to update the xcodeproj?")
}
// Check xcodeproj settings are not changed
// Check to see if any of our project files contains a line with "SOURCE_ROOT" which indicates that the file isn't in sync with Finder.
if xcodeProjectWasModified {
let acceptedSettings: Set<String> = [
"APPLICATION_EXTENSION_API_ONLY",
"ASSETCATALOG_COMPILER_APPICON_NAME",
"ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME",
"ATTRIBUTES",
"CODE_SIGN_IDENTITY",
"COMBINE_HIDPI_IMAGES",
"FRAMEWORK_VERSION",
"GCC_PRECOMPILE_PREFIX_HEADER",
"GCC_PREFIX_HEADER",
"IBSC_MODULE",
"INFOPLIST_FILE",
"MODULEMAP_FILE",
"PRIVATE_HEADERS_FOLDER_PATH",
"PRODUCT_BUNDLE_IDENTIFIER",
"PRODUCT_NAME",
"PUBLIC_HEADERS_FOLDER_PATH",
"SDKROOT",
"SUPPORTED_PLATFORMS",
"TARGETED_DEVICE_FAMILY",
"WRAPPER_EXTENSION",
]
[xcodeProjectFile]
.lazy
.filter { FileManager.default.fileExists(atPath: $0) }
.forEach { projectFile in
danger.utils.readFile(projectFile).split(separator: "\n").enumerated().forEach { (offset, line) in
if line.contains("sourceTree = SOURCE_ROOT;") &&
line.contains("PBXFileReference") &&
!line.contains("path = Sources/CocoaLumberjackSwiftSupport/include/") {
warn(message: "Files should be in sync with project structure", file: projectFile, line: offset + 1)
}
if let range = line.range(of: "[A-Z_]+ = .*;", options: .regularExpression) {
let setting = String(line[range].prefix(while: { $0 != " " }))
if !acceptedSettings.contains(setting) {
warn(message: "Xcode settings need to remain in Configs/*.xcconfig. Please move " + setting + " to the xcconfig file", file: projectFile, line: offset + 1)
}
}
}
}
}
// Check Copyright
let copyrightLines = (
source: [
"// Software License Agreement (BSD License)",
"//",
"// Copyright (c) 2010-2021, Deusty, LLC",
"// All rights reserved.",
"//",
"// Redistribution and use of this software in source and binary forms,",
"// with or without modification, are permitted provided that the following conditions are met:",
"//",
"// * Redistributions of source code must retain the above copyright notice,",
"// this list of conditions and the following disclaimer.",
"//",
"// * Neither the name of Deusty nor the names of its contributors may be used",
"// to endorse or promote products derived from this software without specific",
"// prior written permission of Deusty, LLC.",
],
demos: [
"//",
"// ",
"// ",
"//",
"// CocoaLumberjack Demos",
"//",
],
benchmarking: [
"//",
"// ",
"// ",
"//",
"// CocoaLumberjack Benchmarking",
"//",
]
)
// let sourcefilesToCheck = Dir.glob("*/*/*") // uncomment when we want to test all the files (locally)
let sourcefilesToCheck = Set(git.modifiedFiles + git.createdFiles)
let filesWithInvalidCopyright = sourcefilesToCheck.lazy
.filter { $0.isSourceFile }
.filter { !$0.isSwiftPackageDefintion }
.filter { !$0.isDangerfile }
.filter { !$0.isInVendor && !$0.isInFMDB }
.filter { FileManager.default.fileExists(atPath: $0) }
.filter {
// Use correct copyright lines depending on source file location
let (expectedLines, shouldMatchExactly): (Array<String>, Bool)
if $0.isInDemos {
expectedLines = copyrightLines.demos
shouldMatchExactly = false
} else if $0.isInBenchmarking {
expectedLines = copyrightLines.benchmarking
shouldMatchExactly = false
} else {
expectedLines = copyrightLines.source
shouldMatchExactly = true
}
let actualLines = danger.utils.readFile($0).split(separator: "\n").lazy.map(String.init)
if shouldMatchExactly {
return !actualLines.starts(with: expectedLines)
} else {
return !zip(actualLines, expectedLines).allSatisfy { $0.starts(with: $1) }
}
}
if !filesWithInvalidCopyright.isEmpty {
filesWithInvalidCopyright.forEach {
markdown(message: "Invalid copyright!", file: $0, line: 1)
}
warn("""
Copyright is not valid. See our default copyright in all of our files (Sources, Demos and Benchmarking use different formats).
Invalid files:
\(filesWithInvalidCopyright.map { "- \($0)" }.joined(separator: "\n"))
""")
}
@@ -0,0 +1,319 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
0A7D8F9C217A10A000B496D7 /* CocoaLumberjack.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0A7D8F9B217A10A000B496D7 /* CocoaLumberjack.framework */; };
DCC29DE114730AA9005E8FD4 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCC29DE014730AA9005E8FD4 /* Cocoa.framework */; };
DCC29DEB14730AA9005E8FD4 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = DCC29DE914730AA9005E8FD4 /* InfoPlist.strings */; };
DCC29DED14730AA9005E8FD4 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = DCC29DEC14730AA9005E8FD4 /* main.m */; };
DCC29DF114730AA9005E8FD4 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = DCC29DEF14730AA9005E8FD4 /* Credits.rtf */; };
DCC29DF414730AA9005E8FD4 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = DCC29DF314730AA9005E8FD4 /* AppDelegate.m */; };
DCC29DF714730AA9005E8FD4 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = DCC29DF514730AA9005E8FD4 /* MainMenu.xib */; };
DCC29E1F14730B05005E8FD4 /* BaseNSLogging.m in Sources */ = {isa = PBXBuildFile; fileRef = DCC29E1814730B05005E8FD4 /* BaseNSLogging.m */; };
DCC29E2014730B05005E8FD4 /* DynamicLogging.m in Sources */ = {isa = PBXBuildFile; fileRef = DCC29E1A14730B05005E8FD4 /* DynamicLogging.m */; };
DCC29E2114730B05005E8FD4 /* PerformanceTesting.m in Sources */ = {isa = PBXBuildFile; fileRef = DCC29E1C14730B05005E8FD4 /* PerformanceTesting.m */; };
DCC29E2214730B05005E8FD4 /* StaticLogging.m in Sources */ = {isa = PBXBuildFile; fileRef = DCC29E1E14730B05005E8FD4 /* StaticLogging.m */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
0A7D8F9B217A10A000B496D7 /* CocoaLumberjack.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = CocoaLumberjack.framework; sourceTree = BUILT_PRODUCTS_DIR; };
43AF80212174E19700C0D9DC /* Module-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Module-Release.xcconfig"; sourceTree = "<group>"; };
43AF80222174E19700C0D9DC /* Module-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Module-Debug.xcconfig"; sourceTree = "<group>"; };
43AF80232174E19700C0D9DC /* Module-Shared.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Module-Shared.xcconfig"; sourceTree = "<group>"; };
DCC29DDC14730AA9005E8FD4 /* BenchmarkMac.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BenchmarkMac.app; sourceTree = BUILT_PRODUCTS_DIR; };
DCC29DE014730AA9005E8FD4 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
DCC29DE314730AA9005E8FD4 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };
DCC29DE414730AA9005E8FD4 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; };
DCC29DE514730AA9005E8FD4 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
DCC29DE814730AA9005E8FD4 /* BenchmarkMac-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "BenchmarkMac-Info.plist"; sourceTree = "<group>"; };
DCC29DEA14730AA9005E8FD4 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
DCC29DEC14730AA9005E8FD4 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
DCC29DEE14730AA9005E8FD4 /* BenchmarkMac-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "BenchmarkMac-Prefix.pch"; sourceTree = "<group>"; };
DCC29DF014730AA9005E8FD4 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = "<group>"; };
DCC29DF214730AA9005E8FD4 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
DCC29DF314730AA9005E8FD4 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
DCC29DF614730AA9005E8FD4 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = "<group>"; };
DCC29E1714730B05005E8FD4 /* BaseNSLogging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BaseNSLogging.h; sourceTree = "<group>"; };
DCC29E1814730B05005E8FD4 /* BaseNSLogging.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BaseNSLogging.m; sourceTree = "<group>"; };
DCC29E1914730B05005E8FD4 /* DynamicLogging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DynamicLogging.h; sourceTree = "<group>"; };
DCC29E1A14730B05005E8FD4 /* DynamicLogging.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DynamicLogging.m; sourceTree = "<group>"; };
DCC29E1B14730B05005E8FD4 /* PerformanceTesting.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PerformanceTesting.h; sourceTree = "<group>"; };
DCC29E1C14730B05005E8FD4 /* PerformanceTesting.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PerformanceTesting.m; sourceTree = "<group>"; };
DCC29E1D14730B05005E8FD4 /* StaticLogging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StaticLogging.h; sourceTree = "<group>"; };
DCC29E1E14730B05005E8FD4 /* StaticLogging.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StaticLogging.m; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
DCC29DD914730AA9005E8FD4 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
0A7D8F9C217A10A000B496D7 /* CocoaLumberjack.framework in Frameworks */,
DCC29DE114730AA9005E8FD4 /* Cocoa.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
43AF80202174E19700C0D9DC /* Configs */ = {
isa = PBXGroup;
children = (
43AF80212174E19700C0D9DC /* Module-Release.xcconfig */,
43AF80222174E19700C0D9DC /* Module-Debug.xcconfig */,
43AF80232174E19700C0D9DC /* Module-Shared.xcconfig */,
);
name = Configs;
path = ../../../Configs;
sourceTree = "<group>";
};
DCC29DD114730AA9005E8FD4 = {
isa = PBXGroup;
children = (
43AF80202174E19700C0D9DC /* Configs */,
DCC29E1614730AC6005E8FD4 /* Benchmarking */,
DCC29DE614730AA9005E8FD4 /* BenchmarkMac */,
DCC29DDF14730AA9005E8FD4 /* Frameworks */,
DCC29DDD14730AA9005E8FD4 /* Products */,
);
sourceTree = "<group>";
};
DCC29DDD14730AA9005E8FD4 /* Products */ = {
isa = PBXGroup;
children = (
DCC29DDC14730AA9005E8FD4 /* BenchmarkMac.app */,
);
name = Products;
sourceTree = "<group>";
};
DCC29DDF14730AA9005E8FD4 /* Frameworks */ = {
isa = PBXGroup;
children = (
0A7D8F9B217A10A000B496D7 /* CocoaLumberjack.framework */,
DCC29DE014730AA9005E8FD4 /* Cocoa.framework */,
DCC29DE214730AA9005E8FD4 /* Other Frameworks */,
);
name = Frameworks;
sourceTree = "<group>";
};
DCC29DE214730AA9005E8FD4 /* Other Frameworks */ = {
isa = PBXGroup;
children = (
DCC29DE314730AA9005E8FD4 /* AppKit.framework */,
DCC29DE414730AA9005E8FD4 /* CoreData.framework */,
DCC29DE514730AA9005E8FD4 /* Foundation.framework */,
);
name = "Other Frameworks";
sourceTree = "<group>";
};
DCC29DE614730AA9005E8FD4 /* BenchmarkMac */ = {
isa = PBXGroup;
children = (
DCC29DF214730AA9005E8FD4 /* AppDelegate.h */,
DCC29DF314730AA9005E8FD4 /* AppDelegate.m */,
DCC29DF514730AA9005E8FD4 /* MainMenu.xib */,
DCC29DE714730AA9005E8FD4 /* Supporting Files */,
);
path = BenchmarkMac;
sourceTree = "<group>";
};
DCC29DE714730AA9005E8FD4 /* Supporting Files */ = {
isa = PBXGroup;
children = (
DCC29DE814730AA9005E8FD4 /* BenchmarkMac-Info.plist */,
DCC29DE914730AA9005E8FD4 /* InfoPlist.strings */,
DCC29DEC14730AA9005E8FD4 /* main.m */,
DCC29DEE14730AA9005E8FD4 /* BenchmarkMac-Prefix.pch */,
DCC29DEF14730AA9005E8FD4 /* Credits.rtf */,
);
name = "Supporting Files";
sourceTree = "<group>";
};
DCC29E1614730AC6005E8FD4 /* Benchmarking */ = {
isa = PBXGroup;
children = (
DCC29E1714730B05005E8FD4 /* BaseNSLogging.h */,
DCC29E1814730B05005E8FD4 /* BaseNSLogging.m */,
DCC29E1914730B05005E8FD4 /* DynamicLogging.h */,
DCC29E1A14730B05005E8FD4 /* DynamicLogging.m */,
DCC29E1B14730B05005E8FD4 /* PerformanceTesting.h */,
DCC29E1C14730B05005E8FD4 /* PerformanceTesting.m */,
DCC29E1D14730B05005E8FD4 /* StaticLogging.h */,
DCC29E1E14730B05005E8FD4 /* StaticLogging.m */,
);
name = Benchmarking;
path = ../../../Benchmarking;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
DCC29DDB14730AA9005E8FD4 /* BenchmarkMac */ = {
isa = PBXNativeTarget;
buildConfigurationList = DCC29DFA14730AA9005E8FD4 /* Build configuration list for PBXNativeTarget "BenchmarkMac" */;
buildPhases = (
DCC29DD814730AA9005E8FD4 /* Sources */,
DCC29DD914730AA9005E8FD4 /* Frameworks */,
DCC29DDA14730AA9005E8FD4 /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = BenchmarkMac;
productName = BenchmarkMac;
productReference = DCC29DDC14730AA9005E8FD4 /* BenchmarkMac.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
DCC29DD314730AA9005E8FD4 /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0900;
};
buildConfigurationList = DCC29DD614730AA9005E8FD4 /* Build configuration list for PBXProject "BenchmarkMac" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
en,
);
mainGroup = DCC29DD114730AA9005E8FD4;
productRefGroup = DCC29DDD14730AA9005E8FD4 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
DCC29DDB14730AA9005E8FD4 /* BenchmarkMac */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
DCC29DDA14730AA9005E8FD4 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
DCC29DEB14730AA9005E8FD4 /* InfoPlist.strings in Resources */,
DCC29DF114730AA9005E8FD4 /* Credits.rtf in Resources */,
DCC29DF714730AA9005E8FD4 /* MainMenu.xib in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
DCC29DD814730AA9005E8FD4 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
DCC29DED14730AA9005E8FD4 /* main.m in Sources */,
DCC29DF414730AA9005E8FD4 /* AppDelegate.m in Sources */,
DCC29E1F14730B05005E8FD4 /* BaseNSLogging.m in Sources */,
DCC29E2014730B05005E8FD4 /* DynamicLogging.m in Sources */,
DCC29E2114730B05005E8FD4 /* PerformanceTesting.m in Sources */,
DCC29E2214730B05005E8FD4 /* StaticLogging.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXVariantGroup section */
DCC29DE914730AA9005E8FD4 /* InfoPlist.strings */ = {
isa = PBXVariantGroup;
children = (
DCC29DEA14730AA9005E8FD4 /* en */,
);
name = InfoPlist.strings;
sourceTree = "<group>";
};
DCC29DEF14730AA9005E8FD4 /* Credits.rtf */ = {
isa = PBXVariantGroup;
children = (
DCC29DF014730AA9005E8FD4 /* en */,
);
name = Credits.rtf;
sourceTree = "<group>";
};
DCC29DF514730AA9005E8FD4 /* MainMenu.xib */ = {
isa = PBXVariantGroup;
children = (
DCC29DF614730AA9005E8FD4 /* en */,
);
name = MainMenu.xib;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
DCC29DF814730AA9005E8FD4 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 43AF80222174E19700C0D9DC /* Module-Debug.xcconfig */;
buildSettings = {
};
name = Debug;
};
DCC29DF914730AA9005E8FD4 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 43AF80212174E19700C0D9DC /* Module-Release.xcconfig */;
buildSettings = {
};
name = Release;
};
DCC29DFB14730AA9005E8FD4 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
COMBINE_HIDPI_IMAGES = YES;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "BenchmarkMac/BenchmarkMac-Prefix.pch";
INFOPLIST_FILE = "BenchmarkMac/BenchmarkMac-Info.plist";
SUPPORTED_PLATFORMS = macosx;
TARGETED_DEVICE_FAMILY = "";
WRAPPER_EXTENSION = app;
};
name = Debug;
};
DCC29DFC14730AA9005E8FD4 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
COMBINE_HIDPI_IMAGES = YES;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "BenchmarkMac/BenchmarkMac-Prefix.pch";
INFOPLIST_FILE = "BenchmarkMac/BenchmarkMac-Info.plist";
SUPPORTED_PLATFORMS = macosx;
TARGETED_DEVICE_FAMILY = "";
WRAPPER_EXTENSION = app;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
DCC29DD614730AA9005E8FD4 /* Build configuration list for PBXProject "BenchmarkMac" */ = {
isa = XCConfigurationList;
buildConfigurations = (
DCC29DF814730AA9005E8FD4 /* Debug */,
DCC29DF914730AA9005E8FD4 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
DCC29DFA14730AA9005E8FD4 /* Build configuration list for PBXNativeTarget "BenchmarkMac" */ = {
isa = XCConfigurationList;
buildConfigurations = (
DCC29DFB14730AA9005E8FD4 /* Debug */,
DCC29DFC14730AA9005E8FD4 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = DCC29DD314730AA9005E8FD4 /* Project object */;
}
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>FILEHEADER</key>
<string>
// ___FILENAME___
// ___TARGETNAME___
//
// CocoaLumberjack Demos
//</string>
</dict>
</plist>
@@ -0,0 +1,93 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0900"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "DCC29DDB14730AA9005E8FD4"
BuildableName = "BenchmarkMac.app"
BlueprintName = "BenchmarkMac"
ReferencedContainer = "container:BenchmarkMac.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
language = ""
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "DCC29DDB14730AA9005E8FD4"
BuildableName = "BenchmarkMac.app"
BlueprintName = "BenchmarkMac"
ReferencedContainer = "container:BenchmarkMac.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
language = ""
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "DCC29DDB14730AA9005E8FD4"
BuildableName = "BenchmarkMac.app"
BlueprintName = "BenchmarkMac"
ReferencedContainer = "container:BenchmarkMac.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "DCC29DDB14730AA9005E8FD4"
BuildableName = "BenchmarkMac.app"
BlueprintName = "BenchmarkMac"
ReferencedContainer = "container:BenchmarkMac.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
@@ -0,0 +1,14 @@
//
// AppDelegate.h
// BenchmarkMac
//
// CocoaLumberjack Demos
//
#import <Cocoa/Cocoa.h>
@interface AppDelegate : NSObject <NSApplicationDelegate>
@property (assign) IBOutlet NSWindow *window;
@end
@@ -0,0 +1,20 @@
//
// AppDelegate.m
// BenchmarkMac
//
// CocoaLumberjack Demos
//
#import "AppDelegate.h"
#import "PerformanceTesting.h"
@implementation AppDelegate
@synthesize window = _window;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
[PerformanceTesting startPerformanceTests];
}
@end
@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSMinimumSystemVersion</key>
<string>${MACOSX_DEPLOYMENT_TARGET}</string>
<key>NSMainNibFile</key>
<string>MainMenu</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
</dict>
</plist>
@@ -0,0 +1,13 @@
//
// BenchmarkMac-Prefix.pch
// BenchmarkMac
//
// CocoaLumberjack Demos
//
//
// Prefix header for all source files of the 'BenchmarkMac' target in the 'BenchmarkMac' project
//
#ifdef __OBJC__
#import <Cocoa/Cocoa.h>
#endif
@@ -0,0 +1,29 @@
{\rtf0\ansi{\fonttbl\f0\fswiss Helvetica;}
{\colortbl;\red255\green255\blue255;}
\paperw9840\paperh8400
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural
\f0\b\fs24 \cf0 Engineering:
\b0 \
Some people\
\
\b Human Interface Design:
\b0 \
Some other people\
\
\b Testing:
\b0 \
Hopefully not nobody\
\
\b Documentation:
\b0 \
Whoever\
\
\b With special thanks to:
\b0 \
Mom\
}
@@ -0,0 +1,2 @@
/* Localized versions of Info.plist keys */
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,13 @@
//
// main.m
// BenchmarkMac
//
// CocoaLumberjack Demos
//
#import <Cocoa/Cocoa.h>
int main(int argc, char *argv[])
{
return NSApplicationMain(argc, (const char **)argv);
}
@@ -0,0 +1,4 @@
This Xcode project provides a benchmarking suite for performance testing on Mac OS X.
Details of the tests, as well as sample results, are provided on the Wiki:
https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/Performance
@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleDisplayName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSMainNibFile</key>
<string>MainWindow</string>
</dict>
</plist>
@@ -0,0 +1,302 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
0A7D8F9A217A109500B496D7 /* CocoaLumberjack.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0A7D8F99217A109500B496D7 /* CocoaLumberjack.framework */; };
1D3623260D0F684500981E51 /* BenchmarkIPhoneAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* BenchmarkIPhoneAppDelegate.m */; };
1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; };
1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; };
1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; };
288765A50DF7441C002DB57D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 288765A40DF7441C002DB57D /* CoreGraphics.framework */; };
2899E5220DE3E06400AC0155 /* BenchmarkIPhoneViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2899E5210DE3E06400AC0155 /* BenchmarkIPhoneViewController.xib */; };
28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 28AD733E0D9D9553002E5188 /* MainWindow.xib */; };
28D7ACF80DDB3853001CB0EB /* BenchmarkIPhoneViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 28D7ACF70DDB3853001CB0EB /* BenchmarkIPhoneViewController.m */; };
DC3D2F391674073100DFAFAA /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DC3D2F381674073100DFAFAA /* Default-568h@2x.png */; };
DC987BDF11928FD60020FF52 /* BaseNSLogging.m in Sources */ = {isa = PBXBuildFile; fileRef = DC987BD811928FD60020FF52 /* BaseNSLogging.m */; };
DC987BE011928FD60020FF52 /* DynamicLogging.m in Sources */ = {isa = PBXBuildFile; fileRef = DC987BDA11928FD60020FF52 /* DynamicLogging.m */; };
DC987BE111928FD60020FF52 /* PerformanceTesting.m in Sources */ = {isa = PBXBuildFile; fileRef = DC987BDC11928FD60020FF52 /* PerformanceTesting.m */; };
DC987BE211928FD60020FF52 /* StaticLogging.m in Sources */ = {isa = PBXBuildFile; fileRef = DC987BDE11928FD60020FF52 /* StaticLogging.m */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
0A7D8F99217A109500B496D7 /* CocoaLumberjack.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = CocoaLumberjack.framework; sourceTree = BUILT_PRODUCTS_DIR; };
1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
1D3623240D0F684500981E51 /* BenchmarkIPhoneAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BenchmarkIPhoneAppDelegate.h; sourceTree = "<group>"; };
1D3623250D0F684500981E51 /* BenchmarkIPhoneAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BenchmarkIPhoneAppDelegate.m; sourceTree = "<group>"; };
1D6058910D05DD3D006BFB54 /* BenchmarkIPhone.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BenchmarkIPhone.app; sourceTree = BUILT_PRODUCTS_DIR; };
1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
288765A40DF7441C002DB57D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
2899E5210DE3E06400AC0155 /* BenchmarkIPhoneViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BenchmarkIPhoneViewController.xib; sourceTree = "<group>"; };
28AD733E0D9D9553002E5188 /* MainWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainWindow.xib; sourceTree = "<group>"; };
28D7ACF60DDB3853001CB0EB /* BenchmarkIPhoneViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BenchmarkIPhoneViewController.h; sourceTree = "<group>"; };
28D7ACF70DDB3853001CB0EB /* BenchmarkIPhoneViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BenchmarkIPhoneViewController.m; sourceTree = "<group>"; };
29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
32CA4F630368D1EE00C91783 /* BenchmarkIPhone_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BenchmarkIPhone_Prefix.pch; sourceTree = "<group>"; };
43AF801D2174DF0D00C0D9DC /* Module-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Module-Release.xcconfig"; sourceTree = "<group>"; };
43AF801E2174DF0D00C0D9DC /* Module-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Module-Debug.xcconfig"; sourceTree = "<group>"; };
43AF801F2174DF0D00C0D9DC /* Module-Shared.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Module-Shared.xcconfig"; sourceTree = "<group>"; };
8D1107310486CEB800E47090 /* BenchmarkIPhone-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "BenchmarkIPhone-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = "<group>"; };
DC3D2F381674073100DFAFAA /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = "<group>"; };
DC987BD711928FD60020FF52 /* BaseNSLogging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BaseNSLogging.h; path = ../../../Benchmarking/BaseNSLogging.h; sourceTree = SOURCE_ROOT; };
DC987BD811928FD60020FF52 /* BaseNSLogging.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BaseNSLogging.m; path = ../../../Benchmarking/BaseNSLogging.m; sourceTree = SOURCE_ROOT; };
DC987BD911928FD60020FF52 /* DynamicLogging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DynamicLogging.h; path = ../../../Benchmarking/DynamicLogging.h; sourceTree = SOURCE_ROOT; };
DC987BDA11928FD60020FF52 /* DynamicLogging.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DynamicLogging.m; path = ../../../Benchmarking/DynamicLogging.m; sourceTree = SOURCE_ROOT; };
DC987BDB11928FD60020FF52 /* PerformanceTesting.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PerformanceTesting.h; path = ../../../Benchmarking/PerformanceTesting.h; sourceTree = SOURCE_ROOT; };
DC987BDC11928FD60020FF52 /* PerformanceTesting.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PerformanceTesting.m; path = ../../../Benchmarking/PerformanceTesting.m; sourceTree = SOURCE_ROOT; };
DC987BDD11928FD60020FF52 /* StaticLogging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = StaticLogging.h; path = ../../../Benchmarking/StaticLogging.h; sourceTree = SOURCE_ROOT; };
DC987BDE11928FD60020FF52 /* StaticLogging.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = StaticLogging.m; path = ../../../Benchmarking/StaticLogging.m; sourceTree = SOURCE_ROOT; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
1D60588F0D05DD3D006BFB54 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
0A7D8F9A217A109500B496D7 /* CocoaLumberjack.framework in Frameworks */,
1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */,
1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */,
288765A50DF7441C002DB57D /* CoreGraphics.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
080E96DDFE201D6D7F000001 /* Classes */ = {
isa = PBXGroup;
children = (
1D3623240D0F684500981E51 /* BenchmarkIPhoneAppDelegate.h */,
1D3623250D0F684500981E51 /* BenchmarkIPhoneAppDelegate.m */,
28D7ACF60DDB3853001CB0EB /* BenchmarkIPhoneViewController.h */,
28D7ACF70DDB3853001CB0EB /* BenchmarkIPhoneViewController.m */,
);
path = Classes;
sourceTree = "<group>";
};
19C28FACFE9D520D11CA2CBB /* Products */ = {
isa = PBXGroup;
children = (
1D6058910D05DD3D006BFB54 /* BenchmarkIPhone.app */,
);
name = Products;
sourceTree = "<group>";
};
29B97314FDCFA39411CA2CEA /* CustomTemplate */ = {
isa = PBXGroup;
children = (
43AF801C2174DF0D00C0D9DC /* Configs */,
DC987BD611928FB50020FF52 /* Benchmarking */,
080E96DDFE201D6D7F000001 /* Classes */,
29B97315FDCFA39411CA2CEA /* Other Sources */,
29B97317FDCFA39411CA2CEA /* Resources */,
29B97323FDCFA39411CA2CEA /* Frameworks */,
19C28FACFE9D520D11CA2CBB /* Products */,
);
name = CustomTemplate;
sourceTree = "<group>";
};
29B97315FDCFA39411CA2CEA /* Other Sources */ = {
isa = PBXGroup;
children = (
32CA4F630368D1EE00C91783 /* BenchmarkIPhone_Prefix.pch */,
29B97316FDCFA39411CA2CEA /* main.m */,
);
name = "Other Sources";
sourceTree = "<group>";
};
29B97317FDCFA39411CA2CEA /* Resources */ = {
isa = PBXGroup;
children = (
2899E5210DE3E06400AC0155 /* BenchmarkIPhoneViewController.xib */,
28AD733E0D9D9553002E5188 /* MainWindow.xib */,
DC3D2F381674073100DFAFAA /* Default-568h@2x.png */,
8D1107310486CEB800E47090 /* BenchmarkIPhone-Info.plist */,
);
name = Resources;
sourceTree = "<group>";
};
29B97323FDCFA39411CA2CEA /* Frameworks */ = {
isa = PBXGroup;
children = (
0A7D8F99217A109500B496D7 /* CocoaLumberjack.framework */,
1DF5F4DF0D08C38300B7A737 /* UIKit.framework */,
1D30AB110D05D00D00671497 /* Foundation.framework */,
288765A40DF7441C002DB57D /* CoreGraphics.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
43AF801C2174DF0D00C0D9DC /* Configs */ = {
isa = PBXGroup;
children = (
43AF801D2174DF0D00C0D9DC /* Module-Release.xcconfig */,
43AF801E2174DF0D00C0D9DC /* Module-Debug.xcconfig */,
43AF801F2174DF0D00C0D9DC /* Module-Shared.xcconfig */,
);
name = Configs;
path = ../../../Configs;
sourceTree = "<group>";
};
DC987BD611928FB50020FF52 /* Benchmarking */ = {
isa = PBXGroup;
children = (
DC987BDB11928FD60020FF52 /* PerformanceTesting.h */,
DC987BDC11928FD60020FF52 /* PerformanceTesting.m */,
DC987BD711928FD60020FF52 /* BaseNSLogging.h */,
DC987BD811928FD60020FF52 /* BaseNSLogging.m */,
DC987BDD11928FD60020FF52 /* StaticLogging.h */,
DC987BDE11928FD60020FF52 /* StaticLogging.m */,
DC987BD911928FD60020FF52 /* DynamicLogging.h */,
DC987BDA11928FD60020FF52 /* DynamicLogging.m */,
);
name = Benchmarking;
path = ../../../Benchmarking;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
1D6058900D05DD3D006BFB54 /* BenchmarkIPhone */ = {
isa = PBXNativeTarget;
buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "BenchmarkIPhone" */;
buildPhases = (
1D60588D0D05DD3D006BFB54 /* Resources */,
1D60588E0D05DD3D006BFB54 /* Sources */,
1D60588F0D05DD3D006BFB54 /* Frameworks */,
);
buildRules = (
);
dependencies = (
);
name = BenchmarkIPhone;
productName = BenchmarkIPhone;
productReference = 1D6058910D05DD3D006BFB54 /* BenchmarkIPhone.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
29B97313FDCFA39411CA2CEA /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0900;
};
buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "BenchmarkIPhone" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 1;
knownRegions = (
English,
Japanese,
French,
German,
);
mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */;
productRefGroup = 19C28FACFE9D520D11CA2CBB /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
1D6058900D05DD3D006BFB54 /* BenchmarkIPhone */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
1D60588D0D05DD3D006BFB54 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */,
2899E5220DE3E06400AC0155 /* BenchmarkIPhoneViewController.xib in Resources */,
DC3D2F391674073100DFAFAA /* Default-568h@2x.png in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
1D60588E0D05DD3D006BFB54 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
1D60589B0D05DD56006BFB54 /* main.m in Sources */,
1D3623260D0F684500981E51 /* BenchmarkIPhoneAppDelegate.m in Sources */,
28D7ACF80DDB3853001CB0EB /* BenchmarkIPhoneViewController.m in Sources */,
DC987BDF11928FD60020FF52 /* BaseNSLogging.m in Sources */,
DC987BE011928FD60020FF52 /* DynamicLogging.m in Sources */,
DC987BE111928FD60020FF52 /* PerformanceTesting.m in Sources */,
DC987BE211928FD60020FF52 /* StaticLogging.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
1D6058940D05DD3E006BFB54 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = BenchmarkIPhone_Prefix.pch;
INFOPLIST_FILE = "BenchmarkIPhone-Info.plist";
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
1D6058950D05DD3E006BFB54 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = BenchmarkIPhone_Prefix.pch;
INFOPLIST_FILE = "BenchmarkIPhone-Info.plist";
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
C01FCF4F08A954540054247B /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 43AF801E2174DF0D00C0D9DC /* Module-Debug.xcconfig */;
buildSettings = {
};
name = Debug;
};
C01FCF5008A954540054247B /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 43AF801D2174DF0D00C0D9DC /* Module-Release.xcconfig */;
buildSettings = {
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "BenchmarkIPhone" */ = {
isa = XCConfigurationList;
buildConfigurations = (
1D6058940D05DD3E006BFB54 /* Debug */,
1D6058950D05DD3E006BFB54 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
C01FCF4E08A954540054247B /* Build configuration list for PBXProject "BenchmarkIPhone" */ = {
isa = XCConfigurationList;
buildConfigurations = (
C01FCF4F08A954540054247B /* Debug */,
C01FCF5008A954540054247B /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 29B97313FDCFA39411CA2CEA /* Project object */;
}
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>FILEHEADER</key>
<string>
// ___FILENAME___
// ___TARGETNAME___
//
// CocoaLumberjack Demos
//</string>
</dict>
</plist>
@@ -0,0 +1,91 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0900"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "1D6058900D05DD3D006BFB54"
BuildableName = "BenchmarkIPhone.app"
BlueprintName = "BenchmarkIPhone"
ReferencedContainer = "container:BenchmarkIPhone.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "1D6058900D05DD3D006BFB54"
BuildableName = "BenchmarkIPhone.app"
BlueprintName = "BenchmarkIPhone"
ReferencedContainer = "container:BenchmarkIPhone.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "1D6058900D05DD3D006BFB54"
BuildableName = "BenchmarkIPhone.app"
BlueprintName = "BenchmarkIPhone"
ReferencedContainer = "container:BenchmarkIPhone.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "1D6058900D05DD3D006BFB54"
BuildableName = "BenchmarkIPhone.app"
BlueprintName = "BenchmarkIPhone"
ReferencedContainer = "container:BenchmarkIPhone.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
@@ -0,0 +1,151 @@
<?xml version="1.0" encoding="UTF-8"?>
<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="7.10">
<data>
<int key="IBDocument.SystemTarget">784</int>
<string key="IBDocument.SystemVersion">10A394</string>
<string key="IBDocument.InterfaceBuilderVersion">732</string>
<string key="IBDocument.AppKitVersion">1027.1</string>
<string key="IBDocument.HIToolboxVersion">430.00</string>
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
<string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
<string key="NS.object.0">60</string>
</object>
<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
<bool key="EncodedWithXMLCoder">YES</bool>
<integer value="6"/>
</object>
<object class="NSArray" key="IBDocument.PluginDependencies">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
</object>
<object class="NSMutableDictionary" key="IBDocument.Metadata">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys" id="0">
<bool key="EncodedWithXMLCoder">YES</bool>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
</object>
</object>
<object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="IBProxyObject" id="372490531">
<string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
</object>
<object class="IBProxyObject" id="843779117">
<string key="IBProxiedObjectIdentifier">IBFirstResponder</string>
</object>
<object class="IBUIView" id="774585933">
<reference key="NSNextResponder"/>
<int key="NSvFlags">274</int>
<string key="NSFrameSize">{320, 460}</string>
<reference key="NSSuperview"/>
<object class="NSColor" key="IBUIBackgroundColor">
<int key="NSColorSpace">3</int>
<bytes key="NSWhite">MC43NQA</bytes>
<object class="NSColorSpace" key="NSCustomColorSpace">
<int key="NSID">2</int>
</object>
</object>
<bool key="IBUIClearsContextBeforeDrawing">NO</bool>
<object class="IBUISimulatedStatusBarMetrics" key="IBUISimulatedStatusBarMetrics"/>
</object>
</object>
<object class="IBObjectContainer" key="IBDocument.Objects">
<object class="NSMutableArray" key="connectionRecords">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
<string key="label">view</string>
<reference key="source" ref="372490531"/>
<reference key="destination" ref="774585933"/>
</object>
<int key="connectionID">7</int>
</object>
</object>
<object class="IBMutableOrderedSet" key="objectRecords">
<object class="NSArray" key="orderedObjects">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="IBObjectRecord">
<int key="objectID">0</int>
<reference key="object" ref="0"/>
<reference key="children" ref="1000"/>
<nil key="parent"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">-1</int>
<reference key="object" ref="372490531"/>
<reference key="parent" ref="0"/>
<string key="objectName">File's Owner</string>
</object>
<object class="IBObjectRecord">
<int key="objectID">-2</int>
<reference key="object" ref="843779117"/>
<reference key="parent" ref="0"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">6</int>
<reference key="object" ref="774585933"/>
<reference key="parent" ref="0"/>
</object>
</object>
</object>
<object class="NSMutableDictionary" key="flattenedProperties">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>-1.CustomClassName</string>
<string>-2.CustomClassName</string>
<string>6.IBEditorWindowLastContentRect</string>
<string>6.IBPluginDependency</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>BenchmarkIPhoneViewController</string>
<string>UIResponder</string>
<string>{{438, 347}, {320, 480}}</string>
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
</object>
</object>
<object class="NSMutableDictionary" key="unlocalizedProperties">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference key="dict.sortedKeys" ref="0"/>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
</object>
</object>
<nil key="activeLocalization"/>
<object class="NSMutableDictionary" key="localizations">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference key="dict.sortedKeys" ref="0"/>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
</object>
</object>
<nil key="sourceID"/>
<int key="maxID">7</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<object class="NSMutableArray" key="referencedPartialClassDescriptions">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="IBPartialClassDescription">
<string key="className">BenchmarkIPhoneViewController</string>
<string key="superclassName">UIViewController</string>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBProjectSource</string>
<string key="minorKey">Classes/BenchmarkIPhoneViewController.h</string>
</object>
</object>
</object>
</object>
<int key="IBDocument.localizationMode">0</int>
<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3</string>
<integer value="3100" key="NS.object.0"/>
</object>
<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
<string key="IBDocument.LastKnownRelativeProjectPath">BenchmarkIPhone.xcodeproj</string>
<int key="IBDocument.defaultPropertyAccessControl">3</int>
<string key="IBCocoaTouchPluginVersion">3.1</string>
</data>
</archive>
@@ -0,0 +1,14 @@
//
// BenchmarkIPhone_Prefix.pch
// BenchmarkIPhone
//
// CocoaLumberjack Demos
//
//
// Prefix header for all source files of the 'BenchmarkIPhone' target in the 'BenchmarkIPhone' project
//
#ifdef __OBJC__
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#endif
@@ -0,0 +1,21 @@
//
// BenchmarkIPhoneAppDelegate.h
// BenchmarkIPhone
//
// CocoaLumberjack Demos
//
#import <UIKit/UIKit.h>
@class BenchmarkIPhoneViewController;
@interface BenchmarkIPhoneAppDelegate : NSObject <UIApplicationDelegate>
{
UIWindow *window;
BenchmarkIPhoneViewController *viewController;
}
@property (nonatomic, strong) IBOutlet UIWindow *window;
@property (nonatomic, strong) IBOutlet BenchmarkIPhoneViewController *viewController;
@end
@@ -0,0 +1,25 @@
//
// BenchmarkIPhoneAppDelegate.m
// BenchmarkIPhone
//
// CocoaLumberjack Demos
//
#import "BenchmarkIPhoneAppDelegate.h"
#import "BenchmarkIPhoneViewController.h"
#import "PerformanceTesting.h"
@implementation BenchmarkIPhoneAppDelegate
@synthesize window;
@synthesize viewController;
- (void)applicationDidFinishLaunching:(UIApplication *)application
{
window.rootViewController = viewController;
[window makeKeyAndVisible];
[PerformanceTesting startPerformanceTests];
}
@end
@@ -0,0 +1,12 @@
//
// BenchmarkIPhoneViewController.h
// BenchmarkIPhone
//
// CocoaLumberjack Demos
//
#import <UIKit/UIKit.h>
@interface BenchmarkIPhoneViewController : UIViewController
@end
@@ -0,0 +1,12 @@
//
// BenchmarkIPhoneViewController.m
// BenchmarkIPhone
//
// CocoaLumberjack Demos
//
#import "BenchmarkIPhoneViewController.h"
@implementation BenchmarkIPhoneViewController
@end
Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

@@ -0,0 +1,219 @@
<?xml version="1.0" encoding="UTF-8"?>
<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="7.10">
<data>
<int key="IBDocument.SystemTarget">784</int>
<string key="IBDocument.SystemVersion">10A394</string>
<string key="IBDocument.InterfaceBuilderVersion">732</string>
<string key="IBDocument.AppKitVersion">1027.1</string>
<string key="IBDocument.HIToolboxVersion">430.00</string>
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
<string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
<string key="NS.object.0">60</string>
</object>
<object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
<bool key="EncodedWithXMLCoder">YES</bool>
<integer value="10"/>
</object>
<object class="NSArray" key="IBDocument.PluginDependencies">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
</object>
<object class="NSMutableDictionary" key="IBDocument.Metadata">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys" id="0">
<bool key="EncodedWithXMLCoder">YES</bool>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
</object>
</object>
<object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="IBProxyObject" id="841351856">
<string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
</object>
<object class="IBProxyObject" id="427554174">
<string key="IBProxiedObjectIdentifier">IBFirstResponder</string>
</object>
<object class="IBUICustomObject" id="664661524"/>
<object class="IBUIViewController" id="943309135">
<string key="IBUINibName">BenchmarkIPhoneViewController</string>
<object class="IBUISimulatedStatusBarMetrics" key="IBUISimulatedStatusBarMetrics"/>
</object>
<object class="IBUIWindow" id="117978783">
<nil key="NSNextResponder"/>
<int key="NSvFlags">292</int>
<string key="NSFrameSize">{320, 480}</string>
<object class="NSColor" key="IBUIBackgroundColor">
<int key="NSColorSpace">1</int>
<bytes key="NSRGB">MSAxIDEAA</bytes>
</object>
<bool key="IBUIOpaque">NO</bool>
<bool key="IBUIClearsContextBeforeDrawing">NO</bool>
<object class="IBUISimulatedStatusBarMetrics" key="IBUISimulatedStatusBarMetrics"/>
</object>
</object>
<object class="IBObjectContainer" key="IBDocument.Objects">
<object class="NSMutableArray" key="connectionRecords">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
<string key="label">delegate</string>
<reference key="source" ref="841351856"/>
<reference key="destination" ref="664661524"/>
</object>
<int key="connectionID">4</int>
</object>
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
<string key="label">viewController</string>
<reference key="source" ref="664661524"/>
<reference key="destination" ref="943309135"/>
</object>
<int key="connectionID">11</int>
</object>
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
<string key="label">window</string>
<reference key="source" ref="664661524"/>
<reference key="destination" ref="117978783"/>
</object>
<int key="connectionID">14</int>
</object>
</object>
<object class="IBMutableOrderedSet" key="objectRecords">
<object class="NSArray" key="orderedObjects">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="IBObjectRecord">
<int key="objectID">0</int>
<reference key="object" ref="0"/>
<reference key="children" ref="1000"/>
<nil key="parent"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">-1</int>
<reference key="object" ref="841351856"/>
<reference key="parent" ref="0"/>
<string key="objectName">File's Owner</string>
</object>
<object class="IBObjectRecord">
<int key="objectID">3</int>
<reference key="object" ref="664661524"/>
<reference key="parent" ref="0"/>
<string key="objectName">BenchmarkIPhone App Delegate</string>
</object>
<object class="IBObjectRecord">
<int key="objectID">-2</int>
<reference key="object" ref="427554174"/>
<reference key="parent" ref="0"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">10</int>
<reference key="object" ref="943309135"/>
<reference key="parent" ref="0"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">12</int>
<reference key="object" ref="117978783"/>
<reference key="parent" ref="0"/>
</object>
</object>
</object>
<object class="NSMutableDictionary" key="flattenedProperties">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>-1.CustomClassName</string>
<string>-2.CustomClassName</string>
<string>10.CustomClassName</string>
<string>10.IBEditorWindowLastContentRect</string>
<string>10.IBPluginDependency</string>
<string>12.IBEditorWindowLastContentRect</string>
<string>12.IBPluginDependency</string>
<string>3.CustomClassName</string>
<string>3.IBPluginDependency</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>UIApplication</string>
<string>UIResponder</string>
<string>BenchmarkIPhoneViewController</string>
<string>{{512, 351}, {320, 480}}</string>
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
<string>{{525, 346}, {320, 480}}</string>
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
<string>BenchmarkIPhoneAppDelegate</string>
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
</object>
</object>
<object class="NSMutableDictionary" key="unlocalizedProperties">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference key="dict.sortedKeys" ref="0"/>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
</object>
</object>
<nil key="activeLocalization"/>
<object class="NSMutableDictionary" key="localizations">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference key="dict.sortedKeys" ref="0"/>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
</object>
</object>
<nil key="sourceID"/>
<int key="maxID">14</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<object class="NSMutableArray" key="referencedPartialClassDescriptions">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="IBPartialClassDescription">
<string key="className">BenchmarkIPhoneAppDelegate</string>
<string key="superclassName">NSObject</string>
<object class="NSMutableDictionary" key="outlets">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>viewController</string>
<string>window</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>BenchmarkIPhoneViewController</string>
<string>UIWindow</string>
</object>
</object>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBProjectSource</string>
<string key="minorKey">Classes/BenchmarkIPhoneAppDelegate.h</string>
</object>
</object>
<object class="IBPartialClassDescription">
<string key="className">BenchmarkIPhoneAppDelegate</string>
<string key="superclassName">NSObject</string>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBUserSource</string>
<string key="minorKey"/>
</object>
</object>
<object class="IBPartialClassDescription">
<string key="className">BenchmarkIPhoneViewController</string>
<string key="superclassName">UIViewController</string>
<object class="IBClassDescriptionSource" key="sourceIdentifier">
<string key="majorKey">IBProjectSource</string>
<string key="minorKey">Classes/BenchmarkIPhoneViewController.h</string>
</object>
</object>
</object>
</object>
<int key="IBDocument.localizationMode">0</int>
<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3</string>
<integer value="3100" key="NS.object.0"/>
</object>
<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
<string key="IBDocument.LastKnownRelativeProjectPath">BenchmarkIPhone.xcodeproj</string>
<int key="IBDocument.defaultPropertyAccessControl">3</int>
<string key="IBCocoaTouchPluginVersion">3.1</string>
</data>
</archive>
@@ -0,0 +1,4 @@
This Xcode project provides a benchmarking suite for performance testing on the iPhone.
Details of the tests, as well as sample results, are provided on the Wiki:
https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/Performance
@@ -0,0 +1,15 @@
//
// main.m
// BenchmarkIPhone
//
// CocoaLumberjack Demos
//
#import <UIKit/UIKit.h>
int main(int argc, char *argv[]) {
@autoreleasepool {
int retVal = UIApplicationMain(argc, argv, nil, nil);
return retVal;
}
}
@@ -0,0 +1,226 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
0A7D8FA0217A10A900B496D7 /* CocoaLumberjack.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0A7D8F9F217A10A900B496D7 /* CocoaLumberjack.framework */; };
E5EDB896186286BC002D0689 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E5EDB895186286BC002D0689 /* Foundation.framework */; };
E5EDB899186286BC002D0689 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = E5EDB898186286BC002D0689 /* main.m */; };
E5EDB89D186286BC002D0689 /* CLI.1 in CopyFiles */ = {isa = PBXBuildFile; fileRef = E5EDB89C186286BC002D0689 /* CLI.1 */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
E5EDB890186286BC002D0689 /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = /usr/share/man/man1/;
dstSubfolderSpec = 0;
files = (
E5EDB89D186286BC002D0689 /* CLI.1 in CopyFiles */,
);
runOnlyForDeploymentPostprocessing = 1;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
0A7D8F9F217A10A900B496D7 /* CocoaLumberjack.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = CocoaLumberjack.framework; sourceTree = BUILT_PRODUCTS_DIR; };
43AF80292174E3CB00C0D9DC /* Module-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Module-Release.xcconfig"; sourceTree = "<group>"; };
43AF802A2174E3CB00C0D9DC /* Module-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Module-Debug.xcconfig"; sourceTree = "<group>"; };
43AF802B2174E3CB00C0D9DC /* Module-Shared.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Module-Shared.xcconfig"; sourceTree = "<group>"; };
E5EDB892186286BC002D0689 /* CLI */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = CLI; sourceTree = BUILT_PRODUCTS_DIR; };
E5EDB895186286BC002D0689 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
E5EDB898186286BC002D0689 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
E5EDB89B186286BC002D0689 /* CLI-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "CLI-Prefix.pch"; sourceTree = "<group>"; };
E5EDB89C186286BC002D0689 /* CLI.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; path = CLI.1; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
E5EDB88F186286BC002D0689 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
0A7D8FA0217A10A900B496D7 /* CocoaLumberjack.framework in Frameworks */,
E5EDB896186286BC002D0689 /* Foundation.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
43AF80282174E3CB00C0D9DC /* Configs */ = {
isa = PBXGroup;
children = (
43AF80292174E3CB00C0D9DC /* Module-Release.xcconfig */,
43AF802A2174E3CB00C0D9DC /* Module-Debug.xcconfig */,
43AF802B2174E3CB00C0D9DC /* Module-Shared.xcconfig */,
);
name = Configs;
path = ../../Configs;
sourceTree = "<group>";
};
E5EDB889186286BC002D0689 = {
isa = PBXGroup;
children = (
43AF80282174E3CB00C0D9DC /* Configs */,
E5EDB897186286BC002D0689 /* CLI */,
E5EDB894186286BC002D0689 /* Frameworks */,
E5EDB893186286BC002D0689 /* Products */,
);
sourceTree = "<group>";
};
E5EDB893186286BC002D0689 /* Products */ = {
isa = PBXGroup;
children = (
E5EDB892186286BC002D0689 /* CLI */,
);
name = Products;
sourceTree = "<group>";
};
E5EDB894186286BC002D0689 /* Frameworks */ = {
isa = PBXGroup;
children = (
0A7D8F9F217A10A900B496D7 /* CocoaLumberjack.framework */,
E5EDB895186286BC002D0689 /* Foundation.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
E5EDB897186286BC002D0689 /* CLI */ = {
isa = PBXGroup;
children = (
E5EDB898186286BC002D0689 /* main.m */,
E5EDB89C186286BC002D0689 /* CLI.1 */,
E5EDB89A186286BC002D0689 /* Supporting Files */,
);
path = CLI;
sourceTree = "<group>";
};
E5EDB89A186286BC002D0689 /* Supporting Files */ = {
isa = PBXGroup;
children = (
E5EDB89B186286BC002D0689 /* CLI-Prefix.pch */,
);
name = "Supporting Files";
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
E5EDB891186286BC002D0689 /* CLI */ = {
isa = PBXNativeTarget;
buildConfigurationList = E5EDB8A0186286BC002D0689 /* Build configuration list for PBXNativeTarget "CLI" */;
buildPhases = (
E5EDB88E186286BC002D0689 /* Sources */,
E5EDB88F186286BC002D0689 /* Frameworks */,
E5EDB890186286BC002D0689 /* CopyFiles */,
);
buildRules = (
);
dependencies = (
);
name = CLI;
productName = kkcli;
productReference = E5EDB892186286BC002D0689 /* CLI */;
productType = "com.apple.product-type.tool";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
E5EDB88A186286BC002D0689 /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0900;
ORGANIZATIONNAME = "";
};
buildConfigurationList = E5EDB88D186286BC002D0689 /* Build configuration list for PBXProject "CLI" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
en,
);
mainGroup = E5EDB889186286BC002D0689;
productRefGroup = E5EDB893186286BC002D0689 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
E5EDB891186286BC002D0689 /* CLI */,
);
};
/* End PBXProject section */
/* Begin PBXSourcesBuildPhase section */
E5EDB88E186286BC002D0689 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
E5EDB899186286BC002D0689 /* main.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
E5EDB89E186286BC002D0689 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 43AF802A2174E3CB00C0D9DC /* Module-Debug.xcconfig */;
buildSettings = {
};
name = Debug;
};
E5EDB89F186286BC002D0689 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 43AF80292174E3CB00C0D9DC /* Module-Release.xcconfig */;
buildSettings = {
};
name = Release;
};
E5EDB8A1186286BC002D0689 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "CLI/CLI-Prefix.pch";
SUPPORTED_PLATFORMS = macosx;
TARGETED_DEVICE_FAMILY = "";
};
name = Debug;
};
E5EDB8A2186286BC002D0689 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "CLI/CLI-Prefix.pch";
SUPPORTED_PLATFORMS = macosx;
TARGETED_DEVICE_FAMILY = "";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
E5EDB88D186286BC002D0689 /* Build configuration list for PBXProject "CLI" */ = {
isa = XCConfigurationList;
buildConfigurations = (
E5EDB89E186286BC002D0689 /* Debug */,
E5EDB89F186286BC002D0689 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
E5EDB8A0186286BC002D0689 /* Build configuration list for PBXNativeTarget "CLI" */ = {
isa = XCConfigurationList;
buildConfigurations = (
E5EDB8A1186286BC002D0689 /* Debug */,
E5EDB8A2186286BC002D0689 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = E5EDB88A186286BC002D0689 /* Project object */;
}
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>FILEHEADER</key>
<string>
// ___FILENAME___
// ___TARGETNAME___
//
// CocoaLumberjack Demos
//</string>
</dict>
</plist>
@@ -0,0 +1,93 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0900"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "E5EDB891186286BC002D0689"
BuildableName = "CLI"
BlueprintName = "CLI"
ReferencedContainer = "container:CLI.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
language = ""
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "E5EDB891186286BC002D0689"
BuildableName = "CLI"
BlueprintName = "CLI"
ReferencedContainer = "container:CLI.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
language = ""
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "E5EDB891186286BC002D0689"
BuildableName = "CLI"
BlueprintName = "CLI"
ReferencedContainer = "container:CLI.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "E5EDB891186286BC002D0689"
BuildableName = "CLI"
BlueprintName = "CLI"
ReferencedContainer = "container:CLI.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
@@ -0,0 +1,15 @@
//
// CLI-Prefix.pch
// CLI
//
// CocoaLumberjack Demos
//
//
// Prefix header
//
// The contents of this file are implicitly included at the beginning of every source file.
//
#ifdef __OBJC__
#import <Foundation/Foundation.h>
#endif
+79
View File
@@ -0,0 +1,79 @@
.\"Modified from man(1) of FreeBSD, the NetBSD mdoc.template, and mdoc.samples.
.\"See Also:
.\"man mdoc.samples for a complete listing of options
.\"man mdoc for the short list of editing options
.\"/usr/share/misc/mdoc.template
.Dd 2013/12/19 \" DATE
.Dt CLI 1 \" Program name and manual section number
.Os Darwin
.Sh NAME \" Section Header - required - don't modify
.Nm CLI,
.\" The following lines are read in generating the apropos(man -k) database. Use only key
.\" words here as the database is built based on the words here and in the .ND line.
.Nm Other_name_for_same_program(),
.Nm Yet another name for the same program.
.\" Use .Nm macro to designate other names for the documented program.
.Nd This line parsed for whatis database.
.Sh SYNOPSIS \" Section Header - required - don't modify
.Nm
.Op Fl abcd \" [-abcd]
.Op Fl a Ar path \" [-a path]
.Op Ar file \" [file]
.Op Ar \" [file ...]
.Ar arg0 \" Underlined argument - use .Ar anywhere to underline
arg2 ... \" Arguments
.Sh DESCRIPTION \" Section Header - required - don't modify
Use the .Nm macro to refer to your program throughout the man page like such:
.Nm
Underlining is accomplished with the .Ar macro like this:
.Ar underlined text .
.Pp \" Inserts a space
A list of items with descriptions:
.Bl -tag -width -indent \" Begins a tagged list
.It item a \" Each item preceded by .It macro
Description of item a
.It item b
Description of item b
.El \" Ends the list
.Pp
A list of flags and their descriptions:
.Bl -tag -width -indent \" Differs from above in tag removed
.It Fl a \"-a flag as a list item
Description of -a flag
.It Fl b
Description of -b flag
.El \" Ends the list
.Pp
.\" .Sh ENVIRONMENT \" May not be needed
.\" .Bl -tag -width "ENV_VAR_1" -indent \" ENV_VAR_1 is width of the string ENV_VAR_1
.\" .It Ev ENV_VAR_1
.\" Description of ENV_VAR_1
.\" .It Ev ENV_VAR_2
.\" Description of ENV_VAR_2
.\" .El
.Sh FILES \" File used or created by the topic of the man page
.Bl -tag -width "/Users/joeuser/Library/really_long_file_name" -compact
.It Pa /usr/share/file_name
FILE_1 description
.It Pa /Users/joeuser/Library/really_long_file_name
FILE_2 description
.El \" Ends the list
.\" .Sh DIAGNOSTICS \" May not be needed
.\" .Bl -diag
.\" .It Diagnostic Tag
.\" Diagnostic informtion here.
.\" .It Diagnostic Tag
.\" Diagnostic informtion here.
.\" .El
.Sh SEE ALSO
.\" List links in ascending order by section, alphabetically within a section.
.\" Please do not reference files that do not exist without filing a bug report
.Xr a 1 ,
.Xr b 1 ,
.Xr c 1 ,
.Xr a 2 ,
.Xr b 2 ,
.Xr a 3 ,
.Xr b 3
.\" .Sh BUGS \" Document known, unremedied bugs
.\" .Sh HISTORY \" Document history if command behaves in a unique manner
+30
View File
@@ -0,0 +1,30 @@
//
// main.m
// CLI
//
// CocoaLumberjack Demos
//
#import <Foundation/Foundation.h>
#import <CocoaLumberjack/CocoaLumberjack.h>
static const DDLogLevel ddLogLevel = DDLogLevelVerbose;
int main(int argc, const char * argv[])
{
@autoreleasepool {
// Test
DDTTYLogger * logger = [DDTTYLogger sharedInstance];
logger.colorsEnabled = YES;
[logger setForegroundColor:[DDColor colorWithCalibratedRed:26.0/255.0
green:158.0/255.0
blue:4.0/255.0
alpha:1.0]
backgroundColor:nil
forFlag:DDLogFlagInfo];
[DDLog addLogger:logger];
DDLogInfo(@"Hello, World!");
}
return 0;
}
@@ -0,0 +1,276 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
0A7D8F9E217A10A500B496D7 /* CocoaLumberjack.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0A7D8F9D217A10A500B496D7 /* CocoaLumberjack.framework */; };
E50619821A2EF295000F835A /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E50619811A2EF295000F835A /* Main.storyboard */; };
E5AE803B18DA83A400E0501F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E5AE803A18DA83A400E0501F /* Foundation.framework */; };
E5AE803D18DA83A400E0501F /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E5AE803C18DA83A400E0501F /* CoreGraphics.framework */; };
E5AE803F18DA83A400E0501F /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E5AE803E18DA83A400E0501F /* UIKit.framework */; };
E5AE804518DA83A400E0501F /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = E5AE804318DA83A400E0501F /* InfoPlist.strings */; };
E5AE804718DA83A400E0501F /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = E5AE804618DA83A400E0501F /* main.m */; };
E5AE804B18DA83A400E0501F /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = E5AE804A18DA83A400E0501F /* AppDelegate.m */; };
E5AE805118DA83A400E0501F /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E5AE805018DA83A400E0501F /* ViewController.m */; };
E5AE805318DA83A400E0501F /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E5AE805218DA83A400E0501F /* Images.xcassets */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
0A7D8F9D217A10A500B496D7 /* CocoaLumberjack.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = CocoaLumberjack.framework; sourceTree = BUILT_PRODUCTS_DIR; };
43AF80252174E2F700C0D9DC /* Module-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Module-Release.xcconfig"; sourceTree = "<group>"; };
43AF80262174E2F700C0D9DC /* Module-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Module-Debug.xcconfig"; sourceTree = "<group>"; };
43AF80272174E2F700C0D9DC /* Module-Shared.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Module-Shared.xcconfig"; sourceTree = "<group>"; };
E50619811A2EF295000F835A /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = "<group>"; };
E5AE803718DA83A400E0501F /* CaptureASL.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CaptureASL.app; sourceTree = BUILT_PRODUCTS_DIR; };
E5AE803A18DA83A400E0501F /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
E5AE803C18DA83A400E0501F /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
E5AE803E18DA83A400E0501F /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
E5AE804218DA83A400E0501F /* CaptureASL-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "CaptureASL-Info.plist"; sourceTree = "<group>"; };
E5AE804418DA83A400E0501F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
E5AE804618DA83A400E0501F /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
E5AE804818DA83A400E0501F /* CaptureASL-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "CaptureASL-Prefix.pch"; sourceTree = "<group>"; };
E5AE804918DA83A400E0501F /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
E5AE804A18DA83A400E0501F /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
E5AE804F18DA83A400E0501F /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = "<group>"; };
E5AE805018DA83A400E0501F /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = "<group>"; };
E5AE805218DA83A400E0501F /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
E5AE805918DA83A400E0501F /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
E5AE803418DA83A400E0501F /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
0A7D8F9E217A10A500B496D7 /* CocoaLumberjack.framework in Frameworks */,
E5AE803D18DA83A400E0501F /* CoreGraphics.framework in Frameworks */,
E5AE803F18DA83A400E0501F /* UIKit.framework in Frameworks */,
E5AE803B18DA83A400E0501F /* Foundation.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
43AF80242174E2F700C0D9DC /* Configs */ = {
isa = PBXGroup;
children = (
43AF80252174E2F700C0D9DC /* Module-Release.xcconfig */,
43AF80262174E2F700C0D9DC /* Module-Debug.xcconfig */,
43AF80272174E2F700C0D9DC /* Module-Shared.xcconfig */,
);
name = Configs;
path = ../../Configs;
sourceTree = "<group>";
};
E5AE802E18DA83A400E0501F = {
isa = PBXGroup;
children = (
43AF80242174E2F700C0D9DC /* Configs */,
E5AE804018DA83A400E0501F /* CaptureASL */,
E5AE803918DA83A400E0501F /* Frameworks */,
E5AE803818DA83A400E0501F /* Products */,
);
sourceTree = "<group>";
};
E5AE803818DA83A400E0501F /* Products */ = {
isa = PBXGroup;
children = (
E5AE803718DA83A400E0501F /* CaptureASL.app */,
);
name = Products;
sourceTree = "<group>";
};
E5AE803918DA83A400E0501F /* Frameworks */ = {
isa = PBXGroup;
children = (
0A7D8F9D217A10A500B496D7 /* CocoaLumberjack.framework */,
E5AE803A18DA83A400E0501F /* Foundation.framework */,
E5AE803C18DA83A400E0501F /* CoreGraphics.framework */,
E5AE803E18DA83A400E0501F /* UIKit.framework */,
E5AE805918DA83A400E0501F /* XCTest.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
E5AE804018DA83A400E0501F /* CaptureASL */ = {
isa = PBXGroup;
children = (
E5AE804918DA83A400E0501F /* AppDelegate.h */,
E5AE804A18DA83A400E0501F /* AppDelegate.m */,
E5AE804F18DA83A400E0501F /* ViewController.h */,
E5AE805018DA83A400E0501F /* ViewController.m */,
E50619811A2EF295000F835A /* Main.storyboard */,
E5AE805218DA83A400E0501F /* Images.xcassets */,
E5AE804118DA83A400E0501F /* Supporting Files */,
);
path = CaptureASL;
sourceTree = "<group>";
};
E5AE804118DA83A400E0501F /* Supporting Files */ = {
isa = PBXGroup;
children = (
E5AE804218DA83A400E0501F /* CaptureASL-Info.plist */,
E5AE804318DA83A400E0501F /* InfoPlist.strings */,
E5AE804618DA83A400E0501F /* main.m */,
E5AE804818DA83A400E0501F /* CaptureASL-Prefix.pch */,
);
name = "Supporting Files";
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
E5AE803618DA83A400E0501F /* CaptureASL */ = {
isa = PBXNativeTarget;
buildConfigurationList = E5AE806918DA83A500E0501F /* Build configuration list for PBXNativeTarget "CaptureASL" */;
buildPhases = (
E5AE803318DA83A400E0501F /* Sources */,
E5AE803418DA83A400E0501F /* Frameworks */,
E5AE803518DA83A400E0501F /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = CaptureASL;
productName = CaptureASL;
productReference = E5AE803718DA83A400E0501F /* CaptureASL.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
E5AE802F18DA83A400E0501F /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0900;
};
buildConfigurationList = E5AE803218DA83A400E0501F /* Build configuration list for PBXProject "CaptureASL" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
en,
);
mainGroup = E5AE802E18DA83A400E0501F;
productRefGroup = E5AE803818DA83A400E0501F /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
E5AE803618DA83A400E0501F /* CaptureASL */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
E5AE803518DA83A400E0501F /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
E50619821A2EF295000F835A /* Main.storyboard in Resources */,
E5AE805318DA83A400E0501F /* Images.xcassets in Resources */,
E5AE804518DA83A400E0501F /* InfoPlist.strings in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
E5AE803318DA83A400E0501F /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
E5AE805118DA83A400E0501F /* ViewController.m in Sources */,
E5AE804B18DA83A400E0501F /* AppDelegate.m in Sources */,
E5AE804718DA83A400E0501F /* main.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXVariantGroup section */
E5AE804318DA83A400E0501F /* InfoPlist.strings */ = {
isa = PBXVariantGroup;
children = (
E5AE804418DA83A400E0501F /* en */,
);
name = InfoPlist.strings;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
E5AE806718DA83A500E0501F /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 43AF80262174E2F700C0D9DC /* Module-Debug.xcconfig */;
buildSettings = {
};
name = Debug;
};
E5AE806818DA83A500E0501F /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 43AF80252174E2F700C0D9DC /* Module-Release.xcconfig */;
buildSettings = {
};
name = Release;
};
E5AE806A18DA83A500E0501F /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "CaptureASL/CaptureASL-Prefix.pch";
INFOPLIST_FILE = "CaptureASL/CaptureASL-Info.plist";
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
TARGETED_DEVICE_FAMILY = "1,2";
WRAPPER_EXTENSION = app;
};
name = Debug;
};
E5AE806B18DA83A500E0501F /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "CaptureASL/CaptureASL-Prefix.pch";
INFOPLIST_FILE = "CaptureASL/CaptureASL-Info.plist";
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
TARGETED_DEVICE_FAMILY = "1,2";
WRAPPER_EXTENSION = app;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
E5AE803218DA83A400E0501F /* Build configuration list for PBXProject "CaptureASL" */ = {
isa = XCConfigurationList;
buildConfigurations = (
E5AE806718DA83A500E0501F /* Debug */,
E5AE806818DA83A500E0501F /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
E5AE806918DA83A500E0501F /* Build configuration list for PBXNativeTarget "CaptureASL" */ = {
isa = XCConfigurationList;
buildConfigurations = (
E5AE806A18DA83A500E0501F /* Debug */,
E5AE806B18DA83A500E0501F /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = E5AE802F18DA83A400E0501F /* Project object */;
}
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>FILEHEADER</key>
<string>
// ___FILENAME___
// ___TARGETNAME___
//
// CocoaLumberjack Demos
//</string>
</dict>
</plist>
@@ -0,0 +1,103 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0900"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "E5AE803618DA83A400E0501F"
BuildableName = "CaptureASL.app"
BlueprintName = "CaptureASL"
ReferencedContainer = "container:CaptureASL.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
language = ""
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "E5AE805718DA83A400E0501F"
BuildableName = "CaptureASLTests.xctest"
BlueprintName = "CaptureASLTests"
ReferencedContainer = "container:CaptureASL.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "E5AE803618DA83A400E0501F"
BuildableName = "CaptureASL.app"
BlueprintName = "CaptureASL"
ReferencedContainer = "container:CaptureASL.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
language = ""
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "E5AE803618DA83A400E0501F"
BuildableName = "CaptureASL.app"
BlueprintName = "CaptureASL"
ReferencedContainer = "container:CaptureASL.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "E5AE803618DA83A400E0501F"
BuildableName = "CaptureASL.app"
BlueprintName = "CaptureASL"
ReferencedContainer = "container:CaptureASL.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
@@ -0,0 +1,15 @@
//
// AppDelegate.h
// CaptureASL
//
// CocoaLumberjack Demos
//
#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@end
@@ -0,0 +1,38 @@
//
// AppDelegate.m
// CaptureASL
//
// CocoaLumberjack Demos
//
#import "AppDelegate.h"
#import <CocoaLumberjack/CocoaLumberjack.h>
@interface SimpleFormatter : NSObject <DDLogFormatter>
@end
@implementation SimpleFormatter
- (NSString *)formatLogMessage:(DDLogMessage *)logMessage
{
return [NSString stringWithFormat:@" Captured: %@", logMessage->_message];
}
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
DDTTYLogger.sharedInstance.logFormatter = [SimpleFormatter new];
[DDLog addLogger:DDTTYLogger.sharedInstance];
[DDLog addLogger:DDASLLogger.sharedInstance];
[DDASLLogCapture start];
return YES;
}
@end
@@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleDisplayName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
</dict>
</plist>
@@ -0,0 +1,22 @@
//
// CaptureASL-Prefix.pch
// CaptureASL
//
// CocoaLumberjack Demos
//
//
// Prefix header
//
// The contents of this file are implicitly included at the beginning of every source file.
//
#import <Availability.h>
#ifndef __IPHONE_5_0
#warning "This project uses features only available in iOS SDK 5.0 and later."
#endif
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#endif
@@ -0,0 +1,23 @@
{
"images" : [
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
@@ -0,0 +1,23 @@
{
"images" : [
{
"orientation" : "portrait",
"idiom" : "iphone",
"extent" : "full-screen",
"minimum-system-version" : "7.0",
"scale" : "2x"
},
{
"orientation" : "portrait",
"idiom" : "iphone",
"subtype" : "retina4",
"extent" : "full-screen",
"minimum-system-version" : "7.0",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6254" systemVersion="14B25" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" initialViewController="vXZ-lx-hvc">
<dependencies>
<deployment identifier="iOS"/>
<development version="5100" identifier="xcode"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6247"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="ufC-wZ-h7g">
<objects>
<viewController id="vXZ-lx-hvc" customClass="ViewController" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="kh9-bI-dsS">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="OQh-Gf-KC3">
<rect key="frame" x="32" y="99" width="256" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<state key="normal" title="NSLog(@&quot;ASL test message #count&quot;)">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<action selector="log:" destination="vXZ-lx-hvc" eventType="touchUpInside" id="aIM-Nh-oJG"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="WMs-oa-AQ1">
<rect key="frame" x="32" y="164" width="256" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<state key="normal" title="asl_log(ASL_LEVEL_EMERG)">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<action selector="asl_log:" destination="vXZ-lx-hvc" eventType="touchUpInside" id="DIq-VT-0bb"/>
</connections>
</button>
<button opaque="NO" tag="1" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="qhW-P0-r1b">
<rect key="frame" x="32" y="202" width="256" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<state key="normal" title="asl_log(ASL_LEVEL_ALERT)">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<action selector="asl_log:" destination="vXZ-lx-hvc" eventType="touchUpInside" id="lSC-BX-BKJ"/>
</connections>
</button>
<button opaque="NO" tag="2" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="oW1-92-Vhj">
<rect key="frame" x="32" y="240" width="256" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<state key="normal" title="asl_log(ASL_LEVEL_CRIT)">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<action selector="asl_log:" destination="vXZ-lx-hvc" eventType="touchUpInside" id="FkE-L6-kbI"/>
</connections>
</button>
<button opaque="NO" tag="3" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="l4x-pf-1E4">
<rect key="frame" x="32" y="278" width="256" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<state key="normal" title="asl_log(ASL_LEVEL_ERR)">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<action selector="asl_log:" destination="vXZ-lx-hvc" eventType="touchUpInside" id="kVB-nm-p9V"/>
</connections>
</button>
<button opaque="NO" tag="4" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="g4l-S3-KOi">
<rect key="frame" x="32" y="316" width="256" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<state key="normal" title="asl_log(ASL_LEVEL_WARNING)">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<action selector="asl_log:" destination="vXZ-lx-hvc" eventType="touchUpInside" id="GhE-yr-uZg"/>
</connections>
</button>
<button opaque="NO" tag="5" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="ggg-qd-RaF">
<rect key="frame" x="32" y="354" width="256" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<state key="normal" title="asl_log(ASL_LEVEL_NOTICE)">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<action selector="asl_log:" destination="vXZ-lx-hvc" eventType="touchUpInside" id="0w9-hq-tbd"/>
</connections>
</button>
<button opaque="NO" tag="6" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="L82-yP-unm">
<rect key="frame" x="32" y="392" width="256" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<state key="normal" title="asl_log(ASL_LEVEL_INFO)">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<action selector="asl_log:" destination="vXZ-lx-hvc" eventType="touchUpInside" id="hKL-Do-QGE"/>
</connections>
</button>
<button opaque="NO" tag="7" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="VO7-m5-Wmc">
<rect key="frame" x="32" y="430" width="256" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<state key="normal" title="asl_log(ASL_LEVEL_DEBUG)">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<action selector="asl_log:" destination="vXZ-lx-hvc" eventType="touchUpInside" id="MiX-oQ-9UW"/>
</connections>
</button>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="x5A-6p-PRh" sceneMemberID="firstResponder"/>
</objects>
</scene>
</scenes>
<simulatedMetricsContainer key="defaultSimulatedMetrics">
<simulatedStatusBarMetrics key="statusBar"/>
<simulatedOrientationMetrics key="orientation"/>
<simulatedScreenMetrics key="destination" type="retina4"/>
</simulatedMetricsContainer>
</document>
@@ -0,0 +1,15 @@
//
// ViewController.h
// CaptureASL
//
// CocoaLumberjack Demos
//
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
- (IBAction)log:(id)sender;
- (IBAction)asl_log:(UIButton *)sender;
@end
@@ -0,0 +1,47 @@
//
// ViewController.m
// CaptureASL
//
// CocoaLumberjack Demos
//
#import "ViewController.h"
#import <asl.h>
@implementation ViewController
{
int count;
aslclient client;
}
- (void)awakeFromNib
{
[super awakeFromNib];
count = 0;
client = asl_open(NULL, "CocoaLumberjack.CaptureASL", 0);
}
- (IBAction)log:(id)sender
{
NSLog(@"ASL test message %d", count++);
}
- (IBAction)asl_log:(UIButton *)sender
{
char *level = NULL;
switch (sender.tag)
{
case ASL_LEVEL_EMERG : level = "ASL_LEVEL_EMERG"; break;
case ASL_LEVEL_ALERT : level = "ASL_LEVEL_ALERT"; break;
case ASL_LEVEL_CRIT : level = "ASL_LEVEL_CRIT"; break;
case ASL_LEVEL_ERR : level = "ASL_LEVEL_ERR"; break;
case ASL_LEVEL_WARNING : level = "ASL_LEVEL_WARNING"; break;
case ASL_LEVEL_NOTICE : level = "ASL_LEVEL_NOTICE"; break;
case ASL_LEVEL_INFO : level = "ASL_LEVEL_INFO"; break;
case ASL_LEVEL_DEBUG : level = "ASL_LEVEL_DEBUG"; break;
}
asl_log(client, NULL, (int)sender.tag, "%s test message %d", level, count++);
}
@end
@@ -0,0 +1,2 @@
/* Localized versions of Info.plist keys */
@@ -0,0 +1,16 @@
//
// main.m
// CaptureASL
//
// CocoaLumberjack Demos
//
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char * argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSMinimumSystemVersion</key>
<string>${MACOSX_DEPLOYMENT_TARGET}</string>
<key>NSMainNibFile</key>
<string>MainMenu</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
</dict>
</plist>
@@ -0,0 +1,307 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
0A7D8FA2217A10AC00B496D7 /* CocoaLumberjack.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0A7D8FA1217A10AC00B496D7 /* CocoaLumberjack.framework */; };
1DDD58160DA1D0A300B32029 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1DDD58140DA1D0A300B32029 /* MainMenu.xib */; };
256AC3DA0F4B6AC300CF3369 /* ContextFilterAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 256AC3D90F4B6AC300CF3369 /* ContextFilterAppDelegate.m */; };
8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; };
8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; };
8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
DC2E3347129ADC68009F096E /* MyContextFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = DC2E3346129ADC68009F096E /* MyContextFilter.m */; };
DC2E334A129ADCE0009F096E /* ThirdPartyFramework.m in Sources */ = {isa = PBXBuildFile; fileRef = DC2E3349129ADCE0009F096E /* ThirdPartyFramework.m */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
0A7D8FA1217A10AC00B496D7 /* CocoaLumberjack.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = CocoaLumberjack.framework; sourceTree = BUILT_PRODUCTS_DIR; };
1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = "<absolute>"; };
1DDD58150DA1D0A300B32029 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/MainMenu.xib; sourceTree = "<group>"; };
256AC3D80F4B6AC300CF3369 /* ContextFilterAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContextFilterAppDelegate.h; sourceTree = "<group>"; };
256AC3D90F4B6AC300CF3369 /* ContextFilterAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ContextFilterAppDelegate.m; sourceTree = "<group>"; };
256AC3F00F4B6AF500CF3369 /* ContextFilter_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContextFilter_Prefix.pch; sourceTree = "<group>"; };
29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; };
29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; };
43AF802D2174E44800C0D9DC /* Module-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Module-Release.xcconfig"; sourceTree = "<group>"; };
43AF802E2174E44800C0D9DC /* Module-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Module-Debug.xcconfig"; sourceTree = "<group>"; };
43AF802F2174E44800C0D9DC /* Module-Shared.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Module-Shared.xcconfig"; sourceTree = "<group>"; };
8D1107310486CEB800E47090 /* ContextFilter-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "ContextFilter-Info.plist"; sourceTree = "<group>"; };
8D1107320486CEB800E47090 /* ContextFilter.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ContextFilter.app; sourceTree = BUILT_PRODUCTS_DIR; };
DC2E3345129ADC68009F096E /* MyContextFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MyContextFilter.h; sourceTree = "<group>"; };
DC2E3346129ADC68009F096E /* MyContextFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MyContextFilter.m; sourceTree = "<group>"; };
DC2E3348129ADCE0009F096E /* ThirdPartyFramework.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ThirdPartyFramework.h; sourceTree = "<group>"; };
DC2E3349129ADCE0009F096E /* ThirdPartyFramework.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ThirdPartyFramework.m; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
8D11072E0486CEB800E47090 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
0A7D8FA2217A10AC00B496D7 /* CocoaLumberjack.framework in Frameworks */,
8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
080E96DDFE201D6D7F000001 /* Classes */ = {
isa = PBXGroup;
children = (
256AC3D80F4B6AC300CF3369 /* ContextFilterAppDelegate.h */,
256AC3D90F4B6AC300CF3369 /* ContextFilterAppDelegate.m */,
DC2E3348129ADCE0009F096E /* ThirdPartyFramework.h */,
DC2E3349129ADCE0009F096E /* ThirdPartyFramework.m */,
DC2E3345129ADC68009F096E /* MyContextFilter.h */,
DC2E3346129ADC68009F096E /* MyContextFilter.m */,
);
name = Classes;
sourceTree = "<group>";
};
1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = {
isa = PBXGroup;
children = (
1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */,
);
name = "Linked Frameworks";
sourceTree = "<group>";
};
1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = {
isa = PBXGroup;
children = (
29B97324FDCFA39411CA2CEA /* AppKit.framework */,
13E42FB307B3F0F600E4EEF1 /* CoreData.framework */,
29B97325FDCFA39411CA2CEA /* Foundation.framework */,
);
name = "Other Frameworks";
sourceTree = "<group>";
};
19C28FACFE9D520D11CA2CBB /* Products */ = {
isa = PBXGroup;
children = (
8D1107320486CEB800E47090 /* ContextFilter.app */,
);
name = Products;
sourceTree = "<group>";
};
29B97314FDCFA39411CA2CEA /* ContextFilter */ = {
isa = PBXGroup;
children = (
43AF802C2174E44800C0D9DC /* Configs */,
080E96DDFE201D6D7F000001 /* Classes */,
29B97315FDCFA39411CA2CEA /* Other Sources */,
29B97317FDCFA39411CA2CEA /* Resources */,
29B97323FDCFA39411CA2CEA /* Frameworks */,
19C28FACFE9D520D11CA2CBB /* Products */,
);
name = ContextFilter;
sourceTree = "<group>";
};
29B97315FDCFA39411CA2CEA /* Other Sources */ = {
isa = PBXGroup;
children = (
256AC3F00F4B6AF500CF3369 /* ContextFilter_Prefix.pch */,
29B97316FDCFA39411CA2CEA /* main.m */,
);
name = "Other Sources";
sourceTree = "<group>";
};
29B97317FDCFA39411CA2CEA /* Resources */ = {
isa = PBXGroup;
children = (
8D1107310486CEB800E47090 /* ContextFilter-Info.plist */,
089C165CFE840E0CC02AAC07 /* InfoPlist.strings */,
1DDD58140DA1D0A300B32029 /* MainMenu.xib */,
);
name = Resources;
sourceTree = "<group>";
};
29B97323FDCFA39411CA2CEA /* Frameworks */ = {
isa = PBXGroup;
children = (
0A7D8FA1217A10AC00B496D7 /* CocoaLumberjack.framework */,
1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */,
1058C7A2FEA54F0111CA2CBB /* Other Frameworks */,
);
name = Frameworks;
sourceTree = "<group>";
};
43AF802C2174E44800C0D9DC /* Configs */ = {
isa = PBXGroup;
children = (
43AF802D2174E44800C0D9DC /* Module-Release.xcconfig */,
43AF802E2174E44800C0D9DC /* Module-Debug.xcconfig */,
43AF802F2174E44800C0D9DC /* Module-Shared.xcconfig */,
);
name = Configs;
path = ../../Configs;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
8D1107260486CEB800E47090 /* ContextFilter */ = {
isa = PBXNativeTarget;
buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "ContextFilter" */;
buildPhases = (
8D1107290486CEB800E47090 /* Resources */,
8D11072C0486CEB800E47090 /* Sources */,
8D11072E0486CEB800E47090 /* Frameworks */,
);
buildRules = (
);
dependencies = (
);
name = ContextFilter;
productInstallPath = "$(HOME)/Applications";
productName = ContextFilter;
productReference = 8D1107320486CEB800E47090 /* ContextFilter.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
29B97313FDCFA39411CA2CEA /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0900;
};
buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "ContextFilter" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 1;
knownRegions = (
English,
Japanese,
French,
German,
);
mainGroup = 29B97314FDCFA39411CA2CEA /* ContextFilter */;
productRefGroup = 19C28FACFE9D520D11CA2CBB /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
8D1107260486CEB800E47090 /* ContextFilter */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
8D1107290486CEB800E47090 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */,
1DDD58160DA1D0A300B32029 /* MainMenu.xib in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
8D11072C0486CEB800E47090 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
8D11072D0486CEB800E47090 /* main.m in Sources */,
256AC3DA0F4B6AC300CF3369 /* ContextFilterAppDelegate.m in Sources */,
DC2E3347129ADC68009F096E /* MyContextFilter.m in Sources */,
DC2E334A129ADCE0009F096E /* ThirdPartyFramework.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXVariantGroup section */
089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = {
isa = PBXVariantGroup;
children = (
089C165DFE840E0CC02AAC07 /* English */,
);
name = InfoPlist.strings;
sourceTree = "<group>";
};
1DDD58140DA1D0A300B32029 /* MainMenu.xib */ = {
isa = PBXVariantGroup;
children = (
1DDD58150DA1D0A300B32029 /* English */,
);
name = MainMenu.xib;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
C01FCF4B08A954540054247B /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
GCC_MODEL_TUNING = G5;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = ContextFilter_Prefix.pch;
INFOPLIST_FILE = "ContextFilter-Info.plist";
INSTALL_PATH = "$(HOME)/Applications";
SUPPORTED_PLATFORMS = macosx;
TARGETED_DEVICE_FAMILY = "";
};
name = Debug;
};
C01FCF4C08A954540054247B /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
GCC_MODEL_TUNING = G5;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = ContextFilter_Prefix.pch;
INFOPLIST_FILE = "ContextFilter-Info.plist";
INSTALL_PATH = "$(HOME)/Applications";
SUPPORTED_PLATFORMS = macosx;
TARGETED_DEVICE_FAMILY = "";
};
name = Release;
};
C01FCF4F08A954540054247B /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 43AF802E2174E44800C0D9DC /* Module-Debug.xcconfig */;
buildSettings = {
};
name = Debug;
};
C01FCF5008A954540054247B /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 43AF802D2174E44800C0D9DC /* Module-Release.xcconfig */;
buildSettings = {
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "ContextFilter" */ = {
isa = XCConfigurationList;
buildConfigurations = (
C01FCF4B08A954540054247B /* Debug */,
C01FCF4C08A954540054247B /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
C01FCF4E08A954540054247B /* Build configuration list for PBXProject "ContextFilter" */ = {
isa = XCConfigurationList;
buildConfigurations = (
C01FCF4F08A954540054247B /* Debug */,
C01FCF5008A954540054247B /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 29B97313FDCFA39411CA2CEA /* Project object */;
}
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>FILEHEADER</key>
<string>
// ___FILENAME___
// ___TARGETNAME___
//
// CocoaLumberjack Demos
//</string>
</dict>
</plist>
@@ -0,0 +1,93 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0900"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "8D1107260486CEB800E47090"
BuildableName = "ContextFilter.app"
BlueprintName = "ContextFilter"
ReferencedContainer = "container:ContextFilter.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
language = ""
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "8D1107260486CEB800E47090"
BuildableName = "ContextFilter.app"
BlueprintName = "ContextFilter"
ReferencedContainer = "container:ContextFilter.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
language = ""
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "8D1107260486CEB800E47090"
BuildableName = "ContextFilter.app"
BlueprintName = "ContextFilter"
ReferencedContainer = "container:ContextFilter.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "8D1107260486CEB800E47090"
BuildableName = "ContextFilter.app"
BlueprintName = "ContextFilter"
ReferencedContainer = "container:ContextFilter.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
@@ -0,0 +1,16 @@
//
// ContextFilterAppDelegate.h
// ContextFilter
//
// CocoaLumberjack Demos
//
#import <Cocoa/Cocoa.h>
@interface ContextFilterAppDelegate : NSObject <NSApplicationDelegate> {
NSWindow *__unsafe_unretained window;
}
@property (unsafe_unretained) IBOutlet NSWindow *window;
@end
@@ -0,0 +1,70 @@
//
// ContextFilterAppDelegate.m
// ContextFilter
//
// CocoaLumberjack Demos
//
#import "ContextFilterAppDelegate.h"
#import <CocoaLumberjack/CocoaLumberjack.h>
#import "MyContextFilter.h"
#import "ThirdPartyFramework.h"
// Log levels: off, error, warn, info, verbose
static const DDLogLevel ddLogLevel = DDLogLevelVerbose;
@implementation ContextFilterAppDelegate
@synthesize window;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
// Our application adopts a "third party framework" which also uses the lumberjack framework.
// We love this because it greatly improves our ability to observe, debug, and diagnose problems!
//
// Now sometimes we want to see the third party framework log messages in our Xcode console.
// And sometimes we don't (for whatever reason).
//
// We can accomplish this with the use of log message contexts.
// Each log message has an associated context.
// The context itself is simply an integer, and the default context is zero.
// However, third party frameworks that employ lumberjack will likely use a custom non-zero context.
//
// For example, the CocoaHTTPServer project defines it's own internal log statments:
//
// HTTPLogWarn(@"File not found - %@", filePath);
//
// As part of its logging setup, it defines its own custom logging context:
//
// #define HTTP_LOG_CONTEXT 80
//
// And each HTTPLog message uses this HTTP_LOG_CONTEXT instead of the default context.
// This means that we can tell if log messages are coming from our code or from the framework.
// We're going to tap into this ability to filter out log messages from our "third party framework".
// We want all log messages (from our code or the third party framework) to show up in the Xcode console.
[DDLog addLogger:[DDTTYLogger sharedInstance]];
// If we want to filter log messages from the third party framework, we can do this:
MyContextFilter *filter = [[MyContextFilter alloc] init];
[[DDTTYLogger sharedInstance] setLogFormatter:filter];
// Now start up a timer to create some fake log messages for this example
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(fire:) userInfo:nil repeats:YES];
// Start the third party framework,
// which will create a similar fake timer.
[ThirdPartyFramework start];
}
- (void)fire:(NSTimer *)timer
{
DDLogVerbose(@"Log message from our code");
}
@end
@@ -0,0 +1,13 @@
//
// ContextFilter_Prefix.pch
// ContextFilter
//
// CocoaLumberjack Demos
//
//
// Prefix header for all source files of the 'ContextFilter' target in the 'ContextFilter' project
//
#ifdef __OBJC__
#import <Cocoa/Cocoa.h>
#endif
@@ -0,0 +1,2 @@
/* Localized versions of Info.plist keys */
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,13 @@
//
// MyContextFilter.h
// ContextFilter
//
// CocoaLumberjack Demos
//
#import <Foundation/Foundation.h>
#import <CocoaLumberjack/CocoaLumberjack.h>
@interface MyContextFilter : NSObject <DDLogFormatter>
@end

Some files were not shown because too many files have changed in this diff Show More