下面是我的 promtail-config.yml,我正在使用 docker 运行它,使用此配置我可以获得 Nginx 日志,但不能获取 PM2 日志。
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://loki:3100/loki/api/v1/push
scrape_configs:
- job_name: pm2 logs
static_configs:
- targets:
- 435.1248.43.43
labels:
job: pm2 logs
__path__: /var/log/pmx/*log
- job_name: gcp-nginx-logs
static_configs:
- targets:
- 435.1248.43.43
labels:
job: nginx-logs
__path__: /var/log/nginx/*log
我能够获取 Nginx 日志,但无法获取 PM2 日志,我希望也能获取 PM2 日志。
这是由于日志的性质及其生成方式所致。 Nginx 访问日志跟踪向 Nginx 服务器发出的 HTTP 请求,而另一方面,PM2 日志是由 Node.js 应用程序生成并由 PM2 维护的特定于应用程序的日志。例如,PM2 日志可能具有与您的应用程序的输出相匹配的自定义格式。
我不确定您的应用程序日志的格式,但是我可以在下面为您提供一个示例,让您使用正则表达式从这些日志行中捕获时间戳、日志级别和 ID
2023-07-10 12:34:56 [INFO] - Application started: ID=12345, Version=1.2.3
scrape_configs:
- job_name: pm2 logs
static_configs:
- targets:
- 435.1248.43.43
pipeline_stages:
- match:
selector: '{job="example_logs"}'
stages:
- regex:
expression: '^(?P<timestamp>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) \[(?P<level>\w+)\] - Application started: ID=(?P<id>\d+)'
在此示例中,表达式字段包含正则表达式模式。
(?P<name>pattern)
语法用于捕获模式中的命名组。
表达式解释:
'^'
:线锚点的开始。'(?P<timestamp>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})'
:以'YYYY-MM-DD HH:MM:SS'
格式捕获时间戳。'\[(?P<level>\w+)\]'
:捕获方括号内的日志级别。'Application started: ID=:'
匹配固定字符串。'(?P<id>\d+):'
捕获 ID(数字序列)。由于 PM2 日志具有自定义格式,因此您需要在 Promtail 中进行不同的解析配置来捕获相关数据。您可能需要调整Promtail中的正则表达式或日志解析规则才能正确处理PM2日志。
了解您正在处理的日志的独特特征并相应地定制日志处理设置非常重要。