# logserver **Repository Path**: xlongwei/logserver ## Basic Information - **Project Name**: logserver - **Description**: 日志聚合:light-4j + logback,也支持log4j2,lajax,已接入项目:light-4j,light-info,accounts,apidemo - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: http://115.28.229.158:9880/ - **GVP Project**: No ## Statistics - **Stars**: 35 - **Forks**: 14 - **Created**: 2019-10-10 - **Last Updated**: 2025-08-09 ## Categories & Tags **Categories**: logging **Tags**: logback, WebSocket, ServerSendEvent ## README ## logserver ##### 项目简介 使用logback和light-4j构建的简单日志服务,参考项目[logbackserver](https://gitee.com/xlongwei/logbackserver)和[light4j](https://gitee.com/xlongwei/light4j)。 logserver的设计初衷是聚合日志,解决登录多个linux主机查找日志的痛点。日志量大时使用grep方式可能有性能瓶颈,因此可选使用[light-search](https://gitee.com/lightgrp/light-search)创建索引和搜索。 建议使用完整的特征值(例如id值)进行搜索,而非频繁出现的部分字符串(例如搜索INFO遇到超大日志就会卡死),这时直接登录linux使用less查找更合适一些(日志已经聚合也不太麻烦)。 ##### 本地测试 1. 项目构建:mvn package dependency:copy-dependencies -DoutputDirectory=target 2. 运行服务:start.bat,打开首页[index](http://localhost:9880/index.html)跟踪日志 3. client测试:client.bat,输入测试内容,浏览器会输出最新日志;sh client.sh 1.5,实测支持logback更多版本 4. [light-search](https://gitee.com/lightgrp/light-search)索引服务:-Dlight-search=http://localhost:9200 -DuseIndexer=true -DuseSearch=true 5. logger页签:可以动态变更应用日志级别,-Dlogger=name@url静态配置其他应用,[logserver-spring-boot-starter](https://gitee.com/xlongwei/logserver-spring-boot-starter)支持自动注册,变更时需要密码 6. [trace](https://gitee.com/xlongwei/logserver/wikis/trace)跟踪日志:提供请求头[X-Traceability-Id](http://115.28.229.158/tool/images/logserver/search.png)即可,后端通过[MyCorrelationHandler](https://gitee.com/xlongwei/light4j/blob/master/src/main/resources/config/handler.yml)写入MDC,并会在跨应用请求时传递此请求头 7. sift分开存储:-Dsift,根据contextName分开存储日志,不参与搜索和索引,因此-Dlogfile依然需要,如果在root去掉ASYNC_FILE,则需要修改sift内的notify=true,以便向浏览器输出日志。 8. my.pwd保存私密信息,-Dlogback.configurationFile=/home/logback.xml可以指定外部日志配置,编辑此文件即可变更日志级别。 9. logjannino.xml拆分为logfile.xml(收集日志写入文件logfile)、logserver.xml(收集日志转发到logserver),配合filebeat可以后台收集或转发日志,注释掉filebeat才会监听9880端口。 ##### 线上部署 1. 项目打包:sh start.sh deploy,打包为单独的fat-jar;sh start.sh package,打包并复制依赖;start运行,status状态,rebuild重建,stop停止 2. -Dfiletailers=app1.log;app2.log,直接合并其他项目日志;ln -s /path/app1.log logs/app1.log,支持page分页查看其他日志 3. 其他项目的日志配置参考client.xml,或者参考[light4j](https://gitee.com/xlongwei/light4j/blob/master/src/main/resources/logback.xml),通过/etc/hosts指定logserver 4. -Dlogfile=logs/all.logs 日志路径,logserver自身日志输出到Console,其他client应用日志输出到logfile 5. -Djava.compiler=none,禁用JIT可节约内存,默认启用JIT可提高性能 6. 定时压缩日志(logserver不再搜索),56 23 * * * sh /soft/shells/[tgz_logs.sh](https://gitee.com/xlongwei/logserver/blob/master/aliyun/tgz_logs.sh) >> /var/log/mycron_clears.log, 7. filebeat模式:vi start.sh,打开filebeat注释,用于跟踪多个日志文件,并发送日志内容到logserver,也支持redis媒介 8. 可选redis媒介:打开-Dredis注释,支持pubsub发布订阅和pushpop消息队列,详见[wiki](https://gitee.com/xlongwei/logserver/wikis/redis) 9. -Dfiles=false关闭files页签,-Dlogger=logserver@log配置logger页签,-Dmask=password(3,8)配置日志脱敏(password之后的第3至8个字符加星*) #### [logserver-spring-boot-starter](https://gitee.com/xlongwei/logserver-spring-boot-starter):使用[配置](https://gitee.com/xlongwei/logserver/wikis/regist)的方式更省事 ```xml com.xlongwei.logserver logserver-spring-boot-starter 0.0.3 org.springframework.boot spring-boot-starter-actuator -Dlogserver.token=xlongwei -Dlogserver.remoteHost=192.168.1.99 -Dmanagement.endpoints.web.exposure.include=logserver logserver: remoteHost: 192.168.1.99 #指定logserver token: xlongwei #安全校验,需要与logserver的lajax.token一致 management: #需要依赖spring-boot-starter-actuator endpoints: web: exposure: include: logserver #开启LogserverEndpoint,让logserver变更日志级别 ``` #### 前端日志 1. [lajax](https://github.com/eshengsky/lajax):`var logger = new Lajax(url); logger.info(arg1,...args);` 2. [logserver.js](src/main/resources/static/logserver.js):`Lajax.logLevel='info'; Lajax.logServer=false; Lajax.logConsole=true; Lajax.token='xlongwei';` 3. [uni-app](https://gitee.com/xlongwei/apidemo/blob/master/common/logserver.js):`var logger = require('../../common/logserver.js').logger; logger.info('onReady index.vue');` ``` var logger = new Lajax({ url:'/lajax',//日志服务器的 URL autoLogError:false,//是否自动记录未捕获错误true autoLogRejection:false,//是否自动记录Promise错误true autoLogAjax:false,//是否自动记录 ajax 请求true //logAjaxFilter:function(ajaxUrl, ajaxMethod) { // return false;//ajax 自动记录条件过滤函数true记录false不记录 //}, stylize:true,//是否要格式化 console 打印的内容true showDesc:false,//是否显示初始化描述信息true //customDesc:function(lastUnsend, reqId, idFromServer) { // return 'lajax 前端日志模块加载完成。'; //}, interval: 5000,//日志发送到服务端的间隔时间10000毫秒 maxErrorReq:3 //发送日志请求连续出错的最大次数 }); ``` #### [log4j2日志](https://gitee.com/xlongwei/logserver/wikis/log4j2) 通常会再包一层AsyncAppender,并且还会有FileAppender写入日志文件,这里使用UDP协议的JSON格式日志,既不用增加端口也不用增加log4j依赖。 ``` ``` ##### 整体设计 [架构设计](aliyun/logserver.png):底层使用logback+socket、lajax+http传输日志,后端推荐logback.xml方式,可选starter依赖,前端支持web和uni-app形式,logserver可选使用light-search+lucene创建索引,详细用法见[wiki](https://gitee.com/xlongwei/logserver/wikis)。 ![架构设计](aliyun/logserver.png) [日志搜索](aliyun/search.png) ##### Nginx配置 登录认证见[pass.db](http://115.28.229.158/doku.php?id=tools:logstation)生成命令,nginx配置参考[log.conf](https://gitee.com/xlongwei/logserver/blob/master/aliyun/log.conf)。