初来公司时,java日志收集使用的nfs方式,将nfs server上的一块大容量磁盘挂载到所有java服务器的$catalina_home/logs目录,解决服务器本地空间不足问题;

这个方案的弊端是,如果nfs server想停机做个维护,几乎不可行;同时,多节点的日志在nfs服务器上是分开的,如果某个应用有8个节点,那查日志要查8个文件。

用syslog收集java日志,能完美解决这个问题。

安装syslog-ng

有兴趣建议看看官方文档:https://syslog-ng.com/documents/html/syslog-ng-ose-latest-guides/en/syslog-ng-ose-guide-admin/html/index.html

以下是Centos7.4上的安装过程
yum install zlib-devel libffi-devel
yum install pcre pcre-devel glib2-devel json-c json-c-devel openssl-devel安装以下4个依赖,方式都一样./configure && make && makeinstall
flex-2.6.4
bison-3.0.4
autoconf-archive-2017.09.28
pcre-8.41安装syslog-ng
cd syslog-ng-3.13.2
./configure --prefix=/syslog-ng --with-jsonc=system
make
make install

java输出日志主要通过log4j或logback,咱公司这两种都用到了,因此提供两种方式的syslog服务器。

syslog-ng for logback配置

syslog-ng.conf #############################################################################
# Default syslog-ng.conf file which collects all local logs into a
# single file called /var/log/messages.
#@version: 3.7
@include "scl.conf"options {keep-hostname(no);chain-hostnames(no);use-dns(no);flush-lines(0);time-reap(1);log-msg-size(4096);create-dirs(yes);  stats-freq(3600);owner (root);group(root);perm(0666);dir-perm(0777);
};source s_local {system();internal();
};destination d_local {file("/var/log/messages");
};log {source(s_local);destination(d_local);
};
#logback只支持udp方式输出udp,因此这里通过udp接受日志
source s_app {udp(ip(0.0.0.0) port(515)log_iw_size(50000));
};filter f_app {facility(local2) and (level(error) or level(info) or level(debug));
};
# syslog通过解析日志格式化输出,通过“|”分割日志;同时“[]”中作为一个整体,不做分割;
# 日志分割后,各个字段名称通过columns()来命名;
# template,指定从syslog协议中取的日志来源
parser p_msg {csv-parser(columns("APPNAME","FILENAME","MYDATE","LOGGER","INVOKENO","CONTENT")flags(escape-double-char,strip-whitespace,greedy)delimiters("|")quote-pairs('[]')template("${MSGHDR}${MESSAGE}"));
};
# 日志输出到/syslog/${APPNAME}下,以日期做后缀
# 日志格式通过template指定
destination d_appfile {file("/syslog/${APPNAME}/${FILENAME}-${LEVEL}.log.$YEAR$MONTH$DAY" template("${MYDATE}|$HOST|${LOGGER}|${INVOKENO}|${CONTENT}\n")log-fifo-size(500000));
};# 日志从收集到解析、输出的处理流
log {source(s_app);filter(f_app);parser(p_msg);destination(d_appfile);};# java程序logback.xml的配置
# 每个应用的日志可以按2个维度区分:级别、来源
# 级别(debug\info\warning\error)
# 日志来源(通过appender区分不同的java程序打印的日志,如用户登录访问日志,组件mybaits的日志等,可选)
# suffixPattern指定输出的格式,根据syslog-ng的指定,以“|”分割,myapp用于创建目录,myfile1用于文件的前缀<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false"><appender name="append1" class="ch.qos.logback.classic.net.SyslogAppender"><syslogHost>syslogserverip</syslogHost><port>515</port><facility>local2</facility><throwableExcluded>true</throwableExcluded><suffixPattern>[myapp]|myfile1|%date|%logger{50}|%X{invokeNo}|%X{userIP}|%X{userName}|%msg%n%xException</suffixPattern></appender><appender name="append2" class="ch.qos.logback.classic.net.SyslogAppender"><syslogHost>syslogserver</syslogHost><port>515</port><facility>local2</facility><throwableExcluded>true</throwableExcluded><suffixPattern>[myapp]|myfile2|%date|%logger{50}|%X{invokeNo}|%X{userIP}|%X{userName}|%msg%n%xException</suffixPattern></appender><appender name="other" class="ch.qos.logback.classic.net.SyslogAppender"><syslogHost>syslogserver</syslogHost><port>515</port><facility>local2</facility><throwableExcluded>true</throwableExcluded><suffixPattern>[myapp]|myfile3|%date|%logger{50}|%X{invokeNo}|%X{userIP}|%X{userName}|%msg%n%xException</suffixPattern></appender><logger name="package1" level="INFO" additivity="false"><appender-ref ref="append1" /></logger><logger name="package2" level="INFO" additivity="false"><appender-ref ref="append2" /></logger><root level="info"><appender-ref ref="other" /></root></configuration>

