Linux C++ 打日志程序和获取上一级目录的程序

1.写程序,经常会需要打日志,往往可执行文件放在bin目录下,而log文件放在和bin目录同级的log目录下。

2.日志常常被要求,以时间作为日志文件名的开头。

3.日志里面的内容,每一行也必须要以时间戳开头,然后才是日志正文。


下面的代码,很好的实现了这几个功能。

不过,还是存在2个问题:

(1)不支持多线程打日志

(2)没有进行日志分级

以后,继续改进。


#include <cstdlib>
#include <string>
#include <stdio.h>
#include <string.h>
#include <string>
#include <iostream>

#define PROCESSNAME  "createxcel.log"
#define LOGBUFLEN 512
#define PATH_MAX 260

using namespace std;

//
//Description : 获取可执行文件的上一级目录
//
char* GetPath(){
    char dir[PATH_MAX] = {0}; 
    char syspath[PATH_MAX] = {0};
    int n = readlink("/proc/self/exe", dir, PATH_MAX);  
    
    const char *ptr;
    ptr = strrchr(dir, '/');
    
    int length = strlen(dir) - strlen(ptr);
    string s1(dir);
    string s2;
    s2 = s1.substr(0, length);
    memcpy(syspath, (char*)s2.data(), PATH_MAX);
    
    ptr = strrchr(syspath, '/');
    length = strlen(syspath) - strlen(ptr);
    s2 = s2.substr(0, length);
    
    cout << "dir     : " << dir << endl;
    cout << "syspath : " << syspath << endl;
    cout << "s2      : " << s2 << endl;
 
    return (char*)s2.data();
}


//
//Description :  (1)如果可执行文件的上一级目录,具有平级目录log,
//				    则在log文件夹下,以日期作为文件名开头来打日志。
//				    例如:2016-11-07_createxcel.log 
//		 (2)如果没有这个log文件夹,则会创建log文件夹
//
void WriteLog(const char* msg)
{
    char *sSysPath = GetPath();
    char buf[LOGBUFLEN];
    int i = 0;
    memset(buf, 0, LOGBUFLEN);
	memcpy(buf,msg,LOGBUFLEN);

    FILE* logfile=NULL;
	
    char logpath[256] = {0};	
    sprintf(logpath,"%s/log", sSysPath);
	
    if(access(logpath,0)!=0)
    {
        char cmdstr[256] = {0};
        sprintf(cmdstr,"mkdir -p %s",logpath);
        system(cmdstr);
    }

    char fname[256];
    char longtime[200];
    char daytime[40];
    time_t t;
    memset(fname,0,sizeof(fname));
    time(&t);
    struct tm local = {0};
    localtime_r(&t, &local);
    sprintf(longtime,"%04d-%02d-%02d %02d:%02d:%02d", local.tm_year+1900,
            local.tm_mon+1, local.tm_mday, local.tm_hour, local.tm_min, local.tm_sec);
    sprintf(daytime, "%04d-%02d-%02d", local.tm_year+1900,
            local.tm_mon+1, local.tm_mday);
    sprintf(fname,"%s/%s_%s", logpath, daytime, PROCESSNAME);
    for(i= 0; i < 3; i++)
    {
        logfile = fopen(fname, "a+");
        if(logfile)
            break;
        sleep(1);
    }
    if(logfile)
    {
		//日期时间
		const char* pTemp = longtime;
		fwrite(pTemp, 1, strlen(pTemp), logfile);
		fwrite(" ", 1, 1, logfile);
		//内容
		fwrite(buf, 1, strlen(buf), logfile);
		fwrite(" \r\n", 1, 3, logfile);
		fclose(logfile);
    }  
}


int main(int argc, char** argv) {
    WriteLog("hello 123");
    return 0;
}





CentOS 6.7 系统,测试可用。

================================

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值