logstash监听logback输出日志并存储到es

Posted 好大的月亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了logstash监听logback输出日志并存储到es相关的知识,希望对你有一定的参考价值。

先部署es

下载->解压->修改配置->运行

下载安装部署在我的另一篇文章里介绍了
https://blog.csdn.net/weixin_43944305/article/details/118469227

然后部署logstash
下载
https://www.elastic.co/cn/downloads/past-releases#logstash

解压

tar -zxvf logstash-6.3.0.tar.gz -C ~/app/
mv logstash-6.3.0 logstash

改下jvm配置,自己的小服务器吃不消

/home/ubuntu/app/logstash/config/jvm.options

修改logstash.yml对自定义配置文件热加载

# 设置节点的名字
node.name: logstash-01
# 设置 pipeline 的id
pipeline.id: main
pipeline.ordered: auto
# 设置pipeline 的线程数(filter+output),默认是cpu的核数
# pipeline.workers: 2
# 设置main pipeline文件所在的位置
# path.config:
# 自动重新加载pipeline配置文件
config.reload.automatic: true
# 设置http api 绑定的ip和端口
http.host: 127.0.0.1
http.port: 9201
# 设置logstash队列的类型 为持久化,默认是 memory
queue.type: persisted

/home/ubuntu/app/logstash/config目录下自定义一个配置文件,监听日志端口

input 
  tcp 
    # Logstash 作为服务
    mode => "server"
    #    host => "localhost"
    # 开放9001端口进行采集日志
    port => 9101
    # 编解码器
    codec => json_lines
  


output 
  elasticsearch 
    # 配置ES的地址
    hosts => ["http://localhost:9200"]
    # 在ES里产生的index的名称
    index => "app-search-log-collection-%+YYYY.MM.dd"
    #user => "elastic"
    #password => "changeme"
  
  stdout 
    codec => rubydebug
  

指定配置文件启动

./bin/logstash -f ~/app/logstash/config/logstash-test.yml
#nohup后台启动
nohup /home/ubuntu/app/logstash/bin/logstash -f /home/ubuntu/app/logstash/config/logstash-test.conf &

再装个kibana来查看存储到es的数据

下载
https://www.elastic.co/cn/downloads/past-releases#kibana

解压

tar -zxvf kibana-6.3.0-linux-x86_64.tar.gz -C ~/app/
mv kibana-6.3.0-linux-x86_64 kibana-6.3.0

修改下配置

server.port: 5601
server.host: "0.0.0.0"
elasticsearch.url: "http://localhost:9200"
i18n.defaultLocale: "zh-CN"

启动

/home/ubuntu/app/kibana-6.3.0/bin/kibana
#后台启动
nohup ./kibana &

项目集成logback

项目里用了lombok

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>6.3</version>
</dependency>

项目的logback配置

<?xml version="1.0" encoding="utf-8" ?>  <configuration>

    <property name="logstash.host" value="110.40.181.73"/>
    <property name="logstash.port" value="9101"/>
    <contextName>springcloud</contextName>


    <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
        <layout clas="ch.qos.logback.classic.PatternLayout">
            <pattern>
                %date %level [%thread] %logger36 [%file : %line] %msg%n
            </pattern>
        </layout>
    </appender>

    <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>$logging.path.%dyyyy-MM-dd.zip</fileNamePattern>
        </rollingPolicy>
        <!--&lt;!&ndash;过滤输出到日志文件的日志内容&ndash;&gt;
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>
                &lt;!&ndash;只配置这个还是会输出ERROR等级的日志,因为error level > info level;拦截的是>=info等级的内容&ndash;&gt;
                INFO
            </level>
        </filter>-->

        <!--要用下面这种方式才能过滤输出到日志文件的ERROR信息,类似switch case,onMatch和onMisMatch中的指令在LevelFilter类的FilterReply中可以看到-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <!--匹配到上面level的ERROR等级日志时,禁止输出到日志文件中-->
            <onMatch>DENY</onMatch>
            <!--匹配到上面的ERROR日志时,输出到日志文件中,(还有一个指令NEUTRAL,代表当前这条策略不做操作,让下一条策略去匹配)-->
            <onMismatch>ACCEPT</onMismatch>
        </filter>
        <encoder>
            <pattern>
                %date %level [%thread] %logger36 [%file : %line] %msg%n
            </pattern>
        </encoder>
        <!--滚动策略,按照时间滚动-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--路径要先去建好,不然会报错,linux/Mac下要给予可写权限,sudo chmod -R 777 /var/log/tomcat
            windows 类似,D:\\log\\tomcat-->
            <fileNamePattern>
                <!--在文件名中带上时间,配置完后要在下面root level中指定这个配置-->
                D:\\tomcat\\info.%d.log
            </fileNamePattern>
        </rollingPolicy>
    </appender>

    <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>$logging.path.%dyyyy-MM-dd.zip</fileNamePattern>
        </rollingPolicy>
        <!--过滤输出到日志文件的日志内容-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>
                ERROR
            </level>
        </filter>
        <encoder>
            <pattern>
                %date %level [%thread] %logger36 [%file : %line] %msg%n
            </pattern>
        </encoder>
        <!--滚动策略,按照时间滚动,每天创建一个文件-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--路径要先去建好,不然会报错,linux/Mac下要给予可写权限,sudo chmod -R 777 /var/log/tomcat
            windows 类似,D:\\log\\tomcat-->
            <fileNamePattern>
                <!--在文件名中带上时间,配置完后要在下面root level中指定这个配置-->
                D:\\tomcat\\error.%d.log
            </fileNamePattern>
        </rollingPolicy>
    </appender>



    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <!-- <destination>$logstash.host:$logstash.port</destination>-->
        <remoteHost>$logstash.host</remoteHost>
        <port>$logstash.port</port>
<!--        这个值只能配置2的N次幂(2,4,8,16...),默认8192,单位是B-->
        <queueSize>1048576</queueSize>

        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <!--匹配到上面level的ERROR等级日志时,禁止输出到日志文件中-->
            <onMatch>ACCEPT</onMatch>
            <!--匹配到上面的ERROR日志时,输出到日志文件中,(还有一个指令NEUTRAL,代表当前这条策略不做操作,让下一条策略去匹配)-->
            <onMismatch>DENY</onMismatch>
        </filter>

        <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
            <providers>
                <timestamp>
                    <timeZone>UTC</timeZone>
                </timestamp>
                <pattern>
                    <pattern>
                        
                        "severity":"%level",
                        "service": "%contextName",
                        "pid": "$PID:-",
                        "thread": "%thread",
                        "class": "%logger40",
                        "rest": "%message->%exfull"
                        
                    </pattern>
                </pattern>
            </providers>
        </encoder>
    </appender>

    <!--root代表整个项目的日志等级-->
    <root level="info">
        <!--上面配置的appender中的name-->
        <appender-ref ref="consoleLog"/>
        <appender-ref ref="fileInfoLog"/>
        <appender-ref ref="fileErrorLog"/>
        <appender-ref ref="LOGSTASH"/>
    </root>
</configuration>

进kibana(kibana的ip+5601默认端口访问)看一下,有了,搞定

以上是关于logstash监听logback输出日志并存储到es的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 使用 Log4j2 & Logback 输出日志到 EKL

使用logstash结合logback收集微服务日志

docker安装ELK 收集springboot日志(方法1)

logback整合rabbit

filebeat 多个日志输出到logstash后怎么区分

logback 集成 logstash