设为首页 收藏本站
查看: 1538|回复: 0

[经验分享] 修改Flume Log4j Appender

[复制链接]

尚未签到

发表于 2015-11-27 17:52:39 | 显示全部楼层 |阅读模式

自定义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 配置



[color=#586E75!important]1
[color=#586E75!important]2
[color=#586E75!important]3
[color=#586E75!important]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中配置,添加:



[color=#586E75!important]1
[color=#586E75!important]2

#应用程序名
log4j.appender.flume.Appname = 91pc



  • 在Log4jAppender类中添加:


[color=#586E75!important]1
[color=#586E75!important]2
[color=#586E75!important]3
[color=#586E75!important]4
[color=#586E75!important]5
[color=#586E75!important]6
[color=#586E75!important]7
[color=#586E75!important]8
[color=#586E75!important]9

private String appname;

public String getAppname() {
  return appname;
}

public void setAppname(String appname) {
  this.appname = appname;
}



  • hostname,logtype在Log4jAppender类中添加


[color=#586E75!important]1
[color=#586E75!important]2
[color=#586E75!important]3
[color=#586E75!important]4
[color=#586E75!important]5
[color=#586E75!important]6
[color=#586E75!important]7
[color=#586E75!important]8
[color=#586E75!important]9
[color=#586E75!important]10
[color=#586E75!important]11
[color=#586E75!important]12
[color=#586E75!important]13
[color=#586E75!important]14
[color=#586E75!important]15
[color=#586E75!important]16
[color=#586E75!important]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()中添加如下:



[color=#586E75!important]1
[color=#586E75!important]2
[color=#586E75!important]3
[color=#586E75!important]4
[color=#586E75!important]5
[color=#586E75!important]6
[color=#586E75!important]7
[color=#586E75!important]8
[color=#586E75!important]9
[color=#586E75!important]10
[color=#586E75!important]11
[color=#586E75!important]12
[color=#586E75!important]13
[color=#586E75!important]14
[color=#586E75!important]15
[color=#586E75!important]16
[color=#586E75!important]17
[color=#586E75!important]18
[color=#586E75!important]19
[color=#586E75!important]20
[color=#586E75!important]21
[color=#586E75!important]22
[color=#586E75!important]23
[color=#586E75!important]24
[color=#586E75!important]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&#43;&#43;) {
      msg &#43;= s;
      msg &#43;= Layout.LINE_SEP;
  }
    }
  }
  
  flumeEvent = EventBuilder.withBody(msg, Charset.forName(&quot;UTF8&quot;), hdrs);
}
try {
  rpcClient.append(flumeEvent);


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



[color=#586E75!important]1
[color=#586E75!important]2
[color=#586E75!important]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)

[size=0.85em]
Posted by EdwardsBean Dec
26th, 2013 Flume

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-144296-1-1.html 上篇帖子: Flume NG 学习笔记(九)Flune Client 开发 下篇帖子: 日志系统之扩展Flume-LineDeserializer
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表