$ sudo add-apt-repository ppa:webupd8team/java $ sudo apt-get update $ sudo apt-get install gcc g++ $ sudo apt-get install oracle-java8-installer $ sudo apt-get install oracle-java8-set-default
作成 2010.01.05
更新 2014.12.14
更新 2014.12.14
Java でローカルに Syslog を飛ばす
unix ドメイン ソケットを使うやつが見つからなかったので作りました。
環境とパッケージ
Ubuntu 14.04.1 amd64 の場合
ファイル構成
ファイル | 用途 |
LocalSyslogJNI.java | JNIのロードサンプル |
LocalSyslogJNI.class | JNIのロードサンプルのクラス ファイル。LocalSyslogJNI.java から生成される。 |
LocalSyslogJNI.h | Syslog JNI本体のヘッダー ファイル。LocalSyslogJNI.class から生成される。 |
LocalSyslogJNI.cpp | Syslog JNIの本体 |
libLocalSyslogJNI.so | Syslog JNIのライブラリ ファイル。LocalSyslogJNI.cpp, LocalSyslogJNI.h, syslog.h から生成される。 |
checkPath.java | java.library.path を確認するためのコード |
driveSyslog.java | 実際に LocalSyslogJNI.class を動かして試すコード |
本体作成
- LocalSyslogJNI.java から LocalSyslogJNI.class を生成
$ javac -Xlint -deprecation LocalSyslogJNI.java
- LocalSyslogJNI.class から LocalSyslogJNI.h を生成
$ javah -jni LocalSyslogJNI
- LocalSyslogJNI.cpp と LocalSyslogJNI.h と syslog.h から libLocalSyslogJNI.so を生成
過去のGCCでは -lstdc++ オプションが必要だったが、現在は不要。$ gcc -Wall -O2 -g -shared -fPIC ¥ -I/usr/lib/jvm/java-8-oracle/include/ ¥ -I/usr/lib/jvm/java-8-oracle/include/linux/ ¥ LocalSyslogJNI.cpp -o libLocalSyslogJNI.so
ライブラリの保存先を確認してコピー
- checkPath.java を作成
class checkPath { public static void main(String args[]){ System.out.println(System.getProperty("java.library.path")); } }
- コンパイルして実行し、ライブラリの参照先を確認する
$ javac checkPath.java $ java checkPath
- ライブラリをコピー
$ sudo cp libLocalSyslogJNI.so /usr/lib/
テスト用なので置きたくないという場合は LD_LIBRARY_PATH を指定して実行してください。$ export LD_LIBRARY_PATH=.
実験用のコードで動作確認
- driveSyslog.java を作成
class driveSyslog { public static void main(String args[]){ LocalSyslogJNI log = new LocalSyslogJNI(); log.openLog("my test", LocalSyslogJNI.LOG_CONS | LocalSyslogJNI.LOG_NDELAY, LocalSyslogJNI.LOG_USER); log.syslog(LocalSyslogJNI.LOG_INFO, "syslog jni is ok."); log.closeLog(); } }
- コンパイルして実行
$ javac driveSyslog.java $ java driveSyslog
- 別ウインドウで Syslog に記録されたことを確認する
$ sudo tail -f /var/log/syslog
メソッド
基本的に syslog(3) の仕様を引き継いでいます。
- syslog の記録を開始する
void openLog (String ident, int option, int facility);
- syslog を記録する
void syslog(int priority, String message);
- syslog の記録を終了する
void closeLog();
引数の説明
- ident
ログの一文一文に追加される文字列。通常はプログラム名を書く。 - option
下表の論理和を指定する。値 説明 LOG_CONS エラーがあれば、システムロガーに送る一方でシステムコンソールにも直接書く。 LOG_NDELAY ログ記録用プログラムとの接続を即座に開始する (通常は、最初のメッセージが記録される時に接続を開く)。 LOG_NOWAIT メッセージを記録する際に生成される子プロセスの終了を待たない。 (GNU C ライブラリは子プロセスを生成しない。したがって、このオプションは Linux では無効である。) LOG_ODELAY LOG_NDELAY の反対。 syslog() が呼ばれるまで、接続の開始を行わない。 (このオプションはデフォルトであり、特に指定する必要はない。) LOG_PERROR stderr にも出力する。(POSIX.1-2001 では定義されていない) LOG_PID 個々のメッセージに PID を含める。 - facility
メッセージに記録されるプログラムのタイプを指定するために使われる。これによって異なるタイプのプログラムからのメッセージは異なる扱いをするように設定ファイル( syslog.conf(5)) に定義できる。値 説明 LOG_AUTH セキュリティ/認証 メッセージ (非推奨。代わりに LOG_AUTHPRIV を使用すること) LOG_AUTHPRIV セキュリティ/認証 メッセージ (プライベート) LOG_CRON クロックデーモン (cron と at) LOG_DAEMON 特定の facility 値を持たないシステムデーモン LOG_FTP ftp デーモン LOG_KERN カーネルメッセージ (ユーザプロセスから生成することはできない) LOG_LOCAL0 から LOG_LOCAL7 ローカルな使用のためにリザーブされている LOG_LPR ラインプリンタ・サブシステム LOG_MAIL メール・サブシステム LOG_NEWS USENET ニュース・サブシステム LOG_SYSLOG syslogd(8) によって内部的に発行されるメッセージ LOG_USER 一般的なユーザレベルメッセージ LOG_UUCP UUCPサブシステム - priority
メッセージの優先度を指定する。優先度の高いものから低いものの順で記載する。値 説明 LOG_EMERG システムが使用不可 LOG_ALERT 直ちに行動を起こさなければならない LOG_CRIT 危険な状態 LOG_ERR エラーの状態 LOG_WARNING 警告の状態 LOG_NOTICE 通常だが重要な状態 LOG_INFO インフォメーションメッセージ LOG_DEBUG デバッグレベルのメッセージ - message
ログに記録するメッセージ
タグ: Java