hyj1991 / easy-monitor

企业级 Node.js 应用性能监控与线上故障定位解决方案
http://www.devtoolx.com
BSD 2-Clause "Simplified" License
3.09k stars 240 forks source link

非egg应用获取不到error logs #138

Closed kekobin closed 4 years ago

kekobin commented 4 years ago

背景:这边部署了3.0版本,eggjs项目应用监控都能正常监控到错误日志。但别的团队非egg项目接入后一直项目有生成错误日志文件,也是按照规范做配置,但是没有在监控平台展示出来。后来写了个demo,确实是没有。大概示例如下:

1.业务代码启动xprofiler:

require('xprofiler').start({
  log_dir: path.resolve(__dirname, '../logs/xprofiler'),
  log_interval: undefined,
  check_throw: true
});

2.配置xtransit

// config.js
const path = require('path');
module.exports = {
  server: `ws://127.0.0.1:9090`, // 填写前一节中部署的 xtransit-server 地址
  appId: 1, // 创建应用得到的应用 ID
  appSecret: 'xxx', // 创建应用得到的应用 Secret
  disks: [],
  errors: [
    path.resolve(__dirname, './logs/app-err-0.log')
  ],
  packages: [path.resolve(__dirname, './package.json')],
  logDir: path.resolve(__dirname, './logs/xprofiler'),
  docker: false,
  ipMode: false,
  libMode: true,
  errexp: /\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/i,
  checkThrow: true,
  logger: undefined
};

3.xtransit 启动文件

const xtransit = require('xtransit');
const config = require('./config');
xtransit.start(config);

4.pm2 启动脚本

{
  "apps" : [{
    "name"        : "test",
    "script"      : "./server/index.js",
    "args"        : ["-d", "1"],
    "log_date_format" : "YYYY-MM-DD HH:mm Z",
    "watch": false,
    "cwd"         : "",
    "error_file" : "F:/nuxt-test/logs/app-err-0.log",
    "out_file"   : "F:/nuxt-test/logs/app-0.log",
    "instances": 1
  },{
      "name": "xtransit 进程",
      "script": "./xtransit.js",
      "exec_mode": "fork"
    }]
}

启动后其他都是正常,估计 throw new Error了,log文件里也有错误了,就是在监控平台上没有。
image

打印了xprofiler-manager/controller/xtransit.js中的 handleLog 的error_log,一直都是空:
image

image

进一步调试代码,发现ErrorService一直都接受不到message:
image image

所以很奇怪,不知道是哪里出问题了,上面的配置会根据egg项目下底层egg-xtransit里面对应的配置打印出来的。所以理论上来说,两种类型项目配置基本是一样的。难道是 手动 throw new Error不符合某种日志规范么?

hyj1991 commented 4 years ago

xtransit 的配置属性的文档:https://www.yuque.com/hyj1991/easy-monitor/application#X9uMr

errexp: /\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/i, // 匹配错误日志起始的正则,默认为匹配到 YYYY-MM-DD HH:mm:ss 时间戳即认为是一条错误日志的起始

默认匹配 YYYY-MM-DD HH:mm:ss,你的错误日志只有 YYYY-MM-DD HH:mm,自己改成你想要的错误日志起始正则就行了

kekobin commented 4 years ago

xtransit 的配置属性的文档:https://www.yuque.com/hyj1991/easy-monitor/application#X9uMr

errexp: /\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/i, // 匹配错误日志起始的正则,默认为匹配到 YYYY-MM-DD HH:mm:ss 时间戳即认为是一条错误日志的起始

默认匹配 YYYY-MM-DD HH:mm:ss,你的错误日志只有 YYYY-MM-DD HH:mm,自己改成你想要的错误日志起始正则就行了

还真是这个问题,没太注意到这个细节。感谢!

beforegolive commented 2 years ago

@hyj1991 日志路径可以使用通配符方式匹配吗?我所在项目的日志文件名带随机数字,比如error-0.log,error-1.log,error-2.log这样。 我想用一条通配符规则来匹配这些日志,试过下面四种写法,但没有成功。 errors: ['/app/logs/error'] errors: ['/app/logs/error*'] errors: ['/app/logs/error*.log'] errors: ['/app/logs/error.log']

目前,只有明确写死日志文件名才有效,像这样: errors: ['/app/logs/error-2.log']

请问,这种通配符匹配的方式easy-monitor支持吗?

hyj1991 commented 2 years ago

@beforegolive 目前不支持通配符