您的位置:首页 > 运维架构 > Linux

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

2016-11-07 18:21 2091 查看
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 系统,测试可用。

================================
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: