22875


ログを出力するプログラムが複数あり、ログへの出力は Syslog を使っておらず普通のテキストファイルに結果を追記しています。これらのログファイルを
Syslogサーバーに転送するにはどうしたら良いでしょうか。

プログラムはそれぞれ次の言語で組まれています。

  * Java
  * Perl
  * Ruby

サーバー環境は CentOS6, 7, RHEL6 が混在していて それぞれのローカルディスク上に出力しています。以下は例ですが
物理、仮想合わせて50台くらいです。

> （例)
>
>   * CentOS6: `/var/log/application.log`
>   * CentOS7: `/var/log/appname/system.log`
>   * RHEL6: `/opt/app/logs/error.log`
>

Syslogサーバーは RHEL6 で `Syslog-ng` が動いています。

_追記_

また、各ログファイルは出力するプログラムの書式で、エラー、デバッグ、ワーニングが出力されているので ローカルログ毎に 条件を指定できて Error,
Warning, Debug, Info レベルで Syslog出力できるのが理想です。


CC BY-SA 3.0
2016-03-04T13:58:13.363
22809
2016-03-08T13:55:46.850
2016-03-06T05:00:58.970
5008
5008
question
linux security
ログメッセージをSyslogサーバーに転送したい


syslogのクライアントからリモートのsyslogの転送ができているとして、ファイルの内容をsyslogに書き込むには

[code]

    logger -f /var/log/application.log
    
[/code]

または

[code]

    tail -f /var/log/application.log | logger
    
[/code]

**追記:**

アプリの変更ができない前提で回答を書きましたが、きちんとやるならJava, Perl,
Rubyのアプリそれぞれでsyslogに直接書き込むのが当然良いでしょう。Javaならlog4jを使っているでしょうから、propertiesの変更だけでいけるはず。以下設定例。

[code]

    # configure the root logger
    log4j.rootLogger=INFO, SYSLOG
    
    
    # configure Syslog facility LOCAL1 appender
    log4j.appender.SYSLOG=org.apache.log4j.net.SyslogAppender
    log4j.appender.SYSLOG.threshold=WARN
    log4j.appender.SYSLOG.syslogHost=localhost
    log4j.appender.SYSLOG.facility=LOCAL4
    log4j.appender.SYSLOG.layout=org.apache.log4j.PatternLayout
    log4j.appender.SYSLOG.layout.conversionPattern=[%p] %c:%L - %m%n
    
[/code]

Perl, Rubyも同様にロガーモジュールを使っているなら設定があるはずです。Pythonでも標準のloggingモジュールでsyslogに書き込めます。

**蛇足**

ところでsyslogの実装のうちrsyslogdはお勧めしません。ローカルのrsyslogに書き込むとリモートのsyslogがダウンしているときに、ローカルのファイルシステムに一時保存してくれるとか,SSL/TLSが使えるのが魅力なのですが、何らかのバグがあって高負荷時にハングアップします。


CC BY-SA 3.0
2016-03-05T09:38:28.883
22830
2016-03-07T09:43:37.930
2016-03-07T09:43:37.930
7837
7837
22809
answer


[sec](http://simple-evcorr.github.io/)でログファイルを読み込んで、正規表現などでフィルターして logger
に渡す方法が考えられます。

[code]

    [/etc/sec/application-log.rules]
    type=Single
    ptype=RegExp
    pattern=(正規表現)
    desc=application.log Error
    action=pipe '$0' /bin/logger -p local1.error
    
    type=Single
    ptype=RegExp
    pattern=(正規表現)
    desc=application.log Warning
    action=pipe '$0' /bin/logger -p local1.warning
    
        :
    
    (コマンド)
        /usr/bin/sec --conf=/etc/sec/application-log.rules --input=/var/log/application.log
    
[/code]

1行ごとに logger を実行するのは負荷が高いかもしれません。  
ログレベルごとにファイルに書き出して "tail -f" + logger" と組み合わせるとか。

[code]

    [/etc/sec/application-log.rules]
    type=Single
    ptype=RegExp
    pattern=(正規表現)
    desc=application.log Error
    action=write /var/log/application.log.error $0
    
    type=Single
    ptype=RegExp
    pattern=(正規表現)
    desc=application.log Warning
    action=write /var/log/application.log.warning $0
        :
    
    (コマンド)
        /usr/bin/sec --conf=/etc/sec/application-log.rules --input=/var/log/application.log
        tail -f /var/log/application.log.error | logger -p local1.error
        tail -f /var/log/application.log.warning | logger -p local1.warning
            :
    
[/code]


CC BY-SA 3.0
2016-03-07T02:47:27.370
22875
2016-03-07T02:47:27.370
4603
22809
answer


自己レスですが、syslog-ng では `source` の設定に `file()` driver を設定するとローカルファイルを読み込めるようです。

[6.3.2. file() source options - - The syslog-ng Open Source Edition 3.7
Administrator
Guide](http://www.balabit.com/sites/default/files/documents/syslog-ng-ose-
latest-guides/en/syslog-ng-ose-guide-admin/html/reference-source-file.html)


CC BY-SA 3.0
2016-03-08T13:55:46.850
22932
2016-03-08T13:55:46.850
5008
22809
answer