最近在做后台项目改造,将原来的项目变成springCloud微服务架构的。其中做了elk日志收集,人手有限没有用到异步消息,filebeat之类的,先做个低配的吧。直接log4j2将日志扔到logstash里面去,大体配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<!--
6个优先级从高到低依次为:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL。
如果设置优先级为WARN,那么OFF、FATAL、ERROR、WARN 4个级别的log能正常输出
设置为OFF 表示不记录log4j2本身的日志,
-->
<!-- status:用来指定log4j本身的打印日志级别,monitorInterval:指定log4j自动重新配置的监测间隔时间 -->
<Configuration status="INFO" monitorInterval="30">
<!-- 自己设置属性,后面通过${}来访问 -->
<!--
<properties>
<property name="LOG_HOME">${web:rootDir}/logs</property>
</properties>
-->
<Appenders>
<!--这个输出控制台的配置-->
<Console name="Console" target="SYSTEM_OUT">
<!--控制台只输出level及其以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${log.pattern}"/>
</Console>
<Socket name="Logstash_client" host="xxx.xxx.xxx.xx" port="1560" protocol="TCP">
<PatternLayout pattern="${PATTERN}"/>
</Socket>
<Socket name="Logstash_edit" host="xxx.xxx.xxx.xx" port="1561" protocol="TCP">
<PatternLayout pattern="${PATTERN}"/>
</Socket>
</Appenders>
<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
<Loggers>
<Logger name="client_log" level="debug">
<AppenderRef ref="Logstash_client"/>
<AppenderRef ref="Console"/>
</Logger>
<Logger name="edit_log" level="debug" additivity="false">
<AppenderRef ref="Logstash_edit"/>
<AppenderRef ref="Console"/>
</Logger>
</Loggers>
</Configuration>
logstash那边的配置tcp接收
1. input {
2. tcp{
3. port => 1560
4. }
5. tcp{
6. port => 1561
7. }
8. }
java里面调用:
//编辑后台的
logger Logger logger_edit= LogManager.getLogger("edit_log");
//客户端的
logger Logger logger_client= LogManager.getLogger("client_log");
ok,可以接收到。
可是有个问题,logstash重启之后,就接收不到日志了,除非log4j2程序重启才可以,这不行啊,线上环境岂能随便重启。百度谷歌群里大咖一通问,找到办法了。不适用socket长连接甩日志了,改用gelf就可以,基本配置:
pom:
<dependency>
<groupId>biz.paluch.logging</groupId>
<artifactId>logstash-gelf</artifactId>
<version>1.11.1</version> </dependency>
log4j2:
<?xml version="1.0" encoding="UTF-8"?>
<!--
6个优先级从高到低依次为:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL。
如果设置优先级为WARN,那么OFF、FATAL、ERROR、WARN 4个级别的log能正常输出
设置为OFF 表示不记录log4j2本身的日志,
-->
<!-- status:用来指定log4j本身的打印日志级别,monitorInterval:指定log4j自动重新配置的监测间隔时间 -->
<Configuration status="INFO" monitorInterval="30">
<!-- 自己设置属性,后面通过${}来访问 -->
<!--
<properties>
<property name="LOG_HOME">${web:rootDir}/logs</property>
</properties>
-->
<Appenders>
<Gelf name="Logstash_client"
host="udp:ip地址"
port="1560"
version="1.1"
extractStackTrace="true"
filterStackTrace="true"
mdcProfiling="true"
includeFullMdc="true" maximumMessageSize="8192"
originHost="%host{fqdn}" additionalFieldTypes="fieldName1=String,fieldName2=Double,fieldName3=Long">
<Field name="level" pattern="%level"/>
<Field name="message" pattern="%message"/>
</Gelf>
<Gelf name="Logstash_edit" host="udp:ip地址" port="1561" version="1.1" extractStackTrace="true"
filterStackTrace="true" mdcProfiling="true" includeFullMdc="true" maximumMessageSize="8192"
originHost="%host{fqdn}" additionalFieldTypes="fieldName1=String,fieldName2=Double,fieldName3=Long">
<Field name="level" pattern="%level"/>
<Field name="message" pattern="%message"/>
</Gelf>
<Socket name="Logstash_client" host="222.175.121.252" port="1560" protocol="TCP">
<PatternLayout pattern="${PATTERN}"/>
</Socket>
<Socket name="Logstash_edit" host="222.175.121.252" port="1561" protocol="TCP">
<PatternLayout pattern="${PATTERN}"/>
</Socket>
</Appenders>
<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
<Loggers>
<Logger name="client_log" level="debug">
<!--<AppenderRef ref="Logstash_client"/>-->
<AppenderRef ref="Console"/>
</Logger>
<Logger name="edit_log" level="debug">
<!--<AppenderRef ref="Logstash_edit"/>-->
<AppenderRef ref="Console"/>
</Logger>
<AsyncRoot level="debug">
<!-- 这儿为trace表示什么都可以打印出来了,其他几个级别分别为:TRACE、DEBUG、INFO、WARN、ERROR和FATAL -->
<AppenderRef ref="Console"/>
</AsyncRoot>
</Loggers>
</Configuration>
目前 我的配置
<?xml version="1.0" encoding="UTF-8"?>
<!--
6个优先级从高到低依次为:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL。
如果设置优先级为WARN,那么OFF、FATAL、ERROR、WARN 4个级别的log能正常输出
设置为OFF 表示不记录log4j2本身的日志,
-->
<!-- status:用来指定log4j本身的打印日志级别,monitorInterval:指定log4j自动重新配置的监测间隔时间 -->
<Configuration status="INFO" monitorInterval="30">
<!-- 自己设置属性,后面通过${}来访问 -->
<!--
<properties>
<property name="LOG_HOME">${web:rootDir}/logs</property>
</properties>
-->
<Appenders>
<Gelf name="logstash-gelf" host="udp:127.0.0.1" port="4560" version="1.1">
<Field name="timestamp" pattern="%d{yyyy-MM-dd HH:mm:ss.SSS}"/>
<Field name="logger" pattern="%logger"/>
<Field name="level" pattern="%level"/>
<Field name="className" pattern="%C"/>
<Field name="method" pattern="%M"/>
<Field name="line" pattern="%L"/>
<Field name="server" pattern="%host"/>
</Gelf>
<!--Appender 1. 输出到Console控制台,指定输出格式和过滤器等级为INFO -->
<Console name="Console" target="SYSTEM_OUT">
<!--ThresholdFilter指定日志消息的输出最低层次-->
<ThresholdFilter level="ALL" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%d{HH:mm:ss.SSS} %highlight{%-5level}{FATAL=red, ERROR=red, WARN=yellow, INFO=black, DEBUG=green, TRACE=blue} %class{36} %L %M - %msg%xEx%n"/>
<!--<PatternLayout pattern="%highlight{%d{HH:mm:ss.SSS} %-5level %logger{36}.%M() @%L - %msg%n}{FATAL=red, ERROR=red, WARN=yellow, INFO=black, DEBUG=green, TRACE=blue}"/>-->
</Console>
<!--Appender 2. 输出到滚动保存的文件, 触发保存日志文件的条件是日志文件大于3KB,只保存最新的10个日志-->
<File name="allLog" fileName="${LOG_HOME}/all.log">
<ThresholdFilter level="ALL" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout charset="UTF-8"
pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
</File>
<!--Appender 3. 输出到滚动保存的文件, 触发保存日志文件的条件是日志文件大于3KB,只保存最新的10个日志-->
<RollingFile name="debugLog" fileName="${LOG_HOME}/debug.log" filePattern="${log.path}/debug-%i.log">
<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout charset="UTF-8" pattern="[%-5level][%d{yyyy-MM-dd HH:mm:ss}][%F:%L] - %m%n"/>
<SizeBasedTriggeringPolicy size="3KB"/>
<!-- DefaultRolloverStrategy 中的参数max,可以限制 SizeBasedTriggeringPolicy中size超出后,只保留max个存档-->
<DefaultRolloverStrategy max="10"/>
</RollingFile>
<!--Appender 4. 输出到滚动保存的文件, 触发保存日志文件的条件是每分钟第一次的日志事件。ERROR日志是按分钟产生日志 -->
<RollingFile name="errorLog" fileName="${LOG_HOME}/error.log"
filePattern="${log.path}/error-%d{yyyy-MM-dd_HH-mm}.log">
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout charset="UTF-8" pattern="[%-5level][%d{yyyy-MM-dd HH:mm:ss}][%C:%F:%L] - %m%n"/>
<TimeBasedTriggeringPolicy/>
</RollingFile>
<RollingFile name="RollingFile" fileName="${LOG_HOME}/rar.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout charset="UTF-8"
pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
<!--日志文件最大值 第二天压缩-->
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="10 MB"/>
</Policies>
</RollingFile>
</Appenders>
<!--root 默认加载-->
<Loggers>
<Root level="INFO">
<AppenderRef ref="Console"/>
<AppenderRef ref="logstash-gelf"/>
<!--<appender-ref ref="allLog"/>-->
<!--<appender-ref ref="debugLog"/>-->
<!--<appender-ref ref="errorLog"/>-->
<!--<appender-ref ref="RollingFile"/>-->
</Root>
</Loggers>
</Configuration>
logstash:
input{
gelf {
port => 1561
tags => \["cms_log"\]
codec => "json"
}
gelf {
port => 1560
tags => \["client_log"\]
codec => "json"
}
stdin{}
}
filter {
date {
match => \[ "timeMillis", "UNIX_MS" \]
}
json {
source => "message"
remove\_field => \["short\_message","facility","host","message"\]
}
if "cms_log" in \[tags\] {
geoip {
source => "ip"
}
}
}
目前 我的配置 03-gelf-input.conf
input {
gelf {
host => "127.0.0.1"
port => 4560
codec => json {
charset => "UTF-8"
}
}
}
filter {
json {
source => "message"
}
}
output {
elasticsearch {
hosts => ["localhost"]
manage_template => false
index => "logstash-%{+YYYY.MM.dd}"
document_type => "logstash"
}
}
java程序调用方法一样,ok这样重启一下logstash,应用程序就不互相影响了。不过貌似要想更好的使用还得需要加异步消息缓冲储存,以后再研究吧~
Original url: Access
Created at: 2019-04-23 16:58:08
Category: default
Tags: none
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
最新评论