我这里下载的是apache-doris-2.1.10-bin-x64.tar.gz
tar -zxvf apache-doris-2.1.10-bin-x64.tar.gz
mv apache-doris-2.1.10-bin-x64 apache-doris
cd apache-doris
doris依赖java,所以记得先下载好java,并配置好JAVA_HOME
分别启动 fe 和 be,注意 启动be的时候会提升让你关闭swap分区,以及ulimit文件符限制,根据提升改一下
./fe/bin/start_fe.sh --daemon
./be/bin/start_be.sh --daemon
进入命令行,兼容mysql,初始默认没密码
mysql -P 9030 -u root
创建数据库+表,注意单机版本默认只有一个be,所以replication_num不能大于1
create database log_db;
use log_db;
CREATE TABLE service_logs ( `log_time` DATETIME NOT NULL COMMENT "日志时间", `service_name` VARCHAR(50) NOT NULL COMMENT "服务名称", `log_level` VARCHAR(10) COMMENT "日志级别(DEBUG/INFO/ERROR)", `ip` VARCHAR(15) COMMENT "客户端IP", `request_path` VARCHAR(100) COMMENT "请求路径", `status_code` SMALLINT COMMENT "HTTP状态码", `response_time_ms` INT COMMENT "响应时间(ms)", `detail` TEXT COMMENT "详细日志内容" ) DUPLICATE KEY(log_time, service_name) DISTRIBUTED BY HASH(service_name) BUCKETS 10 PROPERTIES ( "replication_num" = "1", "storage_format" = "V2" );
登录后台 ip:8030,账号root,密码为空
![]()
构建模拟数据
-- 模拟INFO级别日志(正常请求)
INSERT INTO service_logs VALUES
('2025-06-20 09:15:23', 'order-service', 'INFO', '192.168.1.101', '/api/orders', 200, 45, '用户ID:10086 创建订单成功,订单号:ORD20250620001');
-- 模拟ERROR级别日志(服务异常)
INSERT INTO service_logs VALUES
('2025-06-20 09:16:42', 'payment-service', 'ERROR', '192.168.1.102', '/api/pay', 500, 1200, '支付网关连接超时,订单号:ORD20250620001,错误:java.net.ConnectException');
-- 模拟DEBUG级别日志(开发调试)
INSERT INTO service_logs VALUES
('2025-06-20 09:17:05', 'inventory-service', 'DEBUG', '192.168.1.103', '/api/stock', 200, 12, 'SQL查询: SELECT stock FROM items WHERE sku="SKU1001"');
-- 模拟404请求
INSERT INTO service_logs VALUES
('2025-06-20 09:18:30', 'user-service', 'WARN', '192.168.1.104', '/api/profile', 404, 8, '用户ID:10087 访问不存在的个人资料页');
-- 模拟高延迟请求
INSERT INTO service_logs VALUES
('2025-06-20 09:20:11', 'search-service', 'INFO', '192.168.1.105', '/api/search', 200, 2100, '复杂商品搜索条件: category=electronics&price_min=1000&keywords=4K电视');
![]()
剩下的sql操作就跟mysql非常类似了,由于兼容mysql协议,所以几乎所有的语言都支持操作,下面是python的简单示例
import pymysql
from datetime import datetime
# 连接配置
config = {
'host': '192.168.34.128',
'port': 9030, # FE的query_port
'user': 'root',
'password': '',
'database': 'log_db',
'charset': 'utf8mb4'
}
def get_connection():
"""创建带自动重连的连接池"""
return pymysql.connect(**config)
# 插入数据
def insert_log():
conn = get_connection()
try:
with conn.cursor() as cursor:
sql = """INSERT INTO service_logs VALUES
(%s, %s, %s, %s, %s, %s, %s, %s)"""
data = (
datetime.now(),
'payment-service',
'ERROR',
'10.0.0.1',
'/api/checkout',
500,
1200,
'Payment gateway timeout'
)
cursor.execute(sql, data)
conn.commit()
print("插入成功")
except Exception as e:
conn.rollback()
print(f"插入失败: {e}")
finally:
conn.close()
# 查询数据
def query_logs():
conn = get_connection()
try:
with conn.cursor(pymysql.cursors.DictCursor) as cursor:
cursor.execute("""
SELECT * FROM service_logs
WHERE log_level='ERROR'
ORDER BY log_time DESC
LIMIT 10
""")
for row in cursor.fetchall():
print(f"[{row['log_time']}] {row['service_name']}: {row['detail']}")
finally:
conn.close()
# 更新数据,DUPLICATE KEY表不支持UPDATE,UNIQUE KEY的表才能执行更新操作,或者用insert插入强制更新
def update_log_status():
conn = get_connection()
try:
with conn.cursor() as cursor:
cursor.execute("""
UPDATE service_logs
SET status_code=200
WHERE request_path='/api/checkout'
AND status_code=500
""")
conn.commit()
print(f"更新了 {cursor.rowcount} 条记录")
except Exception as e:
conn.rollback()
print(f"更新失败: {e}")
finally:
conn.close()
# 删除数据
def delete_old_logs():
conn = get_connection()
try:
with conn.cursor() as cursor:
cursor.execute("""
DELETE FROM service_logs
WHERE log_time < DATE_SUB(NOW(), INTERVAL 30 DAY)
""")
conn.commit()
print(f"删除了 {cursor.rowcount} 条旧日志")
except Exception as e:
conn.rollback()
print(f"删除失败: {e}")
finally:
conn.close()
if __name__ == "__main__":
insert_log() # 增
query_logs() # 查
#update_log_status() # 改
delete_old_logs() # 删