作成 2010.01.05
更新 2014.12.14
Java でローカルに Syslog を飛ばす
unix ドメイン ソケットを使うやつが見つからなかったので作りました。
目次
環境とパッケージ
Ubuntu 14.04.1 amd64 の場合
ファイル構成
本体作成
ライブラリの保存先を確認してコピー
実験用のコードで動作確認
メソッド
引数の説明
環境とパッケージ
Ubuntu 14.04.1 amd64 の場合
$ 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
ファイル構成
ファイル 用途
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 を動かして試すコード
本体作成
  1. LocalSyslogJNI.java から LocalSyslogJNI.class を生成
    $ javac -Xlint -deprecation LocalSyslogJNI.java
    
  2. LocalSyslogJNI.class から LocalSyslogJNI.h を生成
    $ javah -jni LocalSyslogJNI
    
  3. 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
    
ライブラリの保存先を確認してコピー
  1. checkPath.java を作成
    class checkPath {
      public static void main(String args[]){
        System.out.println(System.getProperty("java.library.path"));
      }
    }
    
  2. コンパイルして実行し、ライブラリの参照先を確認する
    $ javac checkPath.java
    $ java checkPath
    
  3. ライブラリをコピー
    $ sudo cp libLocalSyslogJNI.so /usr/lib/
    
    テスト用なので置きたくないという場合は LD_LIBRARY_PATH を指定して実行してください。
    $ export LD_LIBRARY_PATH=.
    
実験用のコードで動作確認
  1. 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();
      }
    }
    
  2. コンパイルして実行
    $ javac driveSyslog.java
    $ java driveSyslog
    
  3. 別ウインドウで 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

©2004-2017 UPKEN IPv4