Linux環境下,JavaScript(Node.js)應用的日志格式通常圍繞結構化或文本化設計,以滿足不同場景(如調試、監控、分析)的需求。以下是常見的日志格式類型及特點:
JSON是Node.js日志的主流結構化格式,采用鍵值對組織日志信息,便于機器解析和后續數據處理(如ELK、Fluentd等工具采集)。
示例:
{
"timestamp": "2023-04-10T12:34:56Z",
"level": "INFO",
"message": "User logged in successfully",
"userId": "12345",
"ipAddress": "192.168.1.1"
}
特點:結構清晰、擴展性強,支持嵌套字段(如添加metadata
),適合分布式系統的日志聚合。
CSV(逗號分隔值)是簡單的文本格式,每行代表一條日志記錄,字段間用逗號分隔,適合導入Excel或數據庫進行統計分析。
示例:
timestamp,level,message,userId,ipAddress
2023-04-10T12:34:56Z,INFO,User logged in successfully,12345,192.168.1.1
2023-04-10T12:35:10Z,ERROR,Failed to connect to database,67890,10.0.0.1
特點:兼容性強,但缺乏結構化層級,復雜日志(如包含嵌套對象)需額外處理。
通過拼接字符串實現,格式靈活,可根據需求調整字段順序和內容,適合簡單應用的日志輸出。
示例:
[2023-04-10T12:34:56Z] [INFO] User logged in successfully - userId: 12345, ipAddress: 192.168.1.1
特點:易讀性好,但解析需依賴正則表達式或字符串分割,不適合大規模日志分析。
以key=value
形式組織日志,兼顧可讀性與結構化,常見于系統日志或傳統應用。
示例:
event=user_login timestamp=2023-04-10T12:34:56Z level=INFO userId=12345 ipAddress=192.168.1.1
特點:易于通過工具(如grep
、awk
)過濾和提取字段,適合運維人員快速定位問題。
通過日志庫(如winston、log4js)提供的格式化工具,自定義日志輸出的字段和結構,支持動態添加上下文(如請求ID、進程ID)。
示例(winston):
const winston = require('winston');
const logger = winston.createLogger({
format: winston.format.combine(
winston.format.timestamp(),
winston.format.printf(({ timestamp, level, message, userId, ipAddress }) => {
return `[${timestamp}] [${level}] ${message} - userId: ${userId}, ipAddress: ${ipAddress}`;
})
),
transports: [new winston.transports.Console()]
});
logger.info('User logged in successfully', { userId: '12345', ipAddress: '192.168.1.1' });
輸出:
[2023-04-10T12:34:56Z] [INFO] User logged in successfully - userId: 12345, ipAddress: 192.168.1.1
特點:高度靈活,支持添加動態字段(如請求ID),適合復雜應用(如Web服務)。
在結構化文本基礎上,支持嵌套對象或數組,更貼合現代應用的需求(如記錄請求參數、堆棧跟蹤)。
示例:
{
"event": "user_login",
"timestamp": "2023-04-10T12:34:56Z",
"level": "INFO",
"user": {
"id": "12345",
"name": "John Doe"
},
"request": {
"ip": "192.168.1.1",
"method": "POST",
"url": "/login"
}
}
特點:信息更完整,便于后續分析(如統計用戶登錄來源、請求路徑),適合微服務或分布式系統。
以上格式的選擇需根據應用場景(如是否需要機器解析、是否需要人類可讀)、團隊約定及工具鏈(如日志收集系統)綜合決定。結構化格式(如JSON)是當前趨勢,尤其適合大規模分布式系統;自定義文本格式則適合簡單應用或快速調試。