几种常见的项目日志使用方法

目录

一、stdin/stdout/stderr

1、重定向

二、Log4cpp第三方库


一、stdin/stdout/stderr

在通常情况下,Linux/UNIX每个程序在开始运行的时刻,都会打开3个已经打开的stream. 分别用来输入,输出,打印诊断和错误信息。通常他们会被连接到用户终端。这3个句柄的类型为指向FILE的指针。可以被fprintf、fread等函数使用,他们在程序开始启动后,stdin, stdout, and stderr 的文件描述符是 0, 1和2,其它的文件描述符则排在其后。   

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

注意:stderr是不缓存的,stdout则进行行间缓存。接下来我们看下行间缓存的效果,请参考以下代码:

#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);
        
}

sleep(1);

for(int i = 0; i < 5; i++)
    {
        fprintf(stderr, "This is stderr[%d]", i);
        sleep(1);
    }


    return 0;
}

比较如下代码

#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]\n", i);
        sleep(1);
        
}

sleep(1);

for(int i = 0; i < 5; i++)
    {
        fprintf(stderr, "This is stderr[%d]\n", i);
        sleep(1);
    }


    return 0;
}

上面两端代码就是在打印的时候加上了"\n"而已,但是效果完全不一样。   

思考:很多时候我们会用printf打印信息来调试程序,但是如果终端关掉了,那怎么显示printf的调试信息呢?

1、重定向

我们来先看这段程序(文件名test.c):

#include <stdio.h>

int main(int argc, char** argv)
{
    printf("welcome to China!\n");
    fprintf(stdout, "I am Hello!\n");
    perror("are you all ready?\n");
    fprintf(stderr, "Hello always stay with you!\n");

    return 0;
} 

编译好后(gcc -o test test.c),我们试试下面不同的运行方式: ./test > test.txt

标准输出重定向到文件
./test 1 > testout.txt ./test 2 > testerr.txt

标准输出和标准出错重定向到文件
./test > test.txt 2>&1

当然除了使用“>”重定向外,我们还可以试下“>>”,>>是以附加的方式重定向到文件中,另外我们还可以在代码中实现重定向,比如:

#include <stdio.h>
 
int main(void)
{
    FILE *out = freopen("stdout.txt", "w", stdout);
    printf("%s\n", "hello verybody!!!");
 
    return 0;
}

总的来说,stdin,stdout和stderr还是和终端有密切关系,通常在生产环境时,会将这3个流重定向到其它文件。

如果我们实在要用printf或者fprintf去生成日志的话,最好还是加上这些信息,__FILE__ __LINE__ __FUNCTION__, __DATE__, __TIME__。

当然我们一定要明白,printf设计到文件,这会引起IO中断,因此执行printf比一般的指令的效率要低很多。

二、Log4cpp第三方库

参考我另两篇博客:

软件开发为什么写日志,怎样写日志,什么时候写日志?_开发日志需要写代码吗-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65635427/article/details/139831785?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522172059980316800213044640%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=172059980316800213044640&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-2-139831785-null-null.nonecase&utm_term=log4&spm=1018.2226.3001.4450

Linux和Windows(VS 2019)下安装使用Log4cpp日志库_log4cpp windows用法-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65635427/article/details/139833238?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522172059980316800213044640%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=172059980316800213044640&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-139833238-null-null.nonecase&utm_term=log4&spm=1018.2226.3001.4450

相关推荐

  1. Vue项目中禁用ESLint常见方法

    2024-07-11 10:12:01       15 阅读
  2. vue 项目常用import 书写 方式

    2024-07-11 10:12:01       45 阅读
  3. MySQL中常见日志类型【重点】

    2024-07-11 10:12:01       48 阅读
  4. DNS故障常见原因及解决方法

    2024-07-11 10:12:01       49 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-11 10:12:01       53 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-11 10:12:01       56 阅读
  3. 在Django里面运行非项目文件

    2024-07-11 10:12:01       46 阅读
  4. Python语言-面向对象

    2024-07-11 10:12:01       57 阅读

热门阅读

  1. 0124__Linux和Unix的Access.conf安全配置

    2024-07-11 10:12:01       17 阅读
  2. Android11 应用启动流程

    2024-07-11 10:12:01       22 阅读
  3. CentOS-6的iso下载地址镜像yum源

    2024-07-11 10:12:01       20 阅读
  4. 什么是CLR

    2024-07-11 10:12:01       17 阅读
  5. 获取线程id

    2024-07-11 10:12:01       16 阅读
  6. 小抄 20240709

    2024-07-11 10:12:01       16 阅读
  7. 24/07/10数据结构(5.1213)链表OJ

    2024-07-11 10:12:01       19 阅读
  8. VUE学习列表

    2024-07-11 10:12:01       21 阅读
  9. 手动安装Ruby 1.9.3并升级RubyGems

    2024-07-11 10:12:01       23 阅读
  10. uniapp APP端解决video seek跳转时间不准确的问题

    2024-07-11 10:12:01       17 阅读