syslog-ng for log4j配置

syslog-ng.conf
#############################################################################
# Default syslog-ng.conf file which collects all local logs into a
# single file called /var/log/messages.
#
@version: 3.7
@include "scl.conf"options {keep-hostname(no);chain-hostnames(no);use-dns(no);flush-lines(0);time-reap(1);log-msg-size(4096);create-dirs(yes);  stats-freq(3600);owner (root);group(root);perm(0666);dir-perm(0777);
};source s_local {system();internal();
};
# log4j同时支持tcp\udp方式输出日志,但压力测试过程发现log4j的udp输出到日志服务器日志会串,即A应用的日志会写到B应用的文件中,用tcp没这样的问题
source s_app {tcp(ip(0.0.0.0) port(515)max-connections(500)log_iw_size(50000));
};filter f_app {facility(local2) and (level(error) or level(info) or level(debug));
};
# 因为log4j输出的格式和logback不同,因此syslog-ng解析方式也不同
parser p_msg {csv-parser(columns("MSG.TIME", "MSG.HOSTNAME", "MSG.APPNAME","MSG.PID","MSG.MESSAGEID","MSG.APPINFO","MSG.CONTENT")flags(escape-double-char,strip-whitespace,greedy)delimiters(" ")quote-pairs('[]'));
};rewrite r_nl {subst("#NewLine#","\n",value("MSG.CONTENT") flags(global));subst("mdc@18060 ","",value("MSG.APPINFO") flags(global));subst("syslogk[1-9]=\"","|",value("MSG.APPINFO") flags(global));subst("\" ","",value("MSG.APPINFO") flags(global));subst("\"","|",value("MSG.APPINFO") flags(global));
};destination d_local {file("/var/log/messages");
};destination d_appfile {file("/syslog/${MSG.APPNAME}/${MSG.MESSAGEID}-$LEVEL.log.$YEAR$MONTH$DAY" template("$(substr $(replace-delimiter 'T' ' ' ${MSG.TIME}) 0 23)|$HOST${MSG.APPINFO}${MSG.CONTENT} \n")log-fifo-size(500000));
};log {source(s_local);destination(d_local);
};log {source(s_app);filter(f_app);parser(p_msg);rewrite(r_nl);destination(d_appfile);flags(flow-control);
};# log4j2.xml
# <LoggerFields>中syslogk1是固定字段,对应类名称;syslogk2- syslogk9都是自定义字段,可用于记录登录的用户名,用户的客户端IP等个性化的信息;
# 不需要用的syskogkn,建议删除,否则日志文件中会多余的||,影响日志查看。
# 自定义内容的添加,在java程序中执行:MDC.put("syslogk2", "1111");<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="off"><Appenders><Syslog name="appender1" format="RFC5424" host="syslogserverip"port="515" protocol="TCP" appName="myappname" messageId="myfilename1"facility="LOCAL2" newLine="true" mdcId="mdc" includeMDC="true" newLineEscape="#NewLine#" exceptionPattern="%ex"immediateFlush="false" connectTimeoutMillis="3000" reconnectionDelayMillis="3000"><LoggerFields><KeyValuePair key="syslogk1" value="%l" /><KeyValuePair key="syslogk2" value="%X{syslogk2}" /> <KeyValuePair key="syslogk3" value="%X{syslogk3}" /><KeyValuePair key="syslogk4" value="%X{syslogk4}" /><KeyValuePair key="syslogk5" value="%X{syslogk5}" /></LoggerFields></Syslog><Syslog name="appender2" format="RFC5424" host="syslogserverip"port="515" protocol="TCP" appName="myappname" messageId="myfilename2"facility="LOCAL2" newLine="true" mdcId="mdc" includeMDC="true" newLineEscape="#NewLine#" exceptionPattern="%ex"immediateFlush="false" connectTimeoutMillis="3000" reconnectionDelayMillis="3000"><LoggerFields><KeyValuePair key="syslogk1" value="%l" /><KeyValuePair key="syslogk2" value="%X{syslogk2}" /><KeyValuePair key="syslogk3" value="%X{syslogk3}" /><KeyValuePair key="syslogk4" value="%X{syslogk4}" /><KeyValuePair key="syslogk5" value="%X{syslogk5}" /></LoggerFields></Syslog></Appenders><Loggers><Logger name="com.liebao.yunwei" level="debug" additivity="false"><AppenderRef ref="appender1" /></Logger><Root  level="debug"><AppenderRef ref="appender2" /></Root></Loggers>
</Configuration>

