在软件开发和系统运维过程中,打印日志是调试问题、监控运行状态和追踪错误的关键手段,不同的编程语言和工具提供了丰富的日志打印命令,开发者可以根据需求选择合适的日志级别、输出格式和目标位置,以下将详细介绍常见场景下的日志打印命令及其使用方法。

常见编程语言的日志打印命令
-
Python
Python内置的logging模块是最常用的日志工具,支持多种级别和输出方式。- 基础用法:
import logging logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') logging.info("程序启动") # 输出INFO级别日志 logging.warning("内存使用率过高") # 输出WARNING级别日志 logging.error("文件读取失败") # 输出ERROR级别日志 - 日志级别:从低到高依次为
DEBUG、INFO、WARNING、ERROR、CRITICAL,可通过logging.basicConfig的level参数设置最低输出级别。 - 高级配置:可同时输出到文件和控制台,
logging.basicConfig(filename='app.log', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
- 基础用法:
-
Java
Java中常用的日志框架有Log4j、SLF4J和Logback,以SLF4J(接口)与Logback(实现)为例:- 依赖引入(Maven):
<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> - 代码示例:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Example { private static final Logger logger = LoggerFactory.getLogger(Example.class); public void run() { logger.info("服务开始运行"); // 输出INFO级别日志 logger.error("数据库连接异常", new SQLException("连接超时")); // 输出ERROR级别日志并记录异常堆栈 } } - 配置文件(
logback.xml):可定义日志文件路径、滚动策略等。
- 依赖引入(Maven):
-
JavaScript/Node.js
- 浏览器端:使用
console对象:console.log("普通信息"); // 输出日志 console.error("错误信息"); // 输出错误日志(红色高亮) console.warn("警告信息"); // 输出警告日志(黄色高亮) - Node.js:可结合
winston或pino等第三方库,例如winston:const winston = require('winston'); const logger = winston.createLogger({ level: 'info', format: winston.format.json(), transports: [ new winston.transports.File({ filename: 'error.log', level: 'error' }), new winston.transports.File({ filename: 'combined.log' }) ] }); logger.info("服务启动成功");
- 浏览器端:使用
系统级日志打印命令
-
Linux系统
(图片来源网络,侵删)logger命令:将文本发送到系统日志(如/var/log/syslog):logger "系统维护开始" # 记录到系统日志
journalctl命令(Systemd系统):查看或过滤日志:journalctl -u nginx.service # 查看nginx服务日志 journalctl --since "2023-10-01" --until "2023-10-02" # 查看指定时间范围的日志
-
Windows系统
eventcreate命令:创建自定义事件日志:eventcreate /ID 1 /L APPLICATION /T INFORMATION /SO "MyApp" /D "应用程序启动"
- PowerShell:使用
Write-EventLog:Write-EventLog -LogName Application -Source "MyApp" -EntryType Information -EventId 100 -Message "任务完成"
日志打印的最佳实践
-
日志级别选择:
DEBUG:调试信息,开发阶段使用。INFO:关键流程记录,如服务启动、重要参数。WARNING:潜在问题,如资源即将耗尽。ERROR:错误事件,需立即处理。CRITICAL:严重故障,如系统崩溃。
-
规范:
- 包含时间戳、日志级别、模块名称和上下文信息。
- 避免敏感数据(如密码、身份证号)。
- 错误日志需记录异常堆栈和输入参数。
-
性能优化:
(图片来源网络,侵删)- 避免在高频循环中使用
DEBUG级别日志(可通过动态调整日志级别减少开销)。 - 使用异步日志(如
Logback的异步Appender)避免阻塞主线程。
- 避免在高频循环中使用
日志打印命令对比表
| 场景 | 工具/命令 | 示例 | 特点 |
|---|---|---|---|
| Python日志 | logging模块 |
logging.info("处理完成") |
内置模块,支持多级别和文件输出 |
| Java日志 | SLF4J + Logback | logger.error("连接失败", e) |
功能强大,支持异步和滚动日志 |
| JavaScript日志 | console/winston |
console.warn("API超时") |
浏览器原生,Node.js需第三方库 |
| Linux系统日志 | logger/journalctl |
logger "备份开始" |
系统级日志,支持过滤和分析 |
| Windows事件日志 | eventcreate |
eventcreate /ID 1 /T INFORMATION /D "任务完成" |
可通过事件查看器管理 |
相关问答FAQs
Q1: 如何避免日志打印影响程序性能?
A: 可以通过以下方式优化:
- 使用动态日志级别(如通过配置文件或环境变量控制,生产环境关闭
DEBUG级别)。 - 采用异步日志框架(如
Logback的AsyncAppender),避免I/O操作阻塞主线程。 - 避免在日志中拼接复杂对象(如大JSON),直接记录关键标识符即可。
Q2: 如何将日志同时输出到控制台和文件?
A: 不同工具的实现方式不同:
- Python:在
logging.basicConfig中添加handlers参数:logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', handlers=[logging.FileHandler('app.log'), logging.StreamHandler()]) - Java(Logback):在
logback.xml中配置多个Appender:<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder><pattern>%d{HH:mm:ss} %-5level %msg%n</pattern></encoder> </appender> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>app.log</file> <encoder><pattern>%d{HH:mm:ss} %-5level %msg%n</pattern></encoder> </appender> <root level="INFO"> <appender-ref ref="CONSOLE"/> <appender-ref ref="FILE"/> </root> - Node.js(winston):配置多个传输目标:
const logger = winston.createLogger({ transports: [ new winston.transports.Console(), new winston.transports.File({ filename: 'app.log' }) ] });
