OS X 10.8環境では、NSLog以外のCFShowやprintfでは、コンソール.appにログ出力が出来なくなった。
以下、Syslog APIを使用してコンソールにログを表示する方法。
簡単なサンプル
Objective-C
# import "AppDelegate.h"
# include <syslog.h>
# include <stdarg.h>
void LogEmergency(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
vsyslog(LOG_EMERG, fmt, args);
va_end(args);
}
void LogAlert(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
vsyslog(LOG_ALERT, fmt, args);
va_end(args);
}
void LogCritical(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
vsyslog(LOG_CRIT, fmt, args);
va_end(args);
}
void LogError(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
vsyslog(LOG_ERR, fmt, args);
va_end(args);
}
void LogWarning(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
vsyslog(LOG_WARNING, fmt, args);
va_end(args);
}
void LogNotice(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
vsyslog(LOG_NOTICE, fmt, args);
va_end(args);
}
void LogInfo(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
vsyslog(LOG_INFO, fmt, args);
va_end(args);
}
void LogDebug(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
vsyslog(LOG_DEBUG, fmt, args);
va_end(args);
}
@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
// 初期化処理 - ログの出力方法を定義する
openlog("LogIt", (LOG_CONS|LOG_PERROR|LOG_PID), LOG_DAEMON);
// vsyslogの第一引数=priorityの高い順に呼んでみる
LogEmergency("### LOG_EMERG %s %d", __FUNCTION__, __LINE__);
LogAlert("### LOG_ALERT %s %d", __FUNCTION__, __LINE__);
LogCritical("### LOG_CRIT %s %d", __FUNCTION__, __LINE__);
LogError("### LOG_ERR %s %d", __FUNCTION__, __LINE__);
LogWarning("### LOG_WARNING %s %d", __FUNCTION__, __LINE__);
LogNotice("### LOG_NOTICE %s %d", __FUNCTION__, __LINE__);
LogInfo("### LOG_INFO %s %d", __FUNCTION__, __LINE__);
LogDebug("### LOG_DEBUG %s %d", __FUNCTION__, __LINE__);
}
- (void)dealloc
{
// openlogで初期化したら必ず終了処理を呼ぶ
closelog();
[super dealloc];
}
@end
- openlogの第一引数の文字列がログの先頭に識別子として付加される。
- openlog, closelogを呼ばずに、いきなりsyslog/vsyslogを呼ぶ事も出来るが、その場合はコンソール.appにしか出力されない。
コンソール.appへの出力結果
console
2013/02/27 00:00:00.000 LogIt[13978]: ### LOG_EMERG -[AppDelegate applicationDidFinishLaunching:] 89
2013/02/27 00:00:00.000 LogIt[13978]: ### LOG_ALERT -[AppDelegate applicationDidFinishLaunching:] 90
2013/02/27 00:00:00.000 LogIt[13978]: ### LOG_CRIT -[AppDelegate applicationDidFinishLaunching:] 91
2013/02/27 00:00:00.000 LogIt[13978]: ### LOG_ERR -[AppDelegate applicationDidFinishLaunching:] 92
2013/02/27 00:00:00.000 LogIt[13978]: ### LOG_WARNING -[AppDelegate applicationDidFinishLaunching:] 93
2013/02/27 00:00:00.000 LogIt[13978]: ### LOG_NOTICE -[AppDelegate applicationDidFinishLaunching:] 94
- LOG_INFO, LOG_DEBUGの出力は表示されない。
- ログは、system.logに出力されている。
Xcodeのコンソールへの出力結果
Xcode
Feb 27 00:00:00 XXXXX.local LogIt[13978] <Emergency>: ### LOG_EMERG -[AppDelegate applicationDidFinishLaunching:] 89
Feb 27 00:00:00 XXXXX.local LogIt[13978] <Alert>: ### LOG_ALERT -[AppDelegate applicationDidFinishLaunching:] 90
Feb 27 00:00:00 XXXXX.local LogIt[13978] <Critical>: ### LOG_CRIT -[AppDelegate applicationDidFinishLaunching:] 91
Feb 27 00:00:00 XXXXX.local LogIt[13978] <Error>: ### LOG_ERR -[AppDelegate applicationDidFinishLaunching:] 92
Feb 27 00:00:00 XXXXX.local LogIt[13978] <Warning>: ### LOG_WARNING -[AppDelegate applicationDidFinishLaunching:] 93
Feb 27 00:00:00 XXXXX.local LogIt[13978] <Notice>: ### LOG_NOTICE -[AppDelegate applicationDidFinishLaunching:] 94
Feb 27 00:00:00 XXXXX.local LogIt[13978] <Info>: ### LOG_INFO -[AppDelegate applicationDidFinishLaunching:] 95
Feb 27 00:00:00 XXXXX.local LogIt[13978] <Debug>: ### LOG_DEBUG -[AppDelegate applicationDidFinishLaunching:] 96
- "<Emergency>"のようにログの先頭にvsyslogの第一引数(priority)の内容が自動的に付加される。
【参考】
"Daemons and Services Programming Guide" > "Logging Errors and Warnings"
https://developer.apple.com/library/mac/#documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/LoggingErrorsAndWarnings.html