Chainsaw 以外のものを使用しようとしていますが、これはサポートされていないようで、Java 1.8.0_72 では開始できません。Chainsaw で使用したのと同じ Log4j ファイルを使用して OtrosLogView を試していましたが、次のエラーが発生し続けます。
java.lang.ClassCastException: java.net.Inet4Address cannot be cast to java.lang.String
at pl.otros.logview.parser.log4j.Log4jUtil.translateLog4j(Log4jUtil.java:68)
at pl.otros.logview.importer.Log4jSerilizedLogImporter.importLogs(Log4jSerilizedLogImporter.java:67)
at pl.otros.logview.reader.SocketLogReader$SocketHandler.run(SocketLogReader.java:103)
at java.lang.Thread.run(Thread.java:745)
私のlog4j構成ファイルの詳細は次のとおりです。
log4j.rootCategory=DEBUG stdout, SOCKET
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] [%t] %-5p %c{1}:%L - %m%n
log4j.appender.stdout.threshold=ERROR
log4j.appender.SOCKET=org.apache.log4j.net.SocketHubAppender
log4j.appender.SOCKET.RemoteHost=localhost
log4j.appender.SOCKET.Port=50505
log4j.appender.SOCKET.LocationInfo=true
log4j.appender.SOCKET.ReconnectionDelay=10000
log4j.appender.SOCKET.threshold=DEBUG
うまくいかないことに本当にイライラしています。OtrosLogViewer のソース コードを調べたところ、エラーがどこで発生したかがわかります。
// Starting from line 64 of pl.otros.logview.parser.log4j.Log4jUtil.translateLog4j()
ld.setProperties(IMMUTABLE_EMPTY_MAP);
Map properties = event.getProperties();
if (properties != null) {
Map<String, String> props = new HashMap<>(properties.size());
for (Object key : properties.keySet()) {
String value = (String) properties.get(key);
if (StringUtils.isNotBlank(value)) {
props.put(key.toString(), value);
}
}
if (props.size() > 0) {
ld.setProperties(props);
}
}
ご覧のとおり、すべてのプロパティを文字列のように扱いますが、エラー レポートのように、プロパティの 1 つが Inet4Address であるため、すべてのプロパティが文字列であるとは限りません。値をキャストする代わりに、値に対して toString を実行しなかったのはなぜですか? コードをチェックアウトして自分で修正できると思いますが、SocketHubAdapter を取得してプロパティ値を文字列として送信する方法はありますか?