日志记录重定向到文件

                //打开文件

                fp = fopen("/mnt/sdcard/com.log", "at+");

                if(fp == NULL)
                {
                    perror("fopen:");
                    printf("fopen(/mnt/sdcard/com.log) err...\n");
                }

                //重定向文件

                oldstdout    = dup(STD_OUT);
                dup2(fileno(fp) , STD_OUT);
                oldstderr    = dup(STD_ERR);
                dup2(fileno(fp) , STD_ERR);


               //限定日志文件大小,大于限定值清空文件重写

               while(1)
               {
                int rc = ftell(fp);
                if(rc < 0)
                {
                    perror("ftell:");
                }
                if(rc > 10*1024)
                {
                    //还原重定向
                    dup2(oldstdout, STD_OUT);
                    close(oldstdout);
                    dup2(oldstderr, STD_ERR);
                    close(oldstderr);
                    fclose(fp);

                    //重定位标准输出,错误输出到fp

                    fp = fopen("/mnt/sdcard/com.log", "wb+");
                    if(fp == NULL)
                    {
                        perror("fopen:");
                        printf("fopen(/mnt/sdcard/com.log) err...\n");
                    }
                    rc = fseek(fp, 0, SEEK_SET);
                    if(rc < 0)
                    {
                        perror("fseek:");
                    }
                    oldstdout    = dup(STD_OUT);
                    //dup2(sock, STD_OUT);
                    dup2(fileno(fp) , STD_OUT);
                    oldstderr    = dup(STD_ERR);
                    //dup2(sock, STD_ERR);
                    dup2(fileno(fp) , STD_ERR);
                    rc = lseek(STD_OUT, 0, SEEK_SET);
                    if(rc < 0)
                    {
                        perror("lseek:");
                    }
                    rc = lseek(STD_ERR, 0, SEEK_SET);
                    if(rc < 0)
                    {
                        perror("lseek:");
                    }
                    printf("\n\n############# reset file pos 0 ####################\n\n");
                }
                sleep(3);
            }

该方案可用于设备日志系统,用于记录设备的运行情况,当设备出现异常后有完整的日志信息用于定位问题。


版权声明:本文为yuanbinquan原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。