ELK 记载  java log4j 时,一个报错会生成很多行,阅读起来很不方便。

类似这样

解决这个问题的方法

1.使用多行合并

合并多行数据(Multiline)

有些时候,应用程序调试日志会包含非常丰富的内容,为一个事件打印出很多行内容。这种日志通常都很难通过命令行解析的方式做分析。

而 logstash 正为此准备好了 codec/multiline 插件!

小贴士:multiline 插件也可以用于其他类似的堆栈式信息,比如 linux 的内核日志。

参考文章:logstash 安装插件multiline

配置文件

  1. input {
  2. file {
  3. path => "/root/error.log"
  4. codec => multiline {
  5. pattern => "^\["
  6. negate => true
  7. what => "previous"
  8. }
  9. start_position => "beginning"
  10. sincedb_path => "/dev/null"
  11. ignore_older=>
  12. }
  13. }
  14. output {
  15. elasticsearch { hosts => ["10.10.15.90:9200"]
  16. index => "testjava"
  17. }
  18. stdout { codec => rubydebug }
  19. }

以上配置文件,将 不是以 " [ "  这个符号开头的行并入上一个事件中。

测试文本error.log

  1. [-- ::]ERROR com.alibaba.druid.pool.DruidAbstractDataSource(line:) -oracle.jdbc.driver.OracleDriver is deprecated.
  2. [-- ::]ERROR com.alibaba.druid.pool.DruidAbstractDataSource(line:) -oracle.jdbc.driver.OracleDriver is deprecated.
  3. [-- ::]ERROR com.alibaba.dubbo.container.Main(line:) - [DUBBO] Error creating bean with name 'YSWPurchaseListService': Cannot resolve reference to bean 'ySWPurchaseListServiceImpl' while setting bean property 'ref'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'ySWPurchaseListServiceImpl' available, dubbo version: 2.5., current host: 127.0.0.1
  4. org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'YSWPurchaseListService': Cannot resolve reference to bean 'ySWPurchaseListServiceImpl' while setting bean property 'ref'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'ySWPurchaseListServiceImpl' available
  5. at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:)
  6. at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:)
  7. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:)
  8. Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'ySWPurchaseListServiceImpl' available
  9. at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:)
  10. ... more
  11. [-- ::]ERROR com.alibaba.druid.pool.DruidAbstractDataSource(line:) -oracle.jdbc.driver.OracleDriver is deprecated.
  12. [-- ::]ERROR com.alibaba.druid.pool.DruidAbstractDataSource(line:) -oracle.jdbc.driver.OracleDriver is deprecated.hello world
  13. [hello world
  14. 111111111111111hello world
  15. [222222222hello world
  16. [333333hello world

运行结果

  1. {
  2. "@timestamp" => --29T02::.340Z,
  3. "message" => "[2018-06-05 17:23:57]ERROR com.alibaba.druid.pool.DruidAbstractDataSource(line:1134) -oracle.jdbc.driver.OracleDriver is deprecated.",
  4. "path" => "/root/error.log",
  5. "host" => "localhost.localdomain",
  6. "@version" => ""
  7. }
  8. {
  9. "@timestamp" => --29T02::.264Z,
  10. "message" => "[2018-06-05 17:23:57]ERROR com.alibaba.druid.pool.DruidAbstractDataSource(line:1134) -oracle.jdbc.driver.OracleDriver is deprecated.",
  11. "path" => "/root/error.log",
  12. "host" => "localhost.localdomain",
  13. "@version" => ""
  14. }
  15. {
  16. "tags" => [
  17. [] "multiline"
  18. ],
  19. "host" => "localhost.localdomain",
  20. "@version" => "",
  21. "@timestamp" => --29T02::.349Z,
  22. "message" => "[2018-06-05 17:23:59]ERROR com.alibaba.dubbo.container.Main(line:86) - [DUBBO] Error creating bean with name
  1. 'YSWPurchaseListService': Cannot resolve reference to bean 'ySWPurchaseListServiceImpl' while setting bean property 'ref'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'ySWPurchaseListServiceImpl' available, dubbo version: 2.5.3,
  1. current host: 127.0.0.1\norg.springframework.beans.factory.BeanCreationException: Error creating bean with name 'YSWPurchaseListService':
  1. Cannot resolve reference to bean 'ySWPurchaseListServiceImpl' while setting bean property 'ref'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'ySWPurchaseListServiceImpl'
  1. available\n\tat org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:378)\n\tat
  1. org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:110)\n\tat org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1613)\nCaused by:
  1. org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'ySWPurchaseListServiceImpl' available\n\tat
  1. org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:367)\n\t... 17 more",
  2. "path" => "/root/error.log"
  3. }
  4. {
  5. "@timestamp" => --29T02::.353Z,
  6. "message" => "[2018-06-05 17:25:05]ERROR com.alibaba.druid.pool.DruidAbstractDataSource(line:1134) -oracle.jdbc.driver.OracleDriver is deprecated.",
  7. "path" => "/root/error.log",
  8. "host" => "localhost.localdomain",
  9. "@version" => ""
  10. }
  11. {
  12. "@timestamp" => --29T02::.353Z,
  13. "message" => "[2018-06-05 17:26:05]ERROR com.alibaba.druid.pool.DruidAbstractDataSource(line:1134) -oracle.jdbc.driver.OracleDriver is deprecated.hello world",
  14. "path" => "/root/error.log",
  15. "host" => "localhost.localdomain",
  16. "@version" => ""
  17. }
  18. {
  19. "tags" => [
  20. [] "multiline"
  21. ],
  22. "host" => "localhost.localdomain",
  23. "@version" => "",
  24. "@timestamp" => --29T02::.354Z,
  25. "message" => "[hello world\n111111111111111hello world",
  26. "path" => "/root/error.log"
  27. }
  28. {
  29. "@timestamp" => --29T02::.354Z,
  30. "message" => "[222222222hello world",
  31. "path" => "/root/error.log",
  32. "host" => "localhost.localdomain",
  33. "@version" => ""
  34. }
  35. q^H^C[WARN ] -- ::19.902 [SIGINT handler] runner - SIGINT received. Shutting down.
  36. {
  37. "@timestamp" => --29T02::.848Z,
  38. "message" => "[333333hello world",
  39. "path" => "/root/error.log",
  40. "host" => "localhost.localdomain",
  41. "@version" => ""
  42. }

