大约五年来,我一直面临着收集日志的任务,通常是来自小型到中型的代码库。从代码发送日志并不是问题:Java和Go几乎开箱即用就有这方面的库。但部署一些东西来收集它们却是一个头痛的问题。我明白这是一个可解决的任务(甚至在ChatGPT之前,现在更是如此)。不过,所有的日志系统主要都是针对大型企业世界及其需求而设计的,而不是针对那些只有几根棍子、胶水和"昨天"截止日期的小团队或单个开发人员。
每次启动ELK对我来说都是一个挑战:一堆设置,一个不简单的部署,当我进入UI时,我的眼睛被标签页弄得眼花缭乱。使用Loki和Graylog会稍微容易一些,但仍然有比我需要的多得多的功能。同时,在项目之间分离日志并向系统添加其他用户,使他们看不到不应该看到的内容,也不是最明显的过程。
所以大约一年前,我决定制作自己的日志收集系统。一个尽可能易于使用和启动的系统。它可以通过单个命令部署在服务器上,无需任何配置或界面中不必要的标签页。这就是Log Bull的由来,现在它是开源的:一个为拥有中型项目的开发人员设计的日志收集系统。
目录:
Log Bull是一个强调易用性的日志收集系统(最少的配置,最少的功能,启动时零配置)。该项目完全在Apache 2.0许可下开源。我的主要优先事项是创建一个解决方案,使初级开发人员能够轻松弄清楚如何启动系统,如何向其发送日志,以及如何在大约15分钟内查看它们。
项目的主要特点:
https://www.youtube.com/watch?v=8H8jF8nVzJE&embedable=true
该项目用Go开发,基于OpenSearch构建。
项目网站 - https://logbull.com
项目GitHub - https://github.com/logbull/logbull
P.S. 如果您觉得这个项目有用并且有GitHub账户,请给它一个星标⭐️。最初的星星很难收集。我将非常感谢您的支持!
部署项目有三种方式:通过.sh脚本(我推荐的方式)、通过Docker和通过Docker Compose。
方法1:通过脚本安装
该脚本将安装Docker,将项目放在/opt/logbull文件夹中,并配置系统重启时自动启动。安装命令:
sudo apt-get install -y curl && \ sudo curl -sSL https://raw.githubusercontent.com/logbull/logbull/main/install-logbull.sh \ | sudo bash
方法2:通过Docker Compose启动
创建docker-compose.yml文件,内容如下:
services: logbull: container_name: logbull image: logbull/logbull:latest ports: - "4005:4005" volumes: - ./logbull-data:/logbull-data restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:4005/api/v1/system/health"] interval: 5s timeout: 5s retries: 30
然后运行命令docker compose up -d
。系统将在4005端口启动。
方法3:通过Docker命令启动
在终端中运行以下命令(系统也将在4005端口启动):
docker run -d \ --name logbull \ -p 4005:4005 \ -v ./logbull-data:/logbull-data \ --restart unless-stopped \ --health-cmd="curl -f http://localhost:4005/api/v1/system/health || exit 1" \ --health-interval=5s \ --health-retries=30 \ logbull/logbull:latest
我设计这个项目时考虑到了便利性,主要是为了开发人员。这就是为什么我为大多数流行的开发语言创建了库。我这样做是基于这样的想法:Log Bull可以作为处理器连接到任何流行的库,而无需更改当前的代码库。
我强烈建议查看网站上的示例,因为那里有一个用于选择语言的交互式面板:
让我们以Python为例。首先,您需要安装库(尽管您也可以通过HTTP发送;有cURL的示例):
pip install logbull
然后从代码发送:
import time from logbull import LogBullLogger # Initialize logger logger = LogBullLogger( host="http://LOGBULL_HOST", project_id="LOGBULL_PROJECT_ID", ) # Log messages (printed to console AND sent to LogBull) logger.info("User logged in successfully", fields={ "user_id": "12345", "username": "john_doe", "ip": "192.168.1.100" }) # With context session_logger = logger.with_context({ "session_id": "sess_abc123", "user_id": "user_456" }) session_logger.info("Processing request", fields={ "action": "purchase" }) # Ensure all logs are sent before exiting logger.flush() time.sleep(5)
所有日志都会立即显示在主屏幕上。您可以:
减小消息的大小(通过将行截断到约50-100个字符)。
展开发送字段的列表(user_id, order_id等)。
点击一个字段并将其添加到过滤器中。带条件的日志搜索:
您还可以收集条件组(例如,消息包含某些文本,但排除特定的服务器IP地址)。
我希望我的日志收集系统对那些不想或不能(由于项目资源有限)实施"重量级"解决方案(如ELK)的开发人员有所帮助。我已经在生产项目中使用Log Bull,一切进展顺利。我欢迎在GitHub上提供反馈、改进建议和问题。