10.8環境でコンソールにログを表示する(Syslog API)

OS X 10.8環境では、NSLog以外のCFShowやprintfでは、コンソール.appにログ出力が出来なくなった。

以下、Syslog APIを使用してコンソールにログを表示する方法。

#簡単なサンプル
```objectivec: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への出力結果
```objectivec: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のコンソールへの出力結果
```objectivec: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