“如何配置日志格式”取决于你使用的具体技术栈。下面我按最常见的几种场景给你说明,你可以直接跳到对应部分;如果不在其中,告诉我你用的是哪种语言/框架,我可以给你更精准的配置。
import logging
logging.basicConfig(
format='%(asctime)s [%(levelname)s] %(name)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
level=logging.INFO
)
logger = logging.getLogger(__name__)
logger.info("这是一条日志")
| 字段 | 含义 |
|---|---|
%(asctime)s |
时间 |
%(levelname)s |
日志级别 |
%(name)s |
logger 名称 |
%(message)s |
日志内容 |
%(filename)s |
文件名 |
%(lineno)d |
行号 |
import logging
import json
class JsonFormatter(logging.Formatter):
def format(self, record):
log = {
"time": self.formatTime(record),
"level": record.levelname,
"message": record.getMessage()
}
return json.dumps(log, ensure_ascii=False)
handler = logging.StreamHandler()
handler.setFormatter(JsonFormatter())
logger = logging.getLogger()
logger.addHandler(handler)
logger.setLevel(logging.INFO)
✅ 适合接入 ELK / Loki
logback.xml
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>
%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
</root>
</configuration>
<encoder class="net.logstash.logback.encoder.LogstashEncoder"/>
logging:
pattern:
console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger - %msg%n"
level:
root: INFO
const winston = require('winston');
const logger = winston.createLogger({
format: winston.format.combine(
winston.format.timestamp(),
winston.format.printf(info =>
`${info.timestamp} [${info.level}] ${info.message}`
)
),
transports: [new winston.transports.Console()]
});
✅ JSON:
format: winston.format.json()
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer"';
access_log /var/log/nginx/access.log main;
}
✅ 人类可读
2026-01-21 10:30:00 [INFO] com.xxx.Service - 用户登录成功
✅ 机器可读(推荐)
{
"time": "2026-01-21T10:30:00",
"level": "INFO",
"service": "user-service",
"message": "用户登录成功"
}
你可以直接告诉我:
我可以给你可直接复制使用的完整配置。