用syslog服务器收集java日志相关推荐

  1. ELK收集java日志

    转载来源:ELK收集java日志 https://www.jianshu.com/p/957e8ead3f8d 由于elasticsearch本身产生的日志就是java日志,所以我们可以通过ELK平台 ...

  2. ELK下logstash收集java日志,多行合并成一行

    介绍 使用codec的multiline插件实现多行匹配,这是一个可以将多行进行合并的插件,而且可以使用what指定将匹配到的行与前面的行合并还是和后面的行合并. 1.java日志收集测试 input ...

  3. logstash收集java日志,多行合并成一行

    使用codec的multiline插件实现多行匹配,这是一个可以将多行进行合并的插件,而且可以使用what指定将匹配到的行与前面的行合并还是和后面的行合并. 1.java日志收集测试 input {s ...

  4. filebeat收集java日志_filebeat采集多个项目日志 | 吴老二

    filebeat采集的日志内容包含java项目的和nginx日志,前期规划不同服务的日志路径应该进行区分.我们这里没有区分,java项目的日志和nginx的日志都存在一个路径下,导致在收集日志的时候, ...

  5. 搭建syslog服务器+log4j2输出日志到syslog

    文章目录 前言 搭建syslog服务器 修改rsyslog配置 自定义配置 测试验证 Log4j2依赖 Log4j2配置 测试接口 验证 日志转发 参考资料 前言 本文将介绍如何搭建syslog服务器 ...

  6. 在 Linux 上配置一个 syslog 服务器

    本文导航 -syslog标准基础11% -在Linux中配置Rsyslog33% -第1步: 初始化系统需求36% -第2步: 让rsyslog 后台进程生效39% -第3步:创建日志接收模板48% ...

  7. 配置linux syslog服务器+配置syslog客户端

    参考文档: 1)https://linux.cn/article-5023-1.html:在 Linux 上配置一个 syslog 服务器 2)http://www.111cn.net/sys/Cen ...

  8. java 如何去掉http debug日志_你居然还去服务器上捞日志,搭个日志收集系统难道不香吗?...

    作者:MacroZheng 链接:https://juejin.im/post/5eef217d51882565d74fb4eb 来源:掘金 SpringBoot实战电商项目mall(35k+star ...

  9. java 实现syslog 服务器_应用程序的日志通过rsyslog推送到syslog服务器

    centos5系列系统自带为syslog1.4.1 centos6系列自带rsyslog版本为5.8.10 centos7系列自带rsyslog版本为7.4.7 目前最新版rsyslog为8.27.0 ...

最新文章

  1. 硬核艿艿,新鲜出炉,直接带你弄懂 Spring Boot Jar 启动原理!
  2. Java 应用中的日志
  3. c语言 字符串 if,C语言用if(strstr(s1,s2))判断字符串是否存在子字符串,无论有没有都会进入到if里是怎么回事?...
  4. cdr文件过大导出pdf打不开_PDF文件过大怎样压缩?这才是压缩PDF最简单的方法
  5. 【转】带你玩转Visual Studio——01.开篇介绍
  6. 面试精讲之面试考点及大厂真题 - 分布式专栏 14 全面了解Kafka的使用与特性
  7. 业务监控系统如何做,一起来看看如何使用Statsd+Graphite+Grafana搭建业务监控系统
  8. Qt中的对话框(模态,非模态,关于,问题,文件)
  9. 就在刚刚,人工智能微专业来啦
  10. 水面反光如何拍摄_如何抓拍水的不同瞬间
  11. WPF 自定义分页控件TextBox分页页数只输入数字验证
  12. 数据结构 基本概念(数据项--数据元素--数据对象-数据类型-抽象数据类型)
  13. (原创)Linux设备轮询机制分析
  14. ubuntu使用记录(3)ubuntu 防火墙开放端口(开启ssh)
  15. python与c语言混合编程_python和C语言混编的几种方式
  16. java 四则运算_四则运算————javaweb版
  17. 被尘封的故事技能点bug_12个人闯进失落的世界,发现了尘封盛世的秘密
  18. php显示星期几,php怎么实现获取显示星期几
  19. NOIP提高组1580~1590集合答案
  20. 面经手册 · 开篇《面试官都问我啥》

热门文章

  1. 电机参数与脉冲当量的计算方法
  2. 欧盟玩具新标准IEC/EN62115
  3. 【熵与特征提取】基于“信息熵”的特征指标及其MATLAB代码实现(功率谱熵、奇异谱熵、能量熵)
  4. sql server查询死锁语句
  5. 【故障诊断】基于贝叶斯优化支持向量机的轴承故障诊断附matlab代码
  6. 概率论常见面试问题总结,含答案
  7. 一招解决Android 加载高清大图
  8. 基于python+django框架+Mysql数据库的校园鲜花水果商城系统设计与实现
  9. Android校园购物app案例(javaweb服务端)
  10. 新任技术管理者应该怎样去开始帮助他人?