【问题标题】:Log4j unstructured log parser in Java or ScalaJava 或 Scala 中的 Log4j 非结构化日志解析器
【发布时间】:2017-12-02 07:03:16
【问题描述】:

问题

如何在 Java/Scala 中解析非结构化的 Log4J 日志。

背景

关于如何解析 Log4J 日志有很多问题,但他们大多建议使用 XML 或 JSON appender 来输出结构化输出以进行解析。但是需要以编程方式解析已经生成的非结构化日志文件,而不是使用诸如 logstash、chainsaws GUI 之类的工具。

Help with LogFilePatternReceiver 显示了方法,但它需要“插件”支持,这应该在 Log4J 1.3 中实现,但 Log4J 1.x 在 1.2.x 中停止。看起来 Log4J 2 没有 LogFilePatternReceiver。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration >
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="true">
    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.SimpleLayout"/>
        <filter class="org.apache.log4j.filter.ExpressionFilter">
            <param name="Expression" value="msg ~= 'SPECIFY CASE-INSENSITIVE MSG MATCH HERE'" />
            <param name="AcceptOnMatch" value="true"/>
        </filter>
        <filter class="org.apache.log4j.filter.DenyAllFilter"/>
    </appender>

    <plugin name="LOGFILE" class="org.apache.log4j.varia.LogFilePatternReceiver">
        <param name="fileURL" value="file:///c:/some.log"/>
        <param name="timestampFormat" value="yyyy-MM-dd HH:mm:ss,SSS"/>
        <param name="logFormat" value="TIMESTAMP LEVEL [LOGGER] MESSAGE"/>
        <param name="name" value="my log file"/>
        <param name="tailing" value="true"/>
    </plugin>

    <root>
        <level value="DEBUG"/>
        <appender-ref ref="CONSOLE"/>
    </root>
</log4j:configuration> 

org.apache.log4j.lf5.util.LogFileParse 包中有一个类LogFileParser,但不知道如何使用它。有一个工具OtrosLogViewer,但如果可能的话,最好不要有第 3 方依赖项。

选项

Re: Extract log info from each output log line on the console 建议参考电锯代码。阅读代码并实现类似的选项是一种选择,但如果已经有一种已知的解析日志的方法,想先了解它。

参考文献

【问题讨论】:

    标签: parsing log4j


    【解决方案1】:

    通过使用 log4j 和 extras 1.2 jars 找到了一种方法,尽管不适用于 Log4J 2。

    Java

    import org.apache.log4j.Logger;
    import org.apache.log4j.spi.LoggingEvent;
    import org.apache.log4j.receivers.varia.LogFilePatternReceiver;
    
    public class LogParser extends LogFilePatternReceiver {
        final static Logger logger = Logger.getLogger(LogParser.class);
    
        public void doPost(LoggingEvent event) {
            System.out.println(event.getTimeStamp());
            System.out.println(event.getMessage());
        }
        public static void main(String[] args) {
            (new LogParser()).run();
        }
        private void run(){
            LogFilePatternReceiver r = new LogParser();
            r.setLogFormat("TIMESTAMP LEVEL [THREAD] CLASS (FILE:LINE) - MESSAGE");
            r.setFileURL("file:///tmp/log");
            r.setTimestampFormat("yyyy-MM-dd HH:mm:ss,SSS");
            r.setTailing(true);
            r.setLoggerRepository(logger.getLoggerRepository());
    
            r.activateOptions();
        }
    }
    

    log4j.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
    
    <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
        <appender name="console" class="org.apache.log4j.ConsoleAppender">
            <param name="Target" value="System.out"/>
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
            </layout>
        </appender>
        <root>
            <priority value ="debug" />
            <appender-ref ref="console" />
        </root>
    </log4j:configuration>
    

    示例日志文件

    2017-12-02 16:53:42,618 DEBUG [main] LogParser (LogParser.java:15) - message 1
    2017-12-02 16:53:42,624 DEBUG [main] LogParser (LogParser.java:16) - message 2
    

    结果

    2017-12-02 19:21:31,633 INFO  [main] spi.Log4JULogger (Log4JULogger.java:104) - activateOptions
    2017-12-02 19:21:31,652 DEBUG [LogFilePatternReceiver-plugin] spi.Log4JULogger (Log4JULogger.java:58) - regexp is (\S+-\S+-\S+ \S+:\S+:\S+,\S+)[ ]+(\S*\s*?)[ ]+\[(.*?)\][ ]+(.*?)[ ]+\((.*?):(.*?)\)[ ]+\-[ ]+(.*)
    2017-12-02 19:21:31,652 INFO  [LogFilePatternReceiver-plugin] spi.Log4JULogger (Log4JULogger.java:104) - attempting to load file: file:///tmp/log
    
    1512194022618
    message 1
    1512194022624
    message 2
    
    2017-12-02 19:21:33,656 DEBUG [LogFilePatternReceiver-plugin] spi.Log4JULogger (Log4JULogger.java:58) - tailing file
    2017-12-02 19:21:35,660 DEBUG [LogFilePatternReceiver-plugin] spi.Log4JULogger (Log4JULogger.java:58) - tailing file
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-15
      • 2017-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-17
      • 1970-01-01
      相关资源
      最近更新 更多