当前位置: 首页 > news >正文

从零构建生产级日志分析体系:Flask + Docker + Nginx 完整实战

又到周末了,使用 claude 做点东西的心思又来了!那就找找工作中的痛点问题。
我们有个Java+Tomcat的 老项目,平时查日志只能去服务器上用命令来看,一点也不方便(后面新做的项目,很多框架里都自带了日志功能。还有的项目是用的 ElasticSearch)。
那就趁着周末,动手做一个吧!

我有一个Tomcat日志文件,平时用命令行查起来很不方便,想着可以做一个可视化的系统

如果不用ElasticSearch,自己用AI写一个可视化的,你觉得靠谱吗

我服务器是CentOS,上面有docker,最新日志是
/home/tomcatlog/jkwh_app_out.log,今天之前的日志会自动按日期生成目录,归纳到/home/tomcatlog/backuplog
下,如/logs_20251017/jkwh_app_out.log.1

和CHATGPT几轮沟通后,一个基本的方案就出来了!

一、你当前日志结构说明

当前正在写入的实时日志  └── backuplog/├── logs_20251017/jkwh_app_out.log.1├── logs_20251016/jkwh_app_out.log.1├── logs_20251015/jkwh_app_out.log.1└── ... (按日期归档) ```
✅ 非常标准,实时日志 + 历史归档。
---
##  二、目标系统设计
我们做一个 Docker 应用,支持两个功能:
| 模块     | 功能描述                                                   | |
:----- | :----------------------------------------------------- | |
实时日志监控 | 通过 WebSocket 实时读取 `/home/tomcatlog/jkwh_app_out.log`   | |
历史日志浏览 | 自动列出 `/home/tomcatlog/backuplog` 下的日期目录,点击即可加载对应日志文件内容 |
---
## ⚙️ 三、目录映射设计
容器内目录映射:
| 主机路径                               | 容器内路径                   | 作用
| | :--------------------------------- | :---------------------- |
:----- | | `/home/tomcatlog/jkwh_app_out.log` |
`/app/logs/current.log` | 实时日志   | | `/home/tomcatlog/backuplog`
| `/app/backuplog`        | 历史日志目录 |
---
##  四、项目结构(完整方案)
```log-visualizer/  ├─ app.py                # Flask + SocketIO 后端
├─ templates/  │   └─ index.html        # 前端页面  ├─ requirements.txt
└─ Dockerfile ```
---
###  requirements.txt
```flask flask-socketio watchdog ```
---
### ⚙️ app.py
```python from flask import Flask, render_template, jsonify,
send_file, request from flask_socketio import SocketIO import os,
time, threading
app = Flask(__name__) socketio = SocketIO(app,
cors_allowed_origins="*")
CURRENT_LOG = "/app/logs/current.log" BACKUP_DIR = "/app/backuplog"
def tail_current_log():"""持续读取实时日志"""if not os.path.exists(CURRENT_LOG):print(f"Log file not found: {CURRENT_LOG}")returnwith open(CURRENT_LOG, "r", encoding="utf-8", errors="ignore") as f:f.seek(0, os.SEEK_END)while True:line = f.readline()if line:socketio.emit("log_line", {"data": line})else:time.sleep(0.2)
@app.route("/") def index():return render_template("index.html")
@app.route("/api/backups") def list_backups():"""列出所有日期目录"""dirs = sorted(os.listdir(BACKUP_DIR), reverse=True)return jsonify([d for d in dirs if d.startswith("logs_")])
@app.route("/api/view_log") def view_log():"""查看指定日期的日志"""date_dir = request.args.get("date")log_path = os.path.join(BACKUP_DIR, date_dir, "jkwh_app_out.log.1")if not os.path.exists(log_path):return "Log not found", 404return send_file(log_path, mimetype="text/plain")
if __name__ == "__main__":threading.Thread(target=tail_current_log, daemon=True).start()socketio.run(app, host="0.0.0.0", port=8080) ```
---
###  templates/index.html
```html      
Tomcat 日志监控系统   
http://www.gsyq.cn/news/53188.html

相关文章:

  • Flowable轻量级流程引擎
  • 2025年上海全屋定制品牌服务权威推荐:上海全屋定制装修服务/上海全屋家具定制服务/上海全屋定制衣柜服务商精选
  • FOC(磁场定向控制)的Simulink仿真模型实现
  • 2025年铝爬架网厂家权威推荐:新型建筑爬架网/米字爬架网/外墙建筑爬架网源头厂家精选
  • Codeforces Round 1064题解
  • 国标GB28181算法算力平台EasyGBS如何实现停车场监控系统的高效统一管理?
  • 从0死磕全栈之Next.js 本地开发环境优化最佳实践 - 指南
  • CentOS Stream 10 : NVIDIA 显卡驱动安装-亲测
  • 2025年电泳涂装超滤膜定做厂家权威推荐榜单:电泳漆超滤膜/中空超滤膜/纤维超滤膜源头厂家精选
  • 2025济南留学中介十大排名
  • 2025成都留学机构十强名单最新
  • 荒原之梦考研数学:26考研最后冲刺阶段还要重点学习考研数学吗?
  • 荒原之梦考研数学 | 做选填题,就不要局限于所用的方法
  • 767
  • GO2 APP SRC
  • PC端的安卓文件管理器(基于ADB)
  • CF2172H - Shuffling Cards with Problem Solver 68!
  • 2025年福祉座椅定制厂家权威推荐榜单:轮椅升降平台/轮椅升降机/福祉车源头厂家精选
  • SQL学习:WITH RECURSIVE
  • 【哲学思考】我常用的方法论
  • 30、cp 、mv 命令
  • linux apache php配置
  • [随笔15] 日常杂事 - 枝-致
  • linux android环境搭建
  • linux android环境
  • 设置word中第一页不显示页码,第二页页码从1开始
  • 2025年度塑料回收行业领军企业TOP5,塑料回收排行综合实力与口碑权威评选
  • 2025成都留学机构十强名单排名
  • P5658 [CSP-S 2019] 括号树 题解
  • Python 机器学习03 - 常见分类算法