3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?