【Linux】项目日志——输出重定向

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 【Linux】项目日志——输出重定向

项目日志——输出重定向

前言

在通常情况下,Linux/UNIX每个程序在开始运行的时候,都会自动打开三个标准stream(流),分别为标准输入流stdin(文件描述符0),标准输出流stdout(文件描述符1),标准错误输出流stderr(文件描述符2)。

Linux的本质就是一切皆文件,输入输出设备也是以文件形式存在和管理的。

  • stderr是不缓存的,stdout则进行行间缓存,即遇到\n才打印输出。示例如下:
#include <stdio.h>
#include <unistd.h>

int main(int argc, char** argv)
{
    for(int i = 0; i < 5; i++){
        fprintf(stdout, "This is stdout[%d]", i);
        sleep(1);
        
    }
    fprintf(stdout,"\n");//stdout
    sleep(1);

    for(int i = 0; i < 5; i++){
        fprintf(stderr, "This is stderr[%d]", i);
        sleep(1);
    } 
    sleep(60);
    return 0;
}
  • 可以发现,第一个循环(stdout)的内容会被一次性打印出来,第二个循环(stderr)的内容会一个一个的打印出来。

重定向

  • 有时我们使用printf来打印调试信息,但是如果终端关掉,我们就无法查看到信息了。
  • 所以需要我们保存在文件中,以便永久保存。

>

  • 将标准输出重定向到文件
./test > test.txt
  • 将标准输入和标准出错重定向到文件
./test 1 > testout.txt ./test 2 > testerr.txt

>>

  • 以附加方式重定向到文件
  • 例如:将标准输入和标准出错以追加的方式重定向到文件中
./test > test1.txt 2>&1

代码中实现重定向操作

#include <stdio.h>
int main(void){
    FILE *out = freopen("stdout.txt", "w", stdout);
    printf("%s\n", "redirect test");
    return 0;
}
  • 通常在生产环境下,会将stdin,stdout,stderr这三个流重定向到其他文件。
  • 日志中最好加上日期、时间、文件等信息。
  • printf涉及到文件,可能会引起IO中断(会进行一系列的系统调用),因此执行printf比一般指令的效率要低很多。一般情况下不建议用printf。
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
27天前
|
人工智能 监控 算法
3D-Speaker:阿里通义开源的多模态说话人识别项目,支持说话人识别、语种识别、多模态识别、说话人重叠检测和日志记录
3D-Speaker是阿里巴巴通义实验室推出的多模态说话人识别开源项目,结合声学、语义和视觉信息,提供高精度的说话人识别和语种识别功能。项目包含工业级模型、训练和推理代码,以及大规模多设备、多距离、多方言的数据集,适用于多种应用场景。
221 18
3D-Speaker:阿里通义开源的多模态说话人识别项目,支持说话人识别、语种识别、多模态识别、说话人重叠检测和日志记录
|
22天前
|
Java Maven
java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
在Java项目中,启动jar包时遇到“no main manifest attribute”错误,且打包大小明显偏小。常见原因包括:1) Maven配置中跳过主程序打包;2) 缺少Manifest文件或Main-Class属性。解决方案如下:
java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
|
12天前
|
消息中间件 Linux
Linux:进程间通信(共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量)
通过上述讲解和代码示例,您可以理解和实现Linux系统中的进程间通信机制,包括共享内存、消息队列和信号量。这些机制在实际开发中非常重要,能够提高系统的并发处理能力和数据通信效率。希望本文能为您的学习和开发提供实用的指导和帮助。
72 20
|
23天前
|
存储 运维 监控
Linux--深入理与解linux文件系统与日志文件分析
深入理解 Linux 文件系统和日志文件分析,对于系统管理员和运维工程师来说至关重要。文件系统管理涉及到文件的组织、存储和检索,而日志文件则记录了系统和应用的运行状态,是排查故障和维护系统的重要依据。通过掌握文件系统和日志文件的管理和分析技能,可以有效提升系统的稳定性和安全性。
44 7
|
26天前
|
监控 安全 Linux
启用Linux防火墙日志记录和分析功能
为iptables启用日志记录对于监控进出流量至关重要
|
2月前
|
监控 Linux 开发者
如何在 Linux 中优雅的使用 head 命令,用来看日志简直溜的不行
`head` 命令是 Linux 系统中一个非常实用的工具,用于快速查看文件的开头部分内容。本文介绍了 `head` 命令的基本用法、高级用法、实际应用案例及注意事项,帮助用户高效处理文件和日志,提升工作效率。
44 7
|
2月前
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
61 1
|
3月前
|
关系型数据库 MySQL Linux
基于阿里云服务器Linux系统安装Docker完整图文教程(附部署开源项目)
基于阿里云服务器Linux系统安装Docker完整图文教程(附部署开源项目)
741 3
|
3月前
|
监控 网络协议 安全
Linux系统日志管理
Linux系统日志管理
77 3
|
3月前
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
851 3