1

syslog4J で実装された syslog サーバーに送信される syslog メッセージを解析したいと考えています。syslog4Jでそれを行うことは可能ですか?

私がやりたいことは、ホスト名、タイムスタンプ、メッセージ、重大度レベルなどの syslog メッセージのさまざまなフィールドを分離し、将来の分析のために統一された syslog パターンを作成できるようにすることです。

この王様の機能は、rsyslog または syslogNG で利用できます。

SyslogServerConfigIF config = new TCPNetSyslogServerConfig("0.0.0.0", 1455);
config.setUseStructuredData(true);

SyslogServerIF syslogserver = SyslogServer.getInstance("tcp");
syslogserver.initialize("tcp", config);
syslogserver.run();
4

1 に答える 1

1

メッセージを処理する新しいイベント ハンドラー クラスを作成することから始めます。syslog イベントごとに呼び出されるので、解析は event() メソッドで行う必要があることに注意してください。

public class SyslogMessageHandler implements SyslogServerSessionEventHandlerIF {

@Override
public void event(Object session, SyslogServerIF syslogServer, 
                  SocketAddress socketAddress, SyslogServerEventIF event) {
    // Simple parsing for Strings in the message
    if (!event.getMessage().contains(" msg=\"")) {
        Logger.getLogger(getClass().getSimpleName()).log(Level.INFO, event.getMessage());
    }

    // You can also build Objects and/or use Pattern/Matcher for parsing.
    MyHTTPLogInfo info = new MyHTTPLogInfo(event.getMessage());
    Pattern myPattern = Pattern.compile("^GET\\s+/([^\\s\\?]*)(\\?\\S*)?\\s+HTTP/1\\.\\d$");
    Matcher matcher = myPattern.matcher(info.getHttpRequest());
    if (matcher.matches()) {
        Logger.getLogger(getClass().getSimpleName()).log(Level.INFO, info.getMyCustomLogOutput());
    }
}

@Override
public void exception(Object session, SyslogServerIF syslogServer, SocketAddress socketAddress, Exception exception) {
    Logger.getLogger(getClass().getSimpleName()).log(Level.INFO, "exception()");
}

@Override
public Object sessionOpened(SyslogServerIF syslogServer, SocketAddress socketAddress) {
    Logger.getLogger(getClass().getSimpleName()).log(Level.INFO, "sessionOpened()");
    return new Date();
}

@Override
public void sessionClosed(Object session, SyslogServerIF syslogServer, SocketAddress socketAddress, boolean timeout) {
    Logger.getLogger(getClass().getSimpleName()).log(Level.INFO, "sessionClosed() {0}", session);
}

@Override
public void initialize(SyslogServerIF syslogServer) {
    Logger.getLogger(getClass().getSimpleName()).log(Level.INFO, "initialize()");
}

@Override
public void destroy(SyslogServerIF syslogServer) {
    Logger.getLogger(getClass().getSimpleName()).log(Level.INFO, "destroy()");
}

最後に、その新しいクラスを EventHandler として syslog4j 構成に登録します。

eventHandler = new SyslogMessageHandler(); config.addEventHandler(eventHandler);

これで、さまざまなフォーマットとパターンのテストとデバッグを開始する準備が整いました:)

于 2014-03-05T15:42:35.647 に答える