测试结果:
测试文本中的语句,按照  "[" 这个符号,被分割成了 7 个事件(总共8个事件),最后一个事件没有显示是正常的

这是因为你最后输入的回车符 \n 并不匹配设定的 ^\[ 正则表达式,

logstash 还得等下一行数据直到匹配成功后才会输出这个事件。

解释

其实这个插件的原理很简单,就是把当前行的数据添加到前面一行后面,,直到新进的当前行匹配 ^\[ 正则为止。

这个正则还可以用 grok 表达式,稍后你就会学习这方面的内容。

2.使用插件input/log4j

logstash 还提供了另一种处理 log4j 的方式:input/log4j。
与 codec/multiline 不同,这个插件是直接调用了 org.apache.log4j.spi.LoggingEvent 处理 TCP 端口接收的数据。

ELK 记录 java log4j 类型日志的更多相关文章

  1. nginx不记录指定文件类型日志

    1.指定记录文件日志记录的内容. vim /usr/local/nginx/conf/nginx.conf如下部分: log_format dd '$remote_addr $http_x_forwa ...

  2. Java log4j slf4j 日志配置笔记

    http://www.cnblogs.com/Scott007/p/3269018.html 日志的打印,在程序中是必不可少的,如果需要将不同的日志打印到不同的地方,则需要定义不同的Appender, ...

  3. java log4j 打日志到控制台同时打印到不同文件

    1.pom配置 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...

  4. 学习记录 java 值类型和引用类型的知识

    1. Java中值类型和引用类型的不同? [定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个参数给另一个方法时,你在另一个方法中改变这个变量的值, 那么调用这个方法是传入的变量的值也将改变 ...

  5. LAMP 2.1Apache不记录指定文件类型日志

    访问日志只需要记地址,不用记录图片. 对无用的图片日志做标记,针对标记做限制.打开 vim /usr/local/apache2/conf/extra/httpd-vhosts.conf 把 Erro ...

  6. ELK环境配置+log4j日志记录

    ELK环境配置+log4j日志记录 1. 背景介绍 在大数据时代,日志记录和管理变得尤为重要. 以往的文件记录日志的形式,既查询起来又不方便,又造成日志在服务器上分散存储,管理起来相当麻烦, 想根据一 ...

  7. slf4j+log4j在Java中实现日志记录

    小Alan今天来跟大家聊聊开发中既简单又常用但必不可少的一样东西,那是什么呢?那就是日志记录,日志输出,日志保存. 后面就统一用日志记录四个字来形容啦. 日志记录是项目的开发中必不可少的一个环节,特别 ...

  8. Java中使用Log4j记录错误、输出日志

    简介: Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件.甚至是套接口服务器.NT的事件记录器.UNIX Syslog守护进 ...

  9. java Log4j日志配置详解大全

    一.Log4j简介 Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局).这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出.综合使 ...

随机推荐

  1. 微信小程序点击图片放大

    WXML: <view class='imgList'> <view class='imgList-li' wx:for='{{imgArr}}'> <image cla ...

  2. 为WPF, UWP 及 Xamarin实现一个简单的消息组件

    原文地址:Implementing a simple messenger component for WPF, UWP and Xamarin 欢迎大家关注我的公众号:程序员在新西兰了解新西兰IT行业 ...

  3. WordPress使用PHPMailer发送gmail邮件

    wordpress使用phpmailer发送gmail邮件 0.保证用于gmail账号已经开启imap服务,且你能正常访问到gmail的smtp服务.(需要climb over the wall) 1 ...

  4. 20190925Java课堂记录(一)

    判断字符串是否回文 设计思想 利用递归,每次返回长度减二的字符串,最终返回结果 源程序代码 import java.util.Scanner; public class palindrome { st ...

  5. 投影方式- Unity3D游戏开发培训

    投影方式- Unity3D游戏开发培训   作者:Jesai 2018-02-12 20:33:13 摘  要 透视投影是3D渲染的基本概念,也是3D程序设计的基础.掌握透视投影的原理对于深入理解其他 ...

  6. 9.Super详解

    super注意点: surper()是调用父类的构造方法,而且必须在构造方法的第一个 super必须只能出现在子类的方法或者构造方法中! super()和this()不能同时调用构造方法! Vs th ...

  7. 网络通信-基本概念:网络、IP地址、端口、socket

    目录 网络通信 1 网络 1.1 网络定义 1.2 使用网络的目的 1.3 总结 2 IP地址 2.1 ip地址的作用 2.2 ip地址的分类 3 端口 3.1 什么是端口 3.2 端口号 3.3 端 ...

  8. 【转】document.form.action,表单分向提交

    document.form.action,表单分向提交,javascript提交表单 同一个表单可以根据用户的选择,提交给不同的后台处理程序.即,表单的分向提交.如,在编写论坛程序时,如果我们希望实现 ...

  9. ninject 的 实现 的 理解

    mvc 用ninject 好像 有 的. 加上 ClassDiagram  .ClassDiagram1.rar Represents a site on a type where a value c ...

  10. Java的String类常用方法

    一.构造函数 String(byte[ ] bytes):通过byte数组构造字符串对象. String(char[ ] value):通过char数组构造字符串对象. String(Sting or ...