Logstash输出到Doris

日志架构

可以看到日志最终都进入了ES里面,对于搜索非常方便, 但是对于统计还不能满足我们的需求

日志收集

Doris

这里就不多介绍了,性能非常强,和mysql语法基本一样,可以快速上手

方案对比

logback配置

javascript 复制代码
<appender name="FEIGN_LOG" class="com.xy.FeignLogAppender"/>

<appender name="ASYNC_FEIGN_LOG" class="ch.qos.logback.classic.AsyncAppender">
    <discardingThreshold>0</discardingThreshold>
    <queueSize>500</queueSize>
    <appender-ref ref="FEIGN_LOG"/>
</appender>

<logger name="com.xy.controller" level="INFO">
    <appender-ref ref="ASYNC_FEIGN_LOG"/>
</logger>  

方案一:需要自定义Appender,过滤指定关键字的日志,把日志解析后写入kafka

优点:不需要运维支持

缺点:各个应用都需要强依赖kafka

logback无配置

logstash配置需要运维支持

ini 复制代码
input {
    tcp {
        mode => "server"
        port => 4567
        codec => json_lines
    }
}  

filter {
    json {
        source => "message"
    }
    mutate {
        remove_field => [ "@version", "@timestamp", "message" ]
    }
}   

output {
	stdout { 
    	codec => rubydebug 
	}   
	jdbc {
        driver_jar_path => "/Users/xiongyan/Documents/fuchuang/logstash-8.12.2/mysql-connector-java-8.0.25.jar"
        driver_class => "com.mysql.cj.jdbc.Driver"
        connection_string => "jdbc:mysql://127.0.0.1:9030/xy?rewriteBatchedStatements=true"
        username => "xy"
        password => "123456"
        
        # 连接池配置
        max_pool_size => 100
        # 批量插入
        flush_size => 1000
                
        statement => ["INSERT INTO service_remote_log (op_time, request_id, env, from_name, to_name, method, path, protocol, content_type, status_code, cost) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", "%{optTime}", "%{requestId}", "%{env}", "%{from}", "%{to}", "%{method}", "%{path}", "%{protol}", "%{contentType}", "%{statusCode}", "%{cost}"]
    } 
}

方案二:利用logstash自生的优势,通过logstash-output-jdbc插件 把日志写入doris

优点:各个应用无需强依赖kafka

缺点:需要运维支持

logback无配置

logstash配置需要运维支持

ini 复制代码
input {
    tcp {
        mode => "server"
        port => 4567
        codec => json_lines
    }
}

filter {
    json {
        source => "message"
    }
    mutate {
        remove_field => [ "@version", "@timestamp", "message"]
    }
}

output {
    stdout { 
        codec => rubydebug 
    }
    kafka {
        codec => json
        bootstrap_servers => "127.0.0.1:9001,127.0.0.1:9002,127.0.0.1:9003"
        topic_id => "%{topic}"
        security_protocol => "SASL_PLAINTEXT"
        sasl_mechanism => "PLAIN"
    }
} 

方案二:利用logstash自生的优势,通过logstash-output-kafka插件 把日志写入kafka,在doris配置任务直接消费kafka到表

优点:各个应用无需强依赖kafka

缺点:需要运维支持

Doris配置:

swift 复制代码
CREATE ROUTINE LOAD job_service_remote_log ON service_remote_log
COLUMNS(op_time, timestamp, trace_id, span_id, env, from_name, to_name, method, path, protocol, content_type, status_code, cost)
PROPERTIES
(
    "desired_concurrent_number" = "1",
    "max_error_number" = "1",
    "format" = "json",
    "strict_mode" = "false",
    "timezone" = "Asia/Shanghai",
    "max_batch_interval" = "10",
    "max_batch_rows" = "200000",
    "max_batch_size" = "209715200",
    "jsonpaths" = "[\"$.opTime\",\"$.timestamp\",\"$.traceId\",\"$.spanId\",\"$.env\",\"$.from\",\"$.to\",\"$.method\",\"$.path\",\"$.protocol\",\"$.contentType\",\"$.statusCode\",\"$.cost\"]"
)
FROM KAFKA
(
    "kafka_broker_list" = "127.0.0.1:9001,127.0.0.1:9002,127.0.0.1:9003",
    "kafka_topic" = "topic",
    "property.group.id" = "group" 
);

日志查看

转json之前日志

转json之后日志

数据库日志

接口调用统计

总结

只需要在脚手架里面添加log.info(message),就可以轻松实现业务的统计

对于不同的业务统计,在脚手架里面组装不同的数据结构就可以了

相关推荐
阿文和她的Key28 分钟前
国产AI芯片涨价20%-50%:企业算力采购的四层成本架构重估
人工智能·架构
安易算力1 小时前
智算中心网络架构选型:RDMA、InfiniBand与以太网技术深度对比及部署实践
网络·架构
用户777397909931 小时前
REA 逆向工程炸出 15W+ 热度,我却在想另一件事:当 AI 写的代码比你能读的还多,怎么办?
架构
Thneonl2 小时前
Spark 比 MR 快在哪?管住最贵的 shuffle
后端·架构
海带紫菜菠萝汤2 小时前
本周 AI 观察:算力、路由、账本——护城河正搬出模型层
人工智能·ai·程序员·架构·大模型
隐擎fox3 小时前
解密 BGP Anycast 边缘路由与跨国链路质量检测:多租户网络出口的低时延与防丢包架构实战
网络·python·网络协议·tcp/ip·网络安全·架构·tcpdump
Shulex4 小时前
Shopify 独立站弃购挽回与客服实时转化:Shulex 实战架构指南
大数据·人工智能·架构·智能客服·跨境电商
March.s5 小时前
Redis 核心知识与高可用架构实践
数据库·redis·架构
mldong5 小时前
八种语言的工作流引擎,我用 6 张 UML 图画完了
后端·架构
数据库小学妹13 小时前
国产数据库怎么选?兼容、迁移、核心案例与融合架构四道关
数据库·架构·国产数据库·数据库迁移·融合数据库