修改Flume Log4j Appender

简介: <div class="entry-content" style="margin:0px; padding:0px; border:0px; font-family:'PT Serif',Georgia,Times,'Times New Roman',serif; line-height:27.59375px; font-size:18px; vertical-align:baseline

自定义Log4j Appender

要修改Flume Log4j Appender的实现,我们先了解一下Log4j Appender是如何自定义的。

自定义log4j appender需要继承log4j公共的基类:AppenderSkeleton

  • 打印日志核心方法:abstract protected void append(LoggingEvent event);
  • 初始化加载资源:public void activateOptions(),默认实现为空
  • 释放资源:public void close()
  • 是否需要按格式输出文本:public boolean requiresLayout()
  • 正常情况下我们只需要覆盖append方法即可。然后就可以在log4j中使用了

Demo:

1. import org.apache.log4j.AppenderSkeleton;  
2. import org.apache.log4j.spi.LoggingEvent;  
3.   
4. public class HelloAppender extends AppenderSkeleton {  
5.   
6.     private String account ;  
7.       
8.     @Override  
9.     protected void append(LoggingEvent event) {  
10.         System.out.println("Hello, " + account + " : "+ event.getMessage());  
11.     }  
12.   
13.     @Override  
14.     public void close() {  
15.         // TODO Auto-generated method stub  
16.   
17.     }  
18.   
19.     @Override  
20.     public boolean requiresLayout() {  
21.         // TODO Auto-generated method stub  
22.         return false;  
23.     }  
24.   
25.     public String getAccount() {  
26.         return account;  
27.     }  
28.   
29.     public void setAccount(String account) {  
30.         this.account = account;  
31.     }  
32. }  

1. public static void main(String[] args) {  
2.     Log log = LogFactory.getLog("helloLog") ;  
3.     log.info("I am ready.") ;  
4. }  

log4j.properties 配置

1
2
3
4
log4j.logger.helloLog=INFO, hello

log4j.appender.hello=HelloAppender
log4j.appender.hello.account=World

执行main函数,输出结果 Hello, World : I am ready.

修改FLume Log4j Appender

Event Header加入appname,hostname,logtype

由于hostname,logtype是固定不变的。所以直接写死在代码中。appname则用log4j.properties进行配置 – appname在log4j.properties中配置,添加:

1
2
#应用程序名
log4j.appender.flume.Appname = 91pc
  • 在Log4jAppender类中添加:
1
2
3
4
5
6
7
8
9
private String appname;

public String getAppname() {
  return appname;
}

public void setAppname(String appname) {
  this.appname = appname;
}
  • hostname,logtype在Log4jAppender类中添加
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//author:scy
try {
  hdrs.put("hostname", InetAddress.getLocalHost()+"");
} catch (UnknownHostException e1) {
      String msg = "Cant't get localhost IP";
      LogLog.error(msg);
      if (unsafeMode) {
        return;
      }
      throw new FlumeException(msg + " Exception follows.", e1);
}
//author:scy Need to alarm(>Info)
if(event.getLevel().toInt() > 20000){
  hdrs.put("logtype", "alarm");
}else{
  hdrs.put("logtype", "log4j");
}

Flume Log4j Appender添加log4j的异常详细信息

由于Flume Log4j Appender并没有将Log4j的错误异常栈详细信息封装到Event中,不利于我们的告警系统分析原因。 Log4jAppender.append()中添加如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Event flumeEvent;
Object message = event.getMessage();
if (message instanceof GenericRecord) {
..
} else {
  hdrs.put(Log4jAvroHeaders.MESSAGE_ENCODING.toString(), "UTF8");
  //按照log4j.properties配置格式化日志
  String msg = layout != null ? layout.format(event) : message.toString();
        
  //author:edwardsbean
  if(layout.ignoresThrowable()) {
      String[] s = event.getThrowableStrRep();
      if (s != null) {
  int len = s.length;
  for(int i = 0; i < len; i++) {
      msg += s[i];
      msg += Layout.LINE_SEP;
  }
    }
  }
  
  flumeEvent = EventBuilder.withBody(msg, Charset.forName("UTF8"), hdrs);
}
try {
  rpcClient.append(flumeEvent);

日志接收端就可以接受到日志的详细信息:

1
2
3
 [x] Received '2013-12-26 10:38:08 user log detail
 [nd-PC2600/192.168.253.126] FATAL [com.xx.test.Main] java.lang.Exception: error detail
  at com.xx.test.Main.main(Main.java:35)

 Dec 26th, 2013  Flume

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
2月前
|
Java
flume的log4j.properties配置说明
flume的log4j.properties配置说明
|
分布式计算 Hadoop 分布式数据库
SLF4J: Hbase和Flume的slf4j-log4j12-x.x.xx.jar与hadoop的slf4j-log4j12-x.x.xx.jar冲突
SLF4J: Hbase和Flume的slf4j-log4j12-x.x.xx.jar与hadoop的slf4j-log4j12-x.x.xx.jar冲突
140 0
SLF4J: Hbase和Flume的slf4j-log4j12-x.x.xx.jar与hadoop的slf4j-log4j12-x.x.xx.jar冲突
|
监控 Java
通过Alibaba Cloud Log Log4j Appender采集日志到阿里云日志服务
Log4j是Apache的一个开放源代码项目,通过使用Log4j,您可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;您也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,您能够更加细致地控制日志的生成过程。
5509 0
|
Arthas Java 测试技术
Java技术周刊第9期:自定义log4j的appender写es日志
Java的开发者们:云栖社区已有5000位Java开发者,发布了30000+Java文章(文章列表),沉淀了7000+的Java精品问答(问答列表)。 Java技术周刊将会为大家介绍最新的Java技术与动态、预告活动、最热问答、直播教程等,欢迎大家订阅Java技术周刊。
7587 0
|
监控 Java Docker
自定义log4j的appender写es日志
本篇和大家分享的是自定义log4j的appender,用es来记录日志并且通过kibana浏览es记录;就目前互联网或者一些中大型公司通常会用到第三方组合elk,其主要用写数据到es中,然后通过可视化工具kibana来做直观数据查看和统计;本篇内容节点如下: docker快速搭建es,es he...
3989 0
|
Web App开发 存储 监控
Flume + Solr + log4j搭建web日志采集系统
首先我们有多个web 应用,每个web应用每天都有不断的日志产生,这些日志文件现在以文件的形式存储在服务器当中,我们需要收集这些日志,并对日志进行查询。 所以整个流程就是,Flume agent 收集日志 -> Morphline 进行过滤 -> 对结果进行索引然后在Solr中进行搜索。
2301 0
|
分布式计算 Hadoop Java
log4j2+flume+hadoop
数据采集框架
3675 0