日志分析系统支持格式详解

常见日志格式一览

在搭建或配置日志分析系统时,了解它支持哪些日志格式是关键一步。不同的服务生成的日志结构不同,比如Web服务器、数据库、应用后台各自有习惯的输出方式。常见的格式包括纯文本(text)、JSON、Syslog、CSV以及自定义分隔格式。

以Nginx为例,默认访问日志是按固定字段顺序输出的一行文本,用空格分隔。这种格式虽然人类可读,但解析时容易因字段缺失导致错位。而像Node.js应用常输出JSON格式日志,每个条目都是一个对象,字段清晰,便于程序提取。

{"time": "2024-04-05T10:30:00Z", "level": "info", "msg": "user login success", "uid": 12345}

这样的结构可以直接被Logstash、Fluentd这类工具消费,无需复杂切分。

系统如何识别不同格式

主流日志分析平台如ELK(Elasticsearch + Logstash + Kibana)或Loki,都内置了对多种格式的解析能力。Logstash通过filter插件处理输入数据,grok模式能匹配正则表达式提取文本日志中的字段,date插件则统一时间戳格式。

比如一条Apache日志:

192.168.1.10 - - [05/Apr/2024:10:30:00 +0800] "GET /api/user HTTP/1.1" 200 1234

可以用grok写成:

<?grok pattern="%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] ""%{WORD:method} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}"" %{NUMBER:status} %{NUMBER:bytes}"?>

这样就能把各个部分提取为独立字段,在Kibana里做筛选和统计。

JSON自动识别更省心

如果日志本身就是JSON,很多采集器如Filebeat可以开启json.keys_under_root选项,自动将顶层字段提升到根层级,省去手动解析步骤。这种方式适合前后端分离项目,前端埋点日志也可以按统一结构上报。

自定义分隔符适用特定场景

有些老旧系统输出的是竖线|或冒号:分隔的日志,比如:

2024-04-05 10:30:00|INFO|order_service|created order id=67890

这种情况下可以在配置文件中指定分隔符,配合正则或split操作拆解字段。虽然不如JSON直观,但在资源受限环境中依然实用。

考虑编码与换行问题

实际使用中还会遇到日志包含多行的情况,比如Java异常堆栈。这时候需要配置多行合并规则,通常基于时间戳开头判断是否为新条目。同时注意文件编码,UTF-8是通用选择,避免中文乱码。

另外,Syslog协议传输的日志常由网络设备或Linux系统发出,结构相对固定,头部带优先级和时间,接收端需按RFC标准解析。Loki就原生支持接收Syslog流,结合Promtail做标签提取。

推荐实践方式

新项目尽量采用JSON格式输出日志,字段命名保持一致,比如用ts代替time或timestamp,避免后期清洗麻烦。已有系统可通过日志采集层做格式转换,把不规范的日志归一化后再送入分析引擎。合理利用标签(tag)或元数据(metadata),能让搜索效率大幅提升。