gelf -> log4j2 和logstash整合,logstash重启之后,程序需要重启问题解决 - 思考的稻草人 - CSDN博客

最近在做后台项目改造,将原来的项目变成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

请先后发表评论
  • 最新评论
  • 总共0